?? 0703-0400.htm
字號:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<!-- saved from url=(0071)http://162.105.170.55/ASPs/GetLearningArticleTemp.asp?section=0703-0400 -->
<HTML><HEAD><TITLE>XML中國論壇 - 初學進階 - 7.3.4 位置步</TITLE>
<META http-equiv=Content-Type content="text/html; charset=gb2312">
<STYLE type=text/css>TABLE {
FONT-SIZE: 9pt; COLOR: black; LINE-HEIGHT: 15pt; FONT-FAMILY: "宋體"
}
.pt9 {
FONT-SIZE: 9pt; COLOR: black; LINE-HEIGHT: 15pt; FONT-FAMILY: "宋體"
}
.pt10 {
FONT-WEIGHT: 700; FONT-SIZE: 10pt; LINE-HEIGHT: 18pt; FONT-FAMILY: "宋體"
}
.TempOutline {
FONT-SIZE: 9pt; MARGIN-LEFT: 15pt; COLOR: #666666; TEXT-INDENT: -28pt; LINE-HEIGHT: 15pt; FONT-FAMILY: "宋體"; TEXT-DECORATION: none
}
.TempOutline1 {
FONT-SIZE: 9pt; MARGIN-LEFT: 24pt; COLOR: #666666; TEXT-INDENT: -36pt; LINE-HEIGHT: 15pt; FONT-FAMILY: "宋體"; TEXT-DECORATION: none
}
.Outline {
FONT-SIZE: 9pt; MARGIN-LEFT: 15pt; TEXT-INDENT: -28pt; LINE-HEIGHT: 15pt; FONT-FAMILY: "宋體"; TEXT-DECORATION: none
}
.Outline1 {
FONT-SIZE: 9pt; MARGIN-LEFT: 24pt; TEXT-INDENT: -36pt; LINE-HEIGHT: 15pt; FONT-FAMILY: "宋體"; TEXT-DECORATION: none
}
.Outline11 {
FONT-SIZE: 9pt; MARGIN-LEFT: 38pt; TEXT-INDENT: -50pt; LINE-HEIGHT: 15pt; FONT-FAMILY: "宋體"; TEXT-DECORATION: none
}
.passage0 {
FONT-SIZE: 9pt; MARGIN-LEFT: 15pt; TEXT-INDENT: -28pt; LINE-HEIGHT: 15pt; FONT-FAMILY: "宋體"; TEXT-DECORATION: none
}
.passage1 {
FONT-SIZE: 9pt; MARGIN-LEFT: 24pt; TEXT-INDENT: -36pt; LINE-HEIGHT: 15pt; FONT-FAMILY: "宋體"; TEXT-DECORATION: none
}
.passage11 {
FONT-SIZE: 9pt; MARGIN-LEFT: 38pt; TEXT-INDENT: -50pt; LINE-HEIGHT: 15pt; FONT-FAMILY: "宋體"; TEXT-DECORATION: none
}
.passage111 {
FONT-SIZE: 9pt; MARGIN-LEFT: 51pt; TEXT-INDENT: -64pt; LINE-HEIGHT: 15pt; FONT-FAMILY: "宋體"; TEXT-DECORATION: none
}
</STYLE>
<META content="Microsoft FrontPage 5.0" name=GENERATOR></HEAD>
<BODY vLink=#000000 aLink=#000000 link=#000000 leftMargin=0 topMargin=0
onload=""><!-- 以下為主體內容 -->
<div align="center">
<center>
<TABLE width="100%" border=0 style="border-collapse: collapse" bordercolor="#111111" cellpadding="0" cellspacing="0">
<TBODY>
<TR vAlign=top>
<TD width=41 rowSpan=2></TD>
<TD vAlign=center width="549" >
<p align="center"><IMG height=33
src="image/title_learner.gif" width=226></TD>
<TD width=41 rowSpan=2></TD>
</TR>
<TR vAlign=top>
<TD width="549" ><!-- 正文內容 -->
<DIV class=pt10><B>7.3.4 位置步</B></DIV>
<DIV></DIV><BR>
<DIV class=pt9>
<P>位置步用于表示一個相對于已知位置的位置,這個已知位置可能是一個絕對位置,也可能是一個計算結果,由所處的上下文(context)決定,這個位置稱為上下文節點(context
node)。如前所述,位置步的構成包括三個部分:
<UL>
<LI>關鍵字,有且僅有一個,用于表示結果節點與上下文節點在文件樹中的關系;
<LI>節點測試,有且僅有一個,用于表示結果節點的類型或擴展名;
<LI>謂詞,零到多個,用于限制結果的任意表達式。 </LI></UL>
<P>位置步首先利用關鍵字和節點測試計算,得到初始結果集,然后依次利用謂詞進行過濾。初始結果集中滿足所有謂詞的就是返回結果。初始結果集中的元素與上下文節點構成關鍵字關系,而且具有節點測試指定的類型或名稱,例如child::sepc表示上下文節點的所有sepc子元素。在對初始結果集進行過濾時,首先用第一個謂詞對初始結果集進行過濾,返回一個結果集,在此基礎上利用第二個謂詞過濾,依次類推,直到得到最后的結果集。
<OL>
<LI><STRONG>關鍵字</STRONG> </LI></OL>
<P>前面的例子提到了幾個關鍵字child、descendent,其他的關鍵字還有ancestor、self、ancestor-or-self、paren、descendant-or-self、attribute、following、preceding、following-sibling、preceding-sibling等,它們的含義與XPath中的對應關鍵字一樣,請讀者參考4.3.3節,這里不再贅述。這些關鍵字的返回結果總是節點或節點構成的集合,節點的類型可以是元素、屬性、注釋、文本、處理指令等,但不能是命名空間。</P>
<P>由于位置步總是計算相對于上下文節點的位置,因此需要一個絕對位置,表示第一個位置步的上下文節點。關鍵字的運算取決于上下文節點,如果上下文節點有多個,它將對上下文節點逐一進行計算。XPointer可以利用XPath的絕對位置定位方法進行定位,包括利用"/"表示根節點和用id()表示具有給定ID值的元素。</P>
<P>關鍵字具有自己的基本節點類型,基本節點類型主要用于節點測試。對于那些可以包含元素的關鍵字,如child、parent等,其基本節點類型為元素類型,在上面提到的12個關鍵字中,除了attribute以外,其他關鍵字的基本節點類型都是元素類型。而關鍵字attribute關鍵字的基本節點類型是屬性類型。
<OL start=2>
<LI><STRONG>節點測試</STRONG> </LI></OL>
<P>節點測試用于測試節點類型或節點名稱,只有那些滿足節點測試的節點才會保留在初始的結果集中,以待下一步的謂詞過濾。</P>
<P>在很多情況下,節點測試是一個名稱,此時要求候選節點的類型與關鍵字的基本節點類型相同,并且具有指定的名稱。因此對除attribute以外的關鍵字,如果節點測試是一個名稱,結果將返回一個具有指定名稱的元素集合,而對attribute關鍵字,同樣的節點測試將返回具有指定名稱的屬性。例如:child::sepc返回上下文節點內的所有名為sepc的子節點,如果上下文節點沒有名為sepc的子節點,結果將返回空集;而attribute::href將返回上下文節點的href屬性,類似地,如果上下文節點不包括href屬性,結果也會返回空集。</P>
<P>其他的節點測試還有:
<UL>
<LI>*;
<LI>node();
<LI>comment();
<LI>processing-instruction();
<LI>text(); </LI></UL>
<P>通配符*表示所有的元素,它不考慮元素的名稱,只要元素與上下文節點滿足關鍵字所指定的關系即可,例如child::*表示上下文節點的所有子節點。通配符*只選擇元素類型。如果你希望選擇所有節點,可以用node()表示。通配符*還可用于名稱內部,用于過濾特定命名空間的元素和屬性。比如:</P>
<DIV align=center>
<CENTER>
<TABLE width="80%" border=1>
<TBODY>
<TR>
<TD
width="100%">child::*:spec<BR>attribute::xlink:*</TD></TR></TBODY></TABLE></CENTER></DIV>
<P>上面的第一個例子表示上下文節點內所有命名空間下名為spec的所有子元素,第二個例子表示上下文節點的所有xlink屬性。</P>
<P>節點測試node()表示所有類型的節點,包括元素、注釋、文本、處理指令等。node()不接收參數。例如,/self::node()表示文件的根節點。</P>
<P>節點測試還可以是comment()、text()、processing-instruction(),表示節點的類型是注釋、文本或處理指令,comment()和text()不接收參數,processing-instruction()可以接收參數,如/descendent::processing-instruction(
xml-stylesheet
)表示文件中以<?xml-stylesheet打頭的處理指令。沒有參數的processing-instruction()表示不對處理指令的名稱作限制。由于注釋、文本和處理指令類型的節點都不包含屬性和元素,因此不能在包含這幾個節點測試的位置步后,添加查找屬性或者元素的位置步。如"/descendent::processing-instruction(
xml-stylesheet )/attribute::href"就不是一個合法的位置路徑。
<OL>
<LI type=disc value=3><STRONG>謂詞</STRONG> </LI></OL>
<P>XPointer位置步可以包括零個或多個謂詞對結果集進行過濾。它將不滿足謂詞條件的候選節點過濾掉,關鍵字和節點測試首先確定候選節點的列表,謂詞在其中選取最后的結果。其實,節點測試可以看成是謂詞的特例。</P>
<P>一般來說,謂詞應該是一個布爾表達式,它對每個候選節點計算表達式的值,如果返回值為真,則該節點滿足謂詞,從而被保留在結果集中,否則節點將從結果集中刪除。但有時謂詞的計算結果不是一個布爾表達式,返回值可能是字符串、數字、節點集合等。XPointer將返回結果轉換為布爾值以確定候選節點是否滿足謂詞。
<UL>
<LI>非0數字轉換為true,數字0和NaN轉換為false,NaN是"Not a
Number"的簡寫,常用于表示被0除或其他非法運算的結果;
<LI>非空節點集合轉換為true,否則轉換為false;
<LI>非空節點片斷轉換為true,否則轉換為false;
<LI>長度不為0的字符串(包含字符串"false")轉換為true,否則轉換為false; </LI></UL>
<P>XPointer中,最常用和最重要的謂詞是表示位置的謂詞,XPointer包括幾個謂詞函數position()、last()等。position()表示節點在結果列表中的序號,序號從1開始。該函數常與數字連用,中間用關系運算符=、<>、<、<=、>、>=連接,表示結果節點的位置序號與指定數字滿足指定關系運算符。由于position()函數使用非常普遍,XPointer提供了一種簡寫形式,謂詞[position()=n]可以簡寫為[n]。last()表示列表的節點數目,由于last()的結果是個數字,因此它也可與position()函數連用。此外,謂詞中還可以包括位置步,它對謂詞中的位置步進行計算,該位置步的上下文節點是當前的上下文節點。如果返回集合為空,則謂詞計算結果為false,否則為true,甚至還可以用count()對位置步進行計數。下面給出幾個例子:</P>
<DIV align=center>
<CENTER>
<TABLE width="80%" border=1>
<TBODY>
<TR>
<TD align=middle width="50%"><STRONG>位置步</STRONG></TD>
<TD align=middle width="50%"><STRONG>含 義</STRONG></TD></TR>
<TR>
<TD width="50%">xpointer(/descendant::sepc[postion()=2])</TD>
<TD width="50%">文件中第2個sepc元素</TD></TR>
<TR>
<TD width="50%">xpointer(id("_loc")/child::sepc[postion()>=2])</TD>
<TD width="50%">ID值為"_loc"的元素的第2個及其以后的sepc子元素。</TD></TR>
<TR>
<TD
width="50%">xpointer(id("_loc")/ancestor::*[postion()=last()])</TD>
<TD width="50%">文件中ID值為"_loc"的元素的最外層的包含元素,顯然應該是文件的根元素。</TD></TR>
<TR>
<TD width="50%">xpointer(/descendant::attribute[ID="_loc"])</TD>
<TD width="50%">查找文件中所有值為_loc的ID屬性。</TD></TR>
<TR>
<TD width="50%">xpointer(/descendant::customer[child::car])</TD>
<TD width="50%">文件中包含car子元素的所有customer元素。</TD></TR>
<TR>
<TD
width="50%">xpointer(/descendant::customer[count(child::car)>1])</TD>
<TD
width="50%">文件中包含兩個以上car子元素的所有customer元素。</TD></TR></TBODY></TABLE></CENTER></DIV></DIV>
<P></P>
<P></P></TD></TR></TBODY></TABLE>
</center>
</div>
<P></P>
<P>
<P></P></BODY></HTML>
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -