XML 路徑語言(XPath) 版本 1.0

1 緒論

XPath 是努力給 XSL 轉換[XSLT]和 XPointer [XPointer]的共享功能提供一個共用的句法及語義的結果。XPath的主要的目是用於對 XML [XML]文檔元件尋址。在支持這個主要目的的同時,它也爲字符串,數字和布爾的操作提供了基本手段。XPath 使用簡明的、非 XML 句法以便於在 URIs 和 XML 屬性值以內使用 XPath,XPath 對 XML 文檔的抽象的、邏輯的結構而非它的表面句法進行操作,XPath 的名字源於它在 URL 中用作對 XML 文檔的層次的結構進行導航一個路徑標誌。

除了用做尋址外,XPath 也被設計成以便它有能被用於匹配的一個自然的子集(測試一個節點是否匹配一個模式);XSLT中描述了 XPath 在這方面的使用。

XPath 將一個 XML 文檔建模成爲一棵節點樹,有不同類型的節點,包括元素節點,屬性節點和正文節點。XPath 定義了一種方法來計算每類的節點的字串值。一些節點的類型也有名字。XPath 充分支持 XML 命名空間[XML Names]。這樣,節點的名字被建模成由一個局城部分和可能爲空的命名空間 URI 組成的對;這被稱爲擴展名5 數據模型描述了數據模型詳細細節。

XPath的主要語法構件是表達式,一個表達式匹配產生式 Expr,一個表達式被求值評估產出一個對象,該對象有下列 4 種基本的類型之一:

節點集合(無序的、無重複的節點集合)
布爾(真或假)
數字(一個浮點數字)
字符串(UCS 字符的順序)

表達式求值發生與上下文有關。XSLT 和 XPointer 分別地指定了上下文怎樣在 XSLT 和 XPointer 使用 XPath 表達式。上下文組成包括:

一個節點([定義上下文節點])
一對非零正整數([定義上下文位置]和[定義上下文大小])
一個變量綁定的集合
一個函數庫
表達式範圍內的命名空間聲明的集合

上下文位置總是小於或等於上下文的大小。

綁定由從變量名到變量值映射組成,一個變量的值是一個對象,它的類型可以是任何表達式的值可能的類型,並且也可以有這裏沒指定的另外的類型。

函數庫由從函數名到函數的映射組成,每個函數可接受零個或零個以上的參數並且返回單個的結果。本文檔定義了所有的 XPath 實現必須支持的一個核心函數庫(參看4 核心函數庫)。對於核心函數庫中的每一個函數,參數和結果有4種基本的類型。XSLT 和 XPointer 通過定義另外的函數來擴展 XPath 的函數;這些函數有些對 4 種基本的類型操作,其它的則對 XSLT 和 XPointer 定義的另外的數據類型操作。

命名空間聲明由從前綴到命名空間 URI 的映射組成。

變量綁定、函數庫及命名空間聲明對於求表達式或其子表達式的值總是一樣的;上下文節點、上下文位置及大小對於求表達式或其子表達式的值則是不同的。有多種表達式可改變上下文節點,而只有判定詞能改變上下文位置和上下文大小(參看2.4 判定詞)。在描述一種表達式的求值時,必須總是明確地說明是上下文節點、上下文位置、還是上下文的大小對子表達式的求值產生變化,如果沒有關於上下文節點、上下文位置、上下文的大小的說明,那麼對那種表達式的子表達式的求值就保持不變。

XPath 表達式經常出現在 XML 屬性裏,在本節中說明的語法適用於在 XML 1.0 規範化以後的屬性值。因此,如果語法要使用字符 <,而該字符卻絕對不能以 < 出現在任何的 XML 資料中,這樣必須遵循 XML 1.0 的規則,也就是應鍵入成 &lt;。在表達式以內,文字的字符串由單引號或雙引號來界定,它也用於界定 XML 屬性。爲了避免 XML 處理器將表達式中的引號解釋成屬性界定符,引號可以鍵入成字符參考( &quot;&apos; )。做爲選擇,如果 XML 屬性使用雙引號,表達式則可以使用單引號,反之亦然。

一種重要的表達式類型是地點路徑,地址路徑選擇與上下文節點相關的節點集合。對是地址路徑的表達式求值的結果是節點集合,該節點集合包含地點路徑選擇的節點。地址路徑能遞歸地包含表達式,這些表達式用來過濾節點集合。地址路徑與此同時LocationPath 相匹配。

在下列語法裏,非終結的 QNameNCName 定義在[XML Names]中,而S定義在[XML]中。語法與[XML]一樣使用 EBNF 符號表示法(除了總是以大寫字母起頭的語法符號)。

分析表達式時,首先將字符字符串分解成分割段(token),然後再分析所得分割段結果的序列。空白符能自由地在分割段之間被使用。分段化(tokenization)過程在3.7 詞法結構中描述。

2 地址路徑

儘管地址路徑不是本語言中最完整的語法的構件(地址路徑 LocationPathExpr 的一個特殊的例子),他們卻是最重要的構件,因此,將首先進行描述。

每一條地址路徑都能使用直觀但是相當冗長的句法表示,同時也有很多縮簡句法可用以簡明地表示常見路徑。這節將解釋使用未經縮寫的句法的地址路徑的語義。然後將通過顯示縮簡的句法怎擴展成未經縮寫的句法來解釋縮簡句法(看2.5 縮簡句法)。

這是使用未經縮寫的句法的地址路徑的一些例子:

  • child::para 選擇上下文節點的 para 元素孩子

  • child::* 選擇上下文節點的所有元素孩子

  • child::text() 選擇上下文節點的所有的正文節點

  • child::node() 選擇上下文節點的所有的孩子,而不論它們是什麼節點類型

  • attribute::name 選擇上下文節點的 name 屬性

  • attribute::* 選擇上下文節點的所有的屬性

  • descendant::para 選擇上下文節點的 para 元素子孫

  • ancestor::div 選擇上下文節點的 div 祖先

  • ancestor-or-self::div 選擇上下文節點的 div 祖先,並且,如果上下文節點爲 div 元素,則該上下文節點也被選擇

  • descendant-or-self::para 選擇上下文節點中所有的 div 元素子孫,而且,如果上下文節點是一個 div 元素,則該上下文節點也被選擇

  • self::para 如果上下文節點是一個 para 元素,選擇該上下文節點,否則不選擇任何東西

  • child::chapter/descendant::para 選擇上下文節點的 chapter 元素孩子的所有的 para 元素子孫

  • child::*/child::para 選擇上下文節點的所有的 para 孫子

  • / 選擇文檔根(它總是是文檔元素的父)

  • /descendant::para 選擇在同一文檔中所有的 para 元素作爲上下文節點

  • /descendant::olist/child::item 選擇在同一文檔中所有的以 olist 爲父的 item 元素作爲上下文節點

  • child::para[position()=1] 選擇上下文節點的第一個 para 孩子

  • child::para[position()=last()] 選擇上下文節點的最後一個 para 孩子

  • child::para[position()=last()-1] 選擇上下文節點的倒數第二個 para 孩子

  • child::para[position()>1] 選擇上下文節點中除第一個以外所有的 para 孩子

  • following-sibling::chapter[position()=1] 選擇上下文節點的下一個 chapter 兄弟

  • preceding-sibling::chapter[position()=1] 選擇上下文節點的前一個 chapter 兄弟

  • /descendant::figure[position()=42] 選擇文檔中第四十二個 figure 元素

  • /child::doc/child::chapter[position()=5]/child::section[position()=2] 選擇文檔元素 doc 的第五個 chapter 的第二個 section

  • child::para[attribute::type='warning"] 選擇的上下文節點中有屬性 type 且值爲 warningpara 孩子

  • child::para[attribute::type='warning'][position()=5] 選擇的上下文節點中所有的有屬性 type 且值爲 warningpara 孩子中第五個孩子

  • child::para[position()=5][attribute::type="warning"] 選擇的上下文節點中第五個 para 孩子,如果該孩子有 type 屬性且值爲 warning 的話

  • child::chapter[child::title='Introduction'] 選擇的上下文節點的 chapter 孩子,這些孩子有一個或一個以上字串值等於 Introductiontitle 孩子

  • child::chapter[child::title] 選擇的上下文節點中有一個或一個以上 title 孩子的 chapter 孩子

  • child::*[self::chapter or self::appendix] 選擇上下文節點的 chapterappendix 孩子

  • child::*[self::chapter or self::appendix][position()=last()] 選擇上下文節點的最後一個 chapterappendix 孩子

地址路徑有兩種:相對的地址路徑和絕對的地址路徑。

相對的地址路徑由以 / 分開的一個或多個地點步進序列組成。在相對地址路徑中的步進是從左到右組成。每一步進依次選擇相對於上下文節點的節點集。步進的初始的序列以如下所述的方式與後續的步進組成在一起。步進的初始的序列選擇相對於上下文節點的節點集,該集合的每一節點成爲後續步進的上下文節點。由步進確定的節點的集合是聯合在一起的。由合成的步進確定的節點的集合也是這樣的聯合。例如,child::div/child::para 選擇了上下文節點的所有 div 元素孩子的所有 para 元素孩子,或者換句話說,選擇了上下文節點中所有有以 div 爲父 para 元素孫子。

絕對的地址路徑由 / 及緊隨其後的作爲可選項的一條相對地址路徑組成。 / 本身選擇以包含上下文節點的文檔的根節點,如果它帶着相對的地址路徑,該地址路徑選擇的節點集合則由相對於包含上下文節點的文檔的根節點相對地址路徑來確定。

地址路徑
[1]    LocationPath    ::=    RelativeLocationPath
      | AbsoluteLocationPath
[2]    AbsoluteLocationPath    ::=    '/' RelativeLocationPath?
      | AbbreviatedAbsoluteLocationPath
[3]    RelativeLocationPath    ::=    Step
      | RelativeLocationPath '/' Step
      | AbbreviatedRelativeLocationPath

2.1 地點步進

一個地點步進有三個部分:

  • 一個軸,它指定了地點步進選擇的節點與上下文節點之間樹狀關係,

  • 一個節點測試,它指定地點步進選擇的節點的節點類型以及節點擴展名擴展名,和

  • 零個或零個以上的判定詞,它使用專有的表達式進一步細化地點步進選擇的節點集合。

地點步進的句法是由兩個冒號分開的軸名和節點測試,其後可跟隨零個或零個以上在方括符內的表達式。例如,在 child::para[position()=1] 中,child 是軸名,para 是節點測試而 [position()=1] 則是判定詞。

由地點步進選擇的節點集合是源於從軸和節點測試產生初始的節點集合,然後再由各個判定詞的依次過濾後的節點集合。

初始的節點集合的節點組成,這些節點與上下文節點關係由軸指定的,其節點類型及擴展名由節點測試指定。例如,地點步進 descendant::para 選擇上下文節點的 para 元素子孫: descendant 指定在初始的節點集合中的那每一個節點都必須是該上下文的一個子孫; para 指定在初始的節點集合中的每一個節點都必須是 para 元素。2.2 軸說明了所有可能的軸。2.3 節點測試則說明了所有可能的節點測試。一些節點測試的含意依賴於軸。

初始的節點集合由第一個判定詞過濾後產生一新的節點集合,新的節點集合再由第二個判定詞進行過濾,如此一直下去。最後的節點集合是由地點步進選擇的節點集合。軸影響在每個判定詞中的表達式怎麼被求值,並且因此判定詞的語義定義與軸關於。參看2.4 判定詞

地點步進
[4]    Step    ::=    AxisSpecifier NodeTest Predicate*
      | AbbreviatedStep
[5]    AxisSpecifier    ::=    AxisName '::'
      | AbbreviatedAxisSpecifier

2.2 軸

以下是可用到的軸:

  • child 軸包含上下文節點的孩子

  • descendant 軸包含上下文節點的子孫;子孫是一個孩子或一個孩子的一個孩子,等等,這樣,子孫軸從來不包含屬性或命名空間節點

  • parent 軸包含上下文節點的父,如果有的話

  • ancestor 軸包含上下文節點的祖先;上下文節點的祖先由上下文節點的父以及父的父等等組成;這樣,祖先軸將總是包括根節點,除非上下文節點是根節點

  • following-sibling 軸包含上下文節點的所有在其後的兄弟,如果上下文節點是屬性節點或命名空間節點,following-sibling 軸則爲空

  • preceding-sibling 軸包含上下文節點的所有在其前的兄弟,如果上下文節點是屬性節點或命名空間節點,preceding-sibling 軸則爲空

  • following 軸包含在上下文節點所在的同一文檔中,所有依照文檔順序在上下文節點後的節點,但排除所有的子孫,也排除屬性節點以及命名空間節點

  • preceding 軸包含在上下文節點所在的同一文檔中,所有依照文檔順序在上下文節點前的節點,但排除所有的子孫,也排除屬性節點以及命名空間節點

  • attribute 軸包含上下文節點的屬性,除非上下文節點是元素,該軸將爲空

  • namespace 軸包含上下文節點的命名空間節點,除非上下文節點是元素,該軸將爲空

  • self 軸只是包含上下文節點自己

  • descendant-or-self 軸包含上下文節點和上下文節點的子孫

  • ancestor-or-self 軸包含上下文節點和上下文節點的祖先;這樣,該軸將總是包括根節點

注意:

ancestordescendantfollowingpreceding 以及 self 軸劃分了一個文檔(忽略屬性和命名空間節點):他們相互不重疊,而且他們組在一起則包含了文檔所有的節點。

[6]    AxisName    ::=    'ancestor'
      | 'ancestor-or-self'
      | 'attribute'
      | 'child'
      | 'descendant'
      | 'descendant-or-self'
      | 'following'
      | 'following-sibling'
      | 'namespace'
      | 'parent'
      | 'preceding'
      | 'preceding-sibling'
      | 'self'

2.3 節點測試

定義:每個軸都有一個基本節點類型。如果軸能包含元素,基本的節點類型則是元素;否則,它的類型是軸能包含的節點的類型。]因此,

對於屬性軸來說,基本的節點類型是屬性。
對於命名空間軸,基本的節點類型是命名空間。
對於其它的軸,基本的節點類型是元素。

當且僅當節點的類型(參看5 數據模型)是基本類型且擴展名等於由 QName 指定的擴展名時,爲 QName 節點測試才爲真。例如,child::para 選擇了上下文節點的 para 元素孩子,如果上下文節點沒有 para 孩子,它將選擇節點的一個空集合;attribute::href 選擇了上下文節點的 href 屬性,如果上下文節點沒有 href 屬性,它將選擇節點的一個空集合。

使用來自表達式的上下文的命名空間聲明,在節點測試裏的 QName 可擴展成擴展名。這與在起始及結束標籤中元素類型名稱的擴展方法一樣,除了缺省的 xmlns 命名空間申明無須使用外:如果 QName 沒有前綴,則命名空間 URI 爲空 (這與屬性名字擴展的方法一樣)。如果 QName 有前綴,而表達式上下文中卻沒有命名空間聲明,則是一個錯誤。

對於基本節點類型的任何節點,節點測試 * 都爲真。例如,child::* 將選擇上下文的所有的元素孩孩子,而 attribute::* 將選擇上下文節點的所有的屬性。

節點測試可以用格式 NCName:*。在這種情況下,前綴就以與 QName 一樣的方法被擴展,即使用上下文命名空間聲明。在表達式上下文的前綴如果沒有命名空間聲明,則是一個錯誤。不論名字的局域部分,對於基本類型的任何節點,如果其擴展名有命名空間 URI 將其前綴擴展,節點測試永爲真。

對於任何正文節點,節點測試 text() 爲真。例如,child::text() 將選擇上下文節點的正文節點孩子。同樣,對於註釋節點,節點測試 comment() 爲真;對於處理指令,節點測試 processing-instruction() 爲真; processing-instruction() 測試可以有一個字面量 Literal 的參數,在這種情況下,對於所有的處理指令,如指令名與字面量值 Literal 相等,其值爲真。

對於任何節點,無論其類型,節點測試 node() 爲真。

 
[7]    NodeTest    ::=    NameTest
      | NodeType '(' ')'
      | 'processing-instruction' '(' Literal ')'

2.4 判定詞

一個軸不是前進軸就是倒轉軸。前進軸是依文本順序在任何時候都僅僅包含上下文節點或在上下文節點以後的節點的軸。倒轉軸是依文本順序在任何時候都僅僅包含上下文節點或在文檔順序在上下文節點前的節點的軸。因此,ancestorancestor-or-selfprecedingpreceding-sibling 軸是倒轉軸;所有的其餘的軸都是前進軸。由於 self 軸總是至多包含一個節點,它是前進軸或是倒轉軸都不造成任何差別。軸的節點集合的成員的[定義鄰近位置對前進軸是按文檔順序的節點集合是節點的位置,對倒轉軸是按文檔反序的節點集合是節點的位置。第一個的位置是1。]

判定詞依照軸過濾節點集合來生成新的節點集合。對於被過濾的節點集合裏的每節點,PredicateExpr 將該節點作爲上下文節點來求值,以節點集合的節點數爲上下文大小,以依照在節點集合中節點的鄰近位置爲上下文位置,如果對節點 PredicateExpr 的求值爲真,新的節點集合就包括該節點;否則就不包括。

PredicateExpr 求值是通過先求 Expr 的值並把結果轉換成布爾值而來的。如果結果是一數字且該數字與上下文位置相等,結果將被轉變爲真;否則爲假。如果結果不是一個數字,然後結果將被變換成好像調用過函數 boolean 後的結果。這樣地址路徑 para[3] 等價 para[position()=3]

判定詞(Predicates)
[8]    Predicate    ::=    '[' PredicateExpr ']'
[9]    PredicateExpr    ::=    Expr

2.5 縮簡句法

這是一些使用縮簡句法的地址路徑例子:

  • para 選擇上下文節點的 para 元素孩子

  • * 選擇上下文節點的所有的元素孩子

  • text() 選擇上下文節點的所有的正文節點孩子

  • @name 選擇上下文節點的 name 屬性

  • @* 選擇上下文節點的所有的屬性

  • para[1] 選擇上下文節點的第一個 para 孩子

  • para[last()] 選擇上下文節點的最後一個 para 孩子

  • */para 選擇上下文節點的所有的 para 孫子

  • /doc/chapter[5]/section[2] 選擇doc的第五個 chapter 的第二個 section

  • chapter//para 選擇上下文節點的 chapter 元素孩子的所有 para 元素子孫

  • //para 選擇文檔根的所有的 para 子孫,也就是選擇上下文節點所在的文檔中所有的 para 元素

  • //olist/item 選擇上下文節點所在的文檔中所有的以 olist 爲父的 item 元素

  • . 選擇上下文節點

  • .//para 選擇上下文節點的 para 元素子孫

  • .. 選擇上下文節點的父

  • ../@lang 選擇上下文節點的父的 lang 屬性

  • para[@type="warning"] 選擇的上下文節點的所有的有屬性 type 且值爲 warningpara 孩子

  • para[@type="warning"][5] 選擇的上下文節點的所有的有屬性 type 且值爲 warningpara 孩子中的第五個

  • para[5][@type="warning"] 選擇的上下文節點的第五個 para 孩子如果該節點有屬性 type 且值爲 warning 的話

  • chapter[title="Introduction"] 選擇上下文節點的 chapter 孩子如果它有一個或多個 title 孩子且字串值Introduction

  • chpater[title] 選擇的上下文節點中有一個或一個以上 title 孩子的 chpater 孩子

  • employee[@secretary and @assistant] 選擇上下文節點的所有既有 secretary 屬性又有 assistant 屬性的 employee 孩子

最重要的縮寫是 child:: 能從地點步進省略掉。實際效果上,child 是缺省軸。例如,地址路徑 div/parachild::div/child::para 的縮寫。

屬性也有縮寫形式: attribute:: 能被縮寫成 @。例如,地址路徑 para[@type="warning"]child::para[attribute::type="warning"] 的縮寫,也就是選擇有 type 屬性且屬性值爲 warningpara 孩子。

///descendant-or-self::node()/ 的縮寫。例如,//para/descendant-or-self::node()/child::para 的縮寫,因此選擇文檔中所有的 para 元素(即使 para 元素是文檔元素,也會被 //para 所選擇,因爲文檔元素是根節點的孩子); div//paradiv/descendant-or-self::node()/child::para 的縮寫,因此將選擇 div 孩子的所有 para 子孫。

注意:

地址路徑 //para[1] 與地址路徑 /descendant::para[1] 的含意不一樣,後者選擇第一個 para 元素子孫,前者選擇是他們的父的第一 para 孩子的所有的子孫 para 元素。

地點路進 .self::node() 的縮寫。這與 // 一起使用特別有用。例如,地址路徑 .//paraself::node()/descendant-or-self::node()/child::para 的縮寫,因此將選擇上下文節點的所有的 para 子孫元素。

同樣,地址路徑 ..parent::node() 的縮寫。例如,../titleparent::node()/child::title 的縮寫因此這將選擇上下文節點的父的 title 孩子。

縮寫
[10]    AbbreviatedAbsoluteLocationPath    ::=    '//' RelativeLocationPath
[11]    AbbreviatedRelativeLocationPath    ::=    RelativeLocationPath '//' Step
[12]    AbbreviatedStep    ::=    '.'
      | '..'
[13]    AbbreviatedAxisSpecifier    ::=    '@'?

3 表達式

3.1 基礎

VariableReference 求值成變量名是綁定到在上下文中變量綁定的集合。如果變量名沒有與在上下文中變量綁定的集合中的變量綁定在一起,則是一個錯誤。

括號可以用於分組。

 
[14]    Expr    ::=    OrExpr
[15]    PrimaryExpr    ::=    VariableReference
      | '(' Expr ')'
      | Literal
      | Number
      | FunctionCall

3.2 函數調用

函數調用 FunctionCall 表達式的求值是通過使用函數名 FunctionName 在表達式求值上下文函數庫中確相應的函數,求各個參數 Argument 的值,將每個參數轉換成該函數所需的類型,最後,調用函數,並傳遞轉換後的參數。如果參數的數目不對的或參數不能被變換到要求的類型,則是一個錯誤。

表達式 FunctionCall 的結果是由函數返回的結果。

參數被變換成字符串類型時,彷彿調用了字符串函數 string;參數被變換成數字類型時,好像調用了數字函數 number;參數被變換成布爾的類型時,好像調用了布爾函數 boolean。不是類型節點集合 node-set 的參數不能被變換成節點集合 node-set。

 
[16]    FunctionCall    ::=    FunctionName '(' ( Argument ( ',' Argument )* )? ')'
[17]    Argument    ::=    Expr

3.3 節點集合

地址路徑能作爲表達式使用。表達式返回路徑所選擇的節點的集合。

| 操作符計算它的操作數的並集,該並集必須是節點集合。

判定詞用過濾地址路徑的同樣的方法來過濾表達式。如果被過濾的表達式求值不到節點集合,則是一個錯誤。判定詞依賴於孩子軸來過濾節點集合。

注意:

判定詞的意思關鍵地取決於應用於哪個軸。例如,preceding::foo[1] 返回在顛倒文檔順序下第一個 foo 元素,因爲應用於判定詞 [1] 的軸是 preceding 軸;與此相反,(preceding::foo)[1]文件順序下返回第一個 foo,因爲應用於判定詞 [1] 的軸是孩子軸。

/// 操作符組成表達式及相對點路徑。如果表達式求值不到節點集合,則是一個錯誤。/ 操作符以在地址路徑中用 / 的同樣方式來組成。如在地址路徑中,///descendant-or-self::node()/ 的簡縮。

沒有對象的類型能被變換成節點集合。

 
[18]    UnionExpr    ::=    PathExpr
      | UnionExpr '|' PathExpr
[19]    PathExpr    ::=    LocationPath
      | FilterExpr
      | FilterExpr '/' RelativeLocationPath
      | FilterExpr '//' RelativeLocationPath
[20]    FilterExpr    ::=    PrimaryExpr
      | FilterExpr 判定詞

3.4 布爾

布爾類型的對象能有兩個值之一:真和假。

or 表達式的求值是對每個操作數求值,並且,把它的值變換到布爾值,好像調用了布爾函數 boolean。如果值爲真,其結果爲真,否則,爲假。如果左邊的操作數求值爲真,右邊的操作數將不再沒被求值。

and 表達式的求值是對每個操作數求值,並且,把它的值變換到布爾值,好像調用了布爾函數 boolean。如果值爲真,其結果爲真,否則,爲假。如果左邊的操作數求值爲假,右邊的操作數將不再沒被求值。

EqualityExpr(不只是 RelationalExpr)或 RelationalExpr(不只是AdditiveExpr)是通過比較來自於對兩個操作數結果的對象來求值的。以下三段話定義了結果對象的比較。一、涉及到節點集合的比較被定義按照不涉及到節點集合的比較,對 =!=<=<>=>一律如此。二、沒有涉及到節點集合的比較被定義成 =!=。三、沒有涉及到節點集合的比較被定義成 <=<>=>

如果被比較的兩個對象是節點集合,那麼,其比較結果爲真當且僅當在兩個節點集合中各有一個節點,並且,比較這兩個節點的字串值的結果爲真。如果被比較的一個對象是節點集合而另一個是數字,其比較結果爲真當且僅當在節點集合中有一節點,並且,比較用函數 number 將該節點轉換成的字串值的數字與被比較的數字爲真。如果被比較的一個對象是節點集合而另一個是字符串,其比較結果爲真當且僅當在節點集合中有一節點,並且,比較節點的字串值與另一個的字符串爲真。如果被比較的一個對象是節點集合而另一個是布爾類型,其比較結果爲真當且僅當在節點集合中有一節點,並且,比較用函數 boolean 將該節點轉換成的布爾類型與被比較的布爾類型爲真。

當兩個被比較的對象都不是節點集合,而且,操作符爲 =!=,那麼,比較這類對象時,按以下方式將它們轉換成常見類型然後再比較。如果被比較的對象中至少有一個是布爾類型,那麼,每一個被比較的對象都要轉換成布爾類型,正如調用了boolean 函數。不然的話,如果至少有一個是數字,那麼,每一個被比較的對象都要轉換成數字,正如調用了number 函數。再不然的話,兩個對象都轉換成字符串正如調用了string 函數。 = 的比較爲真,當且僅當在對象是相等的;!= 的比較爲真,當且僅當在對象是不相等的。數字相等的比較依照 IEEE 754 [IEEE 754]。兩個布爾類型相等,當且僅當它們都爲真或都爲假。兩個字符串相等,當且僅當它們都由同樣序列的 UCS 字符組成。

注意:

如果 $x 綁定於一節點集合,那麼,$x="foo"not($x!="foo") 的含義不同:前者爲真,當且僅當在 $x有些節點有字串值爲 foo ;後者前者爲真,當且僅當在 $x所有節點有字串值爲 foo

當兩個被比較的對象都不是節點集合,而且,操作符爲 =!=,那麼,比較這類對象時,按以下方式將它們轉換成常見類型然後再比較。如果被比較的對象中至少有一個是布爾類型,那麼,每一個被比較的對象都要轉換成布爾類型,正如調用了boolean 函數。不然的話,如果至少有一個是數字,那麼,每一個被比較的對象都要轉換成數字,正如調用了number 函數。再不然的話,兩個對象都轉換成字符串正如調用了string 函數。 = 的比較爲真,當且僅當在對象是相等的;!= 的比較爲真,當且僅當在對象是不相等的。數字相等的比較依照 IEEE 754 [IEEE 754]。兩個布爾類型相等,當且僅當它們都爲真或都爲假。兩個字符串相等,當且僅當它們都由同樣序列的 UCS 字符組成。

注意:

如果 $x 綁定於一節點集合,那麼,$x="foo"not($x!="foo") 的含義不同:前者爲真,當且僅當在 $x有些節點有字串值爲 foo ;後者前者爲真,當且僅當在 $x所有節點有字串值爲 foo

當兩個被比較的對象都不是節點集合,而且,操作符爲 <=<>=>,那麼,要比較的對象都轉換成數字並依照 IEEE 754 進行比較。< 的比較爲真,當且僅當第一個數小於第二個數。 > 的比較爲真,當且僅當第一個數大於第二個數。 >= 的比較爲真,當且僅當第一個數大於或等於第二個數

注意:

當 XPath 表達式出現在 XML 文檔, 所有的 <<= 操作符必須按照 XML 1.0 的規則加上引號,例如,&lt;&lt;=。在下列例子中,test 屬性的值是個 XPath 表達式:

<xsl:if test="@value &lt; 10">...</xsl:if>
 
[21]    OrExpr    ::=    AndExpr
      | OrExpr 'or' AndExpr
[22]    AndExpr    ::=    EqualityExpr
      | AndExpr 'and' EqualityExpr
[23]    EqualityExpr    ::=    RelationalExpr
      | EqualityExpr '=' RelationalExpr
      | EqualityExpr '!=' RelationalExpr
[24]    RelationalExpr    ::=    AdditiveExpr
      | RelationalExpr '<' AdditiveExpr
      | RelationalExpr '>' AdditiveExpr
      | RelationalExpr '<=' AdditiveExpr
      | RelationalExpr '>=' AdditiveExpr

注意:

以上語法的結果是如下順序的優先級(最低優先級先列出):

  • or

  • and

  • = , !=

  • <= , < , >= , >

並且操作符都從左結合律。

例如,3 > 2 > 1(3 > 2) > 1 等價,其求值結果爲假。

3.5 數字

數字代表的是浮點數。數字可以有任何 64 位雙精度格式的 IEEE 754 值[IEEE 754]。這些包括特殊的 “非數字”(NaN)值,正負無窮大,和正負零。參看標準[JLS]的4.2.3 節關鍵規則的概要。

數字操作符將操作數轉換成數字,彷彿調用了函數number

操作符 + 執行加法。

操作符 - 執行減法。

注意:

由於 XML 允許 - 出現在名字中,典型地需要有空白符在 - 操作符之前。例如,foo-bar 求值結果爲一個包含名爲 foo-bar 的孩子的節點集合;foo - bar 求值結果是把第一個子元素 foo 字串值轉換成數字的結果和把第一個bar 孩子的 字串值轉換成數字的結果的差。

div 操作符按照 IEEE 754 執行浮點數的除法。

mod 操作符返回去尾除法的餘。例如:

  • 5 mod 2 返回 1

  • 5 mod -2 返回 1

  • -5 mod 2 返回 -1

  • -5 mod -2 返回 -1

注意:

這與 Java 和ECMAScript 中的 % 操作符一樣。

注意:

這與 IEEE 754 中返回取整 除的餘操作不一樣。

數字表達式
[25]    AdditiveExpr    ::=    MultiplicativeExpr
      | AdditiveExpr '+' MultiplicativeExpr
      | AdditiveExpr '-' MultiplicativeExpr
[26]    MultiplicativeExpr    ::=    UnaryExpr
      | MultiplicativeExpr MultiplyOperator UnaryExpr
      | MultiplicativeExpr 'div' UnaryExpr
      | MultiplicativeExpr 'mod' UnaryExpr
[27]    UnaryExpr    ::=    UnionExpr
      | '-' UnaryExpr

3.6 字符串

字符串由一個有零或多個在 XML 建議書[XML]定義的字符的序列組成。因此,在 XPath 中一個單字符對應於一單個有相應 Unicode 數值的 Unicode 抽象字符(參看[Unicode]);這與 16-位的 Unicode 編碼值不是同一件事:Unicode 編碼字符代表 Unicode 數值大於 U+FFFF 的抽象字符是一對 16-位 Unicode 編碼值 (替代對surrogate pair)。在許多的編程語言,字符串由一序列 Unicode 編碼值來表示;在這樣的語言中 XPath 的實現必須考慮確保替代對被正確地處理成一個單一的 XPath 字符。

注意:

在 Unicode 可能會出現兩個字符串被當作同樣的, 即使它們由不同的Unicode 抽象字符序列組成。例如,有些重音字符可以由預製的或分解的形式來表示。因此,XPath 可能會返回預想不到的結果,除非這些在 XPath 表達式及 XML 文檔的字符被規範化成規範的形式。參見[Character Model]。

3.7 詞法結構

當進行分割(tokenizing)時, 總是返回最長的分割段(token)。

儘管語法中沒有明確的允許,爲了可讀性表達式可以使用空白符:ExprWhitespace 可以在所有 ExprToken 式樣(pattern)前後自由地添加。

以下特別的分割規則的使用必須按照說明的順序來應用以消除 ExprToken 的歧義:

表達式的詞法結構
[28]    ExprToken    ::=    '(' | ')' | '[' | ']' | '.' | '..' | '@' | ',' | '::'
      | NameTest
      | NodeType
      | Operator
      | FunctionName
      | AxisName
      | Literal
      | Number
      | VariableReference
[29]    Literal    ::=    '"' [^"]* '"'
      | "'" [^']* "'"
[30]    Number    ::=    Digits ('.' Digits?)?
      | '.' Digits
[31]    Digits    ::=    [0-9]+
[32]    Operator    ::=    OperatorName
      | MultiplyOperator
      | '/' | '//' | '|' | '+' | '-' | '=' | '!=' | '<' | '<=' | '>' | '>='
[33]    OperatorName    ::=    'and' | 'or' | 'mod' | 'div'
[34]    MultiplyOperator    ::=    '*'
[35]    FunctionName    ::=    QName - NodeType
[36]    VariableReference    ::=    '$' QName
[37]    NameTest    ::=    '*'
      | NCName ':' '*'
      | QName
[38]    NodeType    ::=    'comment'
      | 'text'
      | 'processing-instruction'
      | 'node'
[39]    ExprWhitespace    ::=    S

4 核心函數庫

本節描述用來求值表達式的函數, XPath的實現必須總是在函數庫中包括這些函數。

在函數庫中的每一個函數都使用一個函數原型,該原型給定返回類型,函數的名稱,以及參數的類型。如果參數類型後跟隨一個問號,那麼參數是可選的;否則,參數則是必須有的。

4.1 節點集合函數

number last()

last 函數返回一個數字,該數字等於從表達式求值上下文中的上下文大小

number position()

position函數返回一個數字,該數字等於從表達式求值上下文中的上下文位置

number count(node-set)

count 函數返回在參數node-set中節點的個數。

node-set id(object)

id 函數id通過元素的唯一的ID選擇他們(參見 5.2.1 唯一 ID)。當id的參數是節點集合類型時,結果是對在參數節點集合裏的每一個節點的字串值應用id的結果的聯合。當到id的參數是任何其它的類型時,參數被轉換成一個字符串,即如調用了string 函數一樣;字符串被分割成由空白格分開的單字片序列(空白格是與產生式 S匹配的字符的任何順序);結果是在上下文節所在的同一文檔中那些具有唯一id等於序列中任何一個單字片的元素的節點集合。

  • id("foo") 選擇唯一ID爲 foo 元素

  • id("foo")/child::para[position()=5] 選擇唯一帶有 ID 爲 foo 的元素的第5個 para 孩子

string local-name(node-set?)

函數 local-name 返回一個節點的擴展名的局域部分,該節點爲依照文檔順序參數節點集合裏的第一個節點。如果參數節點集合是空或第一節點沒有擴展名,則返回一個空字符串。如果參數被省略,它則缺省爲僅有一個上下文節點成員的節點集合。

string namespace-uri(node-set?)

函數 namespace-uri 返回依照文檔順序參數節點集合中的第一個節點的擴展名的命名空間 URI。如果參數節點集合是空的,第一節點沒有擴展名,或擴展名的命名空間 URI 爲空,則返回一個空字符串。如果參數被省略,它則缺省爲僅有一個上下文節點成員的節點集合。

注意:

除了元素節點和屬性節點外函數 namespace-uri 返回的字符串將爲空。

string name(node-set?)

函數 name 返回一個字符串,字符串包含一個QName,它代表依照文檔順序參數節點集合中的第一個節點的擴展名QName代表擴展名字時,必須注意到命名空間聲明實際上是對被表示的擴展名的節點的。典型地,在XML資源中將是 QName 出現。如果命名空間聲明實際上是對與有同樣命名空間的多重的前綴相聯繫的節點,這不必是實際上的情況。然而,實現可以包括有關節點的表示的原來前綴的信息;在這樣的情況下,實現能保證返回的字符串總是與在 XML 文檔使用的QName一樣。如果參數節點集合是空的或第一節點沒有擴展名,返回一個空的字符串。如果它省略了的參數,則缺省爲僅有上下文節點一個成員的節點集合。

注意:

除了元素節點和屬性節點外,由 name 函數返回的字符串將與 local-name 函數返回的字符串一樣。

4.2 字符串函數

string string(object?)

string 函數將對象依下列各項轉換成字符:

  • 節點集合通過返回在節點集合中文檔順序下第一個節點的字串值來轉換成字符串。如果節點是空的則返回空字符串。

  • 數字按以下方式轉換成字符

    • NaN 轉換成字符串 NaN

    • 正零轉換成字符串 0

    • 負零轉換成字符串 0

    • 正無窮大轉換成字符串 Infinity

    • 負無窮大轉換成字符串 -Infinity

    • 如果數字是整數,該數字表示成一個與無小數點及領頭零的 Number一樣的十進制的形式,如果數字是負數,則在其前加一個負號(-)。

    • 否則,該數字表示成一個與包括小數點及至少在小數點前面有一數字並且小數點後有一數字的 Number一樣的十進制的形式,如果數字是負數,則在其前加一個負號(-);除了在小數點前要求直接要有一個位的零外,不應該有領頭的零;在小數點後除了要求的一位數外,應有不多不少的位來區分該數與所有其它的 IEEE 754 數值。

  • 布爾的假值轉換成字符串 false。布爾的真值轉換成字符串 true

  • 不是四種基本類型的對象依照所屬類型的方式轉換成字符串。

如果參數省略,則缺省爲僅有一個上下文節點爲成員的節點集合。

注意:

string 函數不是要用來將數字轉換成字符串呈現給用戶的。 format-number 函數和[XSLT] 中的 xsl:number 元素提供了這樣的功能。

string concat(string, string, string*)

concat 函數返回它的參數的聯結。

boolean starts-with(string, string)

如果第一個字符串參數以第二個字符串參數起頭,starts-with 函數返回真,否則,返回假。

boolean contains(string, string)

如果第一個字符串參數包含第二個字符串參數,contains 函數返回真,否則,返回假。

string substring-before(string, string)

substring-before 函數返回第一個字符串參數在第二個參數首次出現之前的子字符串,或者,如果第一個字符串參數不包含第二個字符串參數則返回空字符串。例如,substring-before("1999/04/01","/") 返回 1999

string substring-after(string, string)

substring-after 函數返回第一個字符串參數在第二個參數首次出現之後的子字符串,或者,如果第一個字符串參數不包含第二個字符串參數則返回空字符串。例如, substring-after("1999/04/01","/") 返回 04/01,而 substring-after("1999/04/01","19") 返回 99/04/01

string substring( string , number , number? )

substring 函數返回第一個字符串參數從第二個參數所指定的位置開始,以第三個參數爲長度的子字符串。例如, substring("12345",2,3) 返回 "234"。如果沒有第三個參數,則返回從第二個參數所指定的位置開始直到結束。例如, substring("12345",2) 返回"2345"

更確切地說,每一個字符串裏的字符(參看3.6 字符串)是被看作有一個數字位置:第一個字符是 1 ,第二個字符是 2 ,依此類推。

注意:

這與 Java 和 ECMAScript 不同,在 Java 和 ECMAScript 中 String.substring 方法將第一個字符的位置當成 0 。

該返回的子字符串包含那些字符位置大於或等於第二參數的取整值,如果指定了第三個參數,則小於第二和第三個參數的取整值之和;以上的比較和加法遵循 IEEE 754 的規則;取整操作彷彿是調用了round 函數。以下的例子說明了各種不常見的案例:

  • substring("12345", 1.5, 2.6) 返回 "234"

  • substring("12345", 0, 3) 返回 "12"

  • substring("12345", 0 div 0, 3) 返回 ""

  • substring("12345", 1, 0 div 0) 返回 ""

  • substring("12345", -42, 1 div 0) 返回 "12345"

  • substring("12345", -1 div 0, 1 div 0) 返回 ""

number string-length( string? )

string-length 返回字符串(參看 3.6 字符串)中字符的個數。如果參數省略,則缺省爲一個上下文節點再轉換成字符串,也就是上下文節點的 字串值

string normalize-space(string?)

normalize-space 函數返回空白符規範化 後的參數字符串,該規範化是清除領頭及結尾的空白字以及用一個空白符替換連續的空白符。空白符字符與 XML 中的產生式 S 所允許的是一樣的。如果參數省略,則缺省爲一個上下文節點再轉換成字符串,也就是上下文節點的 字串值

string translate(string, string, string)

translate 函數返回第一個參數的字符串,其中有在第二個參數中出現的字符都被在第三個參數中相對應位置的字符所替換。例如,translate("bar","abc","ABC") 返回字符串 BAr。如果,第二個參數裏的字符在第三個參數的相對應位置沒有字符(因爲第二個參數裏的字符串比第三個參數的字符串長),那麼,第一個參數裏的那個字符將被移去。例如,translate("--aaa--","abc-","ABC") 返回 "AAA"。如果在第二個參數裏的字符出現超過一次,那麼,第一次的出現決定替換的字符。如果第三個參數裏的字符串比第二個參數的字符串長, 那麼,多餘的字符將被忽略。

注意:

translate 函數不是一個對所有語言大小寫轉換的完整解決方案。XPath 的將來的版本可能會爲大小寫轉換提供額外的函數。

4.3 布爾函數

boolean boolean(object)

boolean 函數依下列各項轉換其參數:

  • 數字爲真當且僅當它不是正負零或 NaN

  • 節點集合爲真當且僅當它不爲空

  • 字符串爲真當且僅當它的長度不爲零

  • 不是四種基本類型的對象依照所屬類型的方式轉換成布爾類型。

boolean not(boolean)

如果參數爲真 not 函數返回真,否則返回假。

boolean true()

true 函數返回真。

boolean false()

The false 函數返回假。

boolean lang(string)

依賴於 xml:lang 屬性指定的上下文節點的語言與參數指定的語言的子語言是否一致或一樣,參數字符串lang函數返回真或假。上下文節點的語言由上下文節點的 xml:lang 屬性決定,或者,如果沒有 xml:lang 屬性則由最接近的有 xml:lang 屬性祖先節點的 xml:lang 屬性值決定。如果沒有這樣的節點,那麼 lang 返回假。如果有這樣的節點,那麼在不考慮大小的情況下,當屬性值寫與參數相等或有以- 開始的後綴且其值等於參數忽略後綴的值,lang 返回真。如果上下文節點爲以下五個元素中的任何一個,lang("en") 爲真:

<para xml:lang="en"/>
<div xml:lang="en"><para/></div>
<para xml:lang="EN"/>
<para xml:lang="en-us"/>

4.4 數字函數

number number(object?)

number 函數參數依下列各項轉換成數字:

  • 可選的空白符跟隨可選的減號再跟隨 Number 再跟隨空白符的字符串轉換成 IEEE 754 最接近的 (根據 IEEE 754 就近取整規則) 由字符串表示的數學值的數字;其它任何的字符串轉換成 NaN

  • 布爾真轉換成 1 ;布爾假轉換成 0

  • 節點集合首先轉換成字符串好像調用了 string 函數,然後再按字符串參數的方式轉換

  • 不是四種基本類型的對象依照所屬類型的方式轉換成數字。

如果參數省略,則缺省爲僅有一個上下文節點爲成員的節點集合。

注意:

除非元素是在語言自然格式(典型地被改變成語言特定的格式呈現給用戶)下代表數字數據的類型,number 函數不應用於 XML 文檔元素中的數字轉換。另外,除非語言自然格式與 XPath 句法的 Numbernumber 函數不能使用。

number sum(node-set)

對於在參數節點集合的每個節點,sum 函數返回節點字串值轉換成數字後的和。

number floor(number)

floor 函數返回不大於參數的整數的最大數 (最接近於正無窮大) 。

number ceiling(number)

ceiling 函數返回不小於參數的整數的最小數 (最接近於負無窮大) 。

number round(number)

round 函數返回最接近於參數的整數。如果有兩個這樣的數字,那麼,返回最接近於正無窮大的那個。如果參數是 NaN,那麼返回 NaN。如果參數是正無窮大,那麼返回正無窮大。如果參數是負無窮大,那麼返回負無窮大。如果參數是正零,那麼返回正零。如果參數是負零,那麼返回負零。如果參數小於零,但大於或等於 -0.5 ,那麼返回負零。

注意:

對於最後兩種情況,調用round 函數與加上 0.5 後並調用 floor的結果不同。

5 數據模型

XPath 將一個 XML 文檔作爲一棵樹進行操作。本節描述 XPath 怎樣將一個 XML 文檔建成一棵樹的模型。該模型僅僅是概念上的並且不要求任何特定實現。在B XML 信息集映射中描述了該模型與 XML 信息集[XML Infoset

被 XPath 操作的 XML 文檔必須遵循XML 命名空間建議書[XML Names]。

樹包含節點,共有7種節點類型:

  • 根節點

  • 元素節點

  • 正文節點

  • 屬性節點

  • 命名空間節點

  • 處理指令節點

  • 註釋節點

定義:對於每種節點類型,都有一個方法來決定該類型的節點的字串值。對一些節點,字串值是節點的一部分;對於其它節點,字串值的計算是由子孫節點的字串值來求出。]

注意:

對於元素節點和根節點,節點的字串值不與 DOM 的 nodeValue 方法返回了的字符串一樣(參看[DOM])。

定義:一些節點的類型也有擴展名,它是由局域部分和命名空間 URI 對組成。局域部分是一個字符串。命名空間 URI 或爲空或爲一字符串。在 XML 文檔中說明的命名空間 URI 可以是一個在[RFC2396]中定義的 URI 引用;這意味着它能有一個片段標識符並可以是相對的。在處理的命名空間時,一個相對的 URI 應該被轉換成絕對的 URI:在數據模型中節點擴展名的命名空間 URIs 應該是絕對的。]如果兩個擴展名有一樣的局域部分,且都或有一空的命名空間 URI 或都有是相等的非空的命名空間 URI ,那麼它們是相等的。

定義文檔順序是對文檔中所有的節點定義的一個順序, 該順序對應於在一般的實體的擴展以後,每個節點的 XML 表示的首字符出現在文檔 XML 表示中的順序。這樣,根節點將是第一個節點。元素節點出現在他們的孩子前面。因此,文檔順序制定了元素節點以在 XML (實體擴展後)中開始標籤出現的順序爲順序。元素的屬性節點和命名空間節點出現在元素的孩子們前面。命名空間節點定義出現在屬性節點前。命名空間節點的相對順序是依賴於實現。屬性節點的相對的順序是實現依賴的。] [定義文檔倒順文檔順序的顛倒。]

根節點和元素節點有子節點的有序表。節點從來不共享孩子:如果一節點與另一節點不是同樣的節點,那麼,沒有一個節點的孩子與另一節點的任何一個孩子會是同一節點。[定義:除根節點以外,每個節點嚴格地只有一個],它是一元素節點或根節點。根節點或元素節點是每一個它的孩子節點的父。[定義:節點的子孫是該節點的孩子們和節點的孩子們的子孫。]

5.1 根節點

根節點爲樹的根。除了作爲樹的根,根節點並不出現。文檔元素的元素節點是根節點的孩子。出現在序言中和文檔元素後的處理指令及註釋也爲根節點的子處理指令及註釋節點。

根節點的字串值 是根節點在文本順序下所有文字節點子孫字串值的累加。

根節點沒有擴展名

5.2 元素節點

在文檔中的每個元素都有一個元素節點。元素節點有擴展名, 該擴展名的確定是通過擴展按照 XML 命名空間建議書[XML Names]在標記中指定元素的QName。 如果QName沒有前綴並且無可應用的缺省的命名空間,元素擴展名的命名空間 URI 爲空。

注意:

依照[XML Names]附錄A.3中的註釋,擴展名的局部部分對應於 ExpEType 元素的 type 屬性;擴展名的命名空間 URI 對應於 ExpEType 元素的 ns 屬性,並且如果 ExpEType 元素的 ns 屬性被省略,擴展名的命名空間 URI 爲空。

元素節點的孩子是元素節點,註釋節點,處理節點及其內容的文字節點。對內部及外部實體的實體引用將被擴展,字符引用也被解決。

元素節點的字串值是元素節點在文本順序下所有文字節點子孫字串值的累加。

5.2.1 唯一 ID

元素節點可以有 一個唯一標識符(ID),它是在DTD中聲明爲類型 ID 的屬性的值。在同一文檔中,沒有兩個元素可以有相同的唯一標識符。如果 XML 處理器在同一文檔中發現兩個元素有相同的唯一標識符(如果該文檔是無效的,這樣的情形可能發生),那麼,在文本順序下的第二個元素將被視爲沒有唯一標識符。

注意:

如果一個文檔沒有DTD,那麼,在該文檔中沒有元素將有唯一標識符。

5.3 屬性節點

每一個元素節點都有相關聯的屬性節點集;元素是每一個這些屬性節點的節點;然而,屬性節點不是它父元素的孩子。

注意:

這與 DOM 不同,DOM 不認爲元素擁有屬性當做屬性的父 (參看[DOM])。

元素從來不分享屬性節點:如果一節點與另一節點不是同樣的節點,那麼,沒有一個元素節點的屬性節點會是另一節點的屬性節點。

注意:

操作符 = 測試兩個節點是否有一樣的值,不是他們是否是同一節點。這樣,兩個不同的元素的屬性可以使用 = 比較,儘管他們不是一樣的節點。

對待缺省屬性與指定的屬性一樣。如果屬性申明在DTD中元素類型,而缺省申明爲 #IMPLIED,並且,在元素中沒有給出該屬性,那麼,元素的屬性集合不包含該屬性節點。

一些屬性,如 xml:langxml:space,除非被其他的子孫元素中的相同屬性替換,從語義上它們應用於所有有該屬性的元素的子孫元素。然而,這不影響屬性節點在樹裏出現的位置:在元素的開始標籤或該元素的空元素標籤中明確地指定的,或在DTD中明確地聲明缺省值的那些屬性纔是該元素擁有的屬性節點。

屬性節點有擴展名字串值擴展名的確定是根據 XML 命名空間建議書[XML Names],通過擴展 XML 文檔標籤中指定的QName而得到的。如果屬性的QName沒有前綴,屬性的名的命名空間 URI 將爲空。

注意:

依照[XML Names]附錄A.3中的註釋,擴展名 expanded-name 的局部部分對應於 ExpAName 元素的 name 屬性;擴展名 expanded-name 的命名空間 URI 對應於 ExpEType 元素的 ns 屬性,並且,如果 ExpAName 元素的 ns 屬性被省略,擴展名的命名空間 URI 爲空。

屬性節點有字串值字串值是在 XML 建議書[XML]詳細說明的規範化的值。對其規範化值是零長度字符串的屬性無須分別處理:它以字串值是零長度字符串的屬性節點爲結果。

注意:

也可能在外部的DTD或外部的參數實體中聲明缺省屬性。除非正在進行校驗,XML 建議書不要求 XML 處理器讀外部的DTD或外部的參數。樣式表或其它假設 XPath 樹包含有在外部的DTD或外部的參數中申明缺省屬性值的功能軟件不能與一些無校驗 XML 處理器一起工作。

沒有屬性節點與聲明命名空間的屬性相對應(參看[XML Names])。

5.4 命名空間節點

每個元素都有命名空間節點的關聯的集合,一個爲在元素的範圍的每個不同命名空間前綴(包括 xml 前綴,它由 XML 命名空間建議書[XML Names]隱式地聲明);而如果在對元素的範圍,另一個是爲缺省命名空間。元素是這些命名空間節點的;然而,一個命名空間節點不是它的父元素的孩子。元素從來不分享命名空間節點:如果一個元素節點與另外的元素不是一樣的節點,那麼,沒有一個元素節點的命名空間節點會是另一元素節點的命名空間節點。這意味着一個元素將有一個命名空間節點:

  • 對每個以 xmlns: 開始的元素的屬性;

  • 對每個以 xmlns: 開始的祖先元素的屬性,除非元素自己或一位更近的祖先重新聲明瞭該前綴;

  • xmlns 屬性,如果該元素或一些祖先有 xmlns, 並且,對最接近的這樣的元素 xmlns 屬性的值是非空的。

    注意:

    屬性 xmlns="" “未申明”缺省命名空間(參看[XML Names])。

命名空間節點有擴展名:其局域部分是命名空間前綴(如果命名空間節點爲缺省命名空間,則爲空);命名空間 URI 總爲空。

命名空間節點的字串值是被綁定在命名空間前綴的命名空間 URI;如果它是相對的,它必須被解析,就象在擴展名中的命名空間 URI 擴展名字。

5.5 處理指令節點

除了在文檔類型聲明中出現的所有處理指令外,每個處理指令都有處理指令節點。

每條處理指令都有擴展名: 其局域部分是處理指令的目標;其命名空間 URI 爲空。處理指令節點的字串值是處理指令後跟隨的目標及任何空白的部分,不包括結尾的 ?>

注意:

XML 聲明不是一條處理指令,因此,沒有處理指令節點與 XML 聲明相對應。

5.6 註釋節點

除了在文檔類型聲明中出現的所有註釋外,每條註釋都有註釋節點。

註釋的字串值是註釋的內容而不包括 起始的 <!-- 是或結尾的 -->

註釋節點沒有擴展名

5.7 正文節點

字符數據組成正文節點。儘可能多的字符數據被組織進正文節點:從來沒有一個正文節點的後面或前面緊連的兄弟是個正文節點。正文節點的字串值是它的字符數據。正文節點總是至少有一個字符的數據。

在 CDATA 節內的每個字符都被當作字符數據,這樣,在源文檔的 <![CDATA[<]]>&lt; 都看成是一樣的,都是在樹中正文節點的一個單字符 <。這樣,CDATA 節被看成好像把 <![CDATA[]]> 拿掉,而且,每次出現的 <& 都被分別地替換成 &lt;&amp;

注意:

當正文節點包含< 字符作爲 XML 輸出,< 字符必須轉碼,例如使用 &lt;,或包含在 CDATA 節中。

註釋、處理指令和屬性值中的字符不產生正文節點。外部實體中的行結束符都按 XML 建議書[XML]規範化成 #xA 。

正文節點沒有擴展名

6 一致性

XPath的根本計劃是作爲一個組件,爲其它的規格書所使用。因此,XPath依賴於使用XPath的說明書(例如[XPointer]和[XSLT])來指定XPath的實現一致性標準,並且不爲XPath的獨立的實現定義任何一致性標準。

A 參考書目

A.1 標準規範參考書目

IEEE 754
Institute of Electrical and Electronics Engineers. IEEE Standard for Binary Floating-Point Arithmetic. ANSI/IEEE Std 754-1985.
RFC2396
T. Berners-Lee, R. Fielding, and L. Masinter. Uniform Resource Identifiers (URI): Generic Syntax. IETF RFC 2396. See http://www.ietf.org/rfc/rfc2396.txt.
XML
World Wide Web Consortium. Extensible Markup Language (XML) 1.0. W3C Recommendation. See http://www.w3.org/TR/1998/REC-xml-19980210
XML Names
World Wide Web Consortium. Namespaces in XML. W3C Recommendation. See http://www.w3.org/TR/REC-xml-names Also see: 中文翻譯 [簡體中文] .

A.2 其他參考書目

Character Model
World Wide Web Consortium. Character Model for the World Wide Web. W3C Working Draft. See http://www.w3.org/TR/WD-charmod
DOM
World Wide Web Consortium. Document Object Model (DOM) Level 1 Specification. W3C Recommendation. See http://www.w3.org/TR/REC-DOM-Level-1
JLS
J. Gosling, B. Joy, and G. Steele. The Java Language Specification. See http://java.sun.com/docs/books/jls/index.html.
ISO/IEC 10646
ISO (International Organization for Standardization). ISO/IEC 10646-1:1993, Information technology -- Universal Multiple-Octet Coded Character Set (UCS) -- Part 1: Architecture and Basic Multilingual Plane. International Standard. See http://www.iso.ch/cate/d18741.html.
TEI
C.M. Sperberg-McQueen, L. Burnard Guidelines for Electronic Text Encoding and Interchange. See http://etext.virginia.edu/TEI.html.
Unicode
Unicode Consortium. The Unicode Standard. See http://www.unicode.org/unicode/standard/standard.html.
XML Infoset
World Wide Web Consortium. XML Information Set. W3C Working Draft. See http://www.w3.org/TR/xml-infoset
XPointer
World Wide Web Consortium. XML Pointer Language (XPointer). W3C Working Draft. See http://www.w3.org/TR/WD-xptr
XQL
J. Robie, J. Lapp, D. Schach. XML Query Language (XQL). See http://www.w3.org/TandS/QL/QL98/pp/xql.html
XSLT
World Wide Web Consortium. XSL Transformations (XSLT). W3C Recommendation. See http://www.w3.org/TR/xslt

B XML 信息集映射(非標準)

在 XPath 數據模型中的節點可按如下方式由 XML 信息集 [XML Infoset] 提供的信息項導出: [XML Infoset] as follows:

注意:

在XPath 本版本的準備完成的時候,即將替換五月17日版本的新版本的 XML 信息集工作草稿已接近完成,或將與本版的本規範同時發表或稍後發表。這裏所給出的映射是按照新的 XML 信息集工作草稿。如果,XML 信息集工作草稿還沒有發表,W3C 成員可參考內部的工作草稿版 http://www.w3.org/XML/Group/1999/09/WD-xml-infoset-19990915.html只有成員可訪問).

  • 根節點來自文檔的信息項。根節點的孩子來自 childrenchildren - comments 屬性。

  • 元素節點來自元素信息項。元素節點的孩子來自 childrenchildren - comments 屬性。元素節點的屬性來自 attributes 屬性。元素節點的命名空間來自 in-scope namespaces 屬性。元素節點擴展名的局域部分來自 local name 屬性。元素節點擴展名的命名空間 URI 來自 namespace URI 屬性。元素節點的唯一 ID 來自有 attribute type 屬性等於 IDattributes 屬性的屬性信息項的children 屬性.

  • 屬性節點來自屬性信息項。屬性節點擴展名的局域部分來自local name 屬性。屬性節點擴展名的命名空間 URI 來自 namespace URI 屬性。 節點的 字串值 來自將 每一個children 屬性成員的 character code 屬性相累加。

  • 正文節點來自一序列的連續的信息項。其節點的字串值來自連接每一個字符信息項 character code 屬性。.

  • 處理指令節點來自處理指令的信息項。其擴展名的局域部分來自 target 屬性。(其擴展名的命名空間 URI 部分爲空。)其字串值來自content 屬性。文檔類型定義信息項的孩子是處理指令項的無處理指令節點。

  • 註釋節點來自注釋信息項。其字串值來自content 屬性。文檔類型定義信息項的孩子是註釋信息項的無註釋節點。

  • 命名空間節點來自命名空間聲明信息項。其擴展名的局域部分來自prefix 屬性。(其擴展名的命名空間 URI 部分爲空。)其字串值來自命名空間 URI 屬性。.

 
發佈了44 篇原創文章 · 獲贊 0 · 訪問量 16萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章