XML 路徑語言(XPath) 版本 1.0
XML 路徑語言(XPath) 版本 1.0
萬維網協會 (W3C) 建議 1999November16
- 本版本:
- http://www.w3.org/TR/1999/REC-xpath-19991116 (其它文件格式: XML [英文] HTML [英文] )
- 最新版本:
- http://www.w3.org/TR/xpath 中文翻譯 [簡體中文]
- 以前版本:
-
http://www.w3.org/TR/1999/PR-xpath-19991008
http://www.w3.org/1999/08/WD-xpath-19990813
http://www.w3.org/1999/07/WD-xpath-19990709
http://www.w3.org/TR/1999/WD-xslt-19990421 - 編者:
- James Clark <jjc@jclark.com>
- Steve DeRose, Inso Corp. and Brown University <Steven_DeRose@Brown.edu>
Copyright ???1999?W3C? (MIT, INRIA, Keio), All Rights Reserved. W3C liability, trademark, document use, and software licensing rules apply.
摘要
XPath 是一種用于對 XML 文檔的元件尋址的一語言,設計為 XSLT 和 XPointer 使用。
本文檔的地位
本文檔已由萬維網協會 (W3C) 組織成員和其他感興趣的各方審閱,并已被組織理事批準為萬維網協會 (W3C) 建議。這是一個穩定的文檔,可以用作參考材料,也可以作為其他文檔的標準參考文獻。W3C 在建議制定過程中的作用是吸引對本規范的注意并促進它的廣泛使用。這能增強 Web 的功能和互操作性。
本規格說明已知的錯誤列表在 http://www.w3.org/1999/11/REC-xpath-19991116-errata。
對本說明的建議可電郵到 www-xpath-comments@w3.org;存檔的建議可供備查。
英文版是唯一的正式版,本文檔的翻譯請參見 http://www.w3.org/Style/XSL/translations.html。
現有 W3C 建議和其他技術文檔的列表在 http://www.w3.org/TR。
本規格是 XSL 工作組及 XML 鏈接工作組聯合的工作成果,因此也是 XML 式樣制定工作(W3C Style activity)和 W3C XML 制定工作(W3C XML Activity)的一部分。
目錄
1 緒論
2 地址路徑
????2.1 地點步進
????2.2 軸
????2.3 節點測試
????2.4 判定詞
????2.5 縮簡句法
3 表達式
????3.1 基礎
????3.2 函數調用
????3.3 節點集合
????3.4 布爾
????3.5 數字
????3.6 字符串
????3.7 詞法結構
4 核心函數庫
????4.1 節點集合函數
????4.2 字符串函數
????4.3 布爾函數
????4.4 數字函數
5 數據模型
????5.1 根節點
????5.2 元素節點
????????5.2.1 唯一 ID
????5.3 屬性節點
????5.4 命名空間節點
????5.5 處理指令節點
????5.6 注釋節點
????5.7 正文節點
6 一致性
附錄
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 的規則,也就是應鍵入成 <
。在表達式以內,文字的字符串由單引號或雙引號來界定,它也用于界定 XML 屬性。為了避免 XML 處理器將表達式中的引號解釋成屬性界定符,引號可以鍵入成字符參考( "
或 '
)。做為選擇,如果 XML 屬性使用雙引號,表達式則可以使用單引號,反之亦然。
一種重要的表達式類型是地點路徑,地址路徑選擇與上下文節點相關的節點集合。對是地址路徑的表達式求值的結果是節點集合,該節點集合包含地點路徑選擇的節點。地址路徑能遞歸地包含表達式,這些表達式用來過濾節點集合。地址路徑與此同時LocationPath 相匹配。
在下列語法里,非終結的 QName 和 NCName 定義在[XML Names]中,而S定義在[XML]中。語法與[XML]一樣使用 EBNF 符號表示法(除了總是以大寫字母起頭的語法符號)。
分析表達式時,首先將字符字符串分解成分割段(token),然后再分析所得分割段結果的序列。空白符能自由地在分割段之間被使用。分段化(tokenization)過程在3.7 詞法結構中描述。
2 地址路徑
盡管地址路徑不是本語言中最完整的語法的構件(地址路徑 LocationPath 是 Expr 的一個特殊的例子),他們卻是最重要的構件,因此,將首先進行描述。
每一條地址路徑都能使用直觀但是相當冗長的句法表示,同時也有很多縮簡句法可用以簡明地表示常見路徑。這節將解釋使用未經縮寫的句法的地址路徑的語義。然后將通過顯示縮簡的句法怎擴展成未經縮寫的句法來解釋縮簡句法(看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
且值為warning
的para
孩子 -
child::para[attribute::type='warning'][position()=5]
選擇的上下文節點中所有的有屬性type
且值為warning
的para
孩子中第五個孩子 -
child::para[position()=5][attribute::type="warning"]
選擇的上下文節點中第五個para
孩子,如果該孩子有type
屬性且值為warning
的話 -
child::chapter[child::title='Introduction']
選擇的上下文節點的chapter
孩子,這些孩子有一個或一個以上字串值等於Introduction
的title
孩子 -
child::chapter[child::title]
選擇的上下文節點中有一個或一個以上title
孩子的 chapter 孩子 -
child::*[self::chapter or self::appendix]
選擇上下文節點的chapter
和appendix
孩子 -
child::*[self::chapter or self::appendix][position()=last()]
選擇上下文節點的最后一個chapter
或appendix
孩子
地址路徑有兩種:相對的地址路徑和絕對的地址路徑。
相對的地址路徑由以 /
分開的一個或多個地點步進序列組成。在相對地址路徑中的步進是從左到右組成。每一步進依次選擇相對於上下文節點的節點集。步進的初始的序列以如下所述的方式與后續的步進組成在一起。步進的初始的序列選擇相對於上下文節點的節點集,該集合的每一節點成為后續步進的上下文節點。由步進確定的節點的集合是聯合在一起的。由合成的步進確定的節點的集合也是這樣的聯合。例如,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
軸包含上下文節點和上下文節點的祖先;這樣,該軸將總是包括根節點
注意:
ancestor
,descendant
,following
,preceding
以及 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 判定詞
一個軸不是前進軸就是倒轉軸。前進軸是依文本順序在任何時候都僅僅包含上下文節點或在上下文節點以后的節點的軸。倒轉軸是依文本順序在任何時候都僅僅包含上下文節點或在文檔順序在上下文節點前的節點的軸。因此,ancestor
、ancestor-or-self
、preceding
及 preceding-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
且值為warning
的para
孩子 -
para[@type="warning"][5]
選擇的上下文節點的所有的有屬性type
且值為warning
的para
孩子中的第五個 -
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/para
是 child::div/child::para
的縮寫。
屬性也有縮寫形式: attribute::
能被縮寫成 @
。例如,地址路徑 para[@type="warning"]
為 child::para[attribute::type="warning"]
的縮寫,也就是選擇有 type
屬性且屬性值為 warning
的 para
孩子。
//
是 /descendant-or-self::node()/
的縮寫。例如,//para
是 /descendant-or-self::node()/child::para
的縮寫,因此選擇文檔中所有的 para
元素(即使 para
元素是文檔元素,也會被 //para
所選擇,因為文檔元素是根節點的孩子); div//para
是 div/descendant-or-self::node()/child::para
的縮寫,因此將選擇 div
孩子的所有 para
子孫。
注意:
地址路徑 //para[1]
與地址路徑 /descendant::para[1]
的含意不一樣,后者選擇第一個 para
元素子孫,前者選擇是他們的父的第一 para
孩子的所有的子孫 para
元素。
地點路進 .
是 self::node()
的縮寫。這與 //
一起使用特別有用。例如,地址路徑 .//para
是 self::node()/descendant-or-self::node()/child::para
的縮寫,因此將選擇上下文節點的所有的 para
子孫元素。
同樣,地址路徑 ..
是 parent::node()
的縮寫。例如,../title
是 parent::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 的規則加上引號,例如,<
及 <=
。在下列例子中,test
屬性的值是個 XPath 表達式:
<xsl:if test="@value < 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
|
| MultiplicativeExprMultiplyOperatorUnaryExpr
|
|||
| 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 的歧義:
-
如果有在前的分割段并且該分割段不是
@
,::
,(
,[
,,
或 Operator 中的一個,那么,*
必需當做 MultiplyOperator 并且,NCName 必需當做 OperatorName。 -
如果一個字符后跟隨 NCName(可能在插入 ExprWhitespace之后)是
(
,那么,該分割段必需當做 NodeType 或 FunctionName。 -
如果兩個字符后跟隨 NCName (可能在插入 ExprWhitespace之后)是
::
,那么,該分割段必需當做 AxisName。 -
否則,該分割段必不能當做 MultiplyOperator,OperatorName,NodeType,FunctionName,或 AxisName。
表達式的詞法結構
[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
函數將對象依下列各項轉換成字符:
-
數字按以下方式轉換成字符
-
布爾的假值轉換成字符串
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 句法的 Number,number
函數不能使用。
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.3 屬性節點
每一個元素節點都有相關聯的屬性節點集;元素是每一個這些屬性節點的父節點;然而,屬性節點不是它父元素的孩子。
注意:
這與 DOM 不同,DOM 不認為元素擁有屬性當做屬性的父 (參看[DOM])。
元素從來不分享屬性節點:如果一節點與另一節點不是同樣的節點,那么,沒有一個元素節點的屬性節點會是另一節點的屬性節點。
注意:
操作符 =
測試兩個節點是否有一樣的值,不是他們是否是同一節點。這樣,兩個不同的元素的屬性可以使用 =
比較,盡管他們不是一樣的節點。
對待缺省屬性與指定的屬性一樣。如果屬性申明在DTD中元素類型,而缺省申明為 #IMPLIED
,并且,在元素中沒有給出該屬性,那么,元素的屬性集合不包含該屬性節點。
一些屬性,如 xml:lang
和 xml: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.7 正文節點
字符數據組成正文節點。盡可能多的字符數據被組織進正文節點:從來沒有一個正文節點的后面或前面緊連的兄弟是個正文節點。正文節點的字串值是它的字符數據。正文節點總是至少有一個字符的數據。
在 CDATA 節內的每個字符都被當作字符數據,這樣,在源文檔的 <![CDATA[<]]>
與 <
都看成是一樣的,都是在樹中正文節點的一個單字符 <
。這樣,CDATA 節被看成好像把 <![CDATA[
和 ]]>
拿掉,而且,每次出現的 <
和 &
都被分別地替換成 <
和 &
。
注意:
當正文節點包含<
字符作為 XML 輸出,<
字符必須轉碼,例如使用 <
,或包含在 CDATA 節中。
注釋、處理指令和屬性值中的字符不產生正文節點。外部實體中的行結束符都按 XML 建議書[XML]規范化成 #xA 。
正文節點沒有擴展名。
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 (只有成員可訪問).
-
根節點來自文檔的信息項。根節點的孩子來自 children 和 children - comments 屬性。
-
元素節點來自元素信息項。元素節點的孩子來自 children 和 children - comments 屬性。元素節點的屬性來自 attributes 屬性。元素節點的命名空間來自 in-scope namespaces 屬性。元素節點擴展名的局域部分來自 local name 屬性。元素節點擴展名的命名空間 URI 來自 namespace URI 屬性。元素節點的唯一 ID 來自有 attribute type 屬性等於
ID
的attributes 屬性的屬性信息項的children 屬性. -
屬性節點來自屬性信息項。屬性節點擴展名的局域部分來自local name 屬性。屬性節點擴展名的命名空間 URI 來自 namespace URI 屬性。 節點的 字串值 來自將 每一個children 屬性成員的 character code 屬性相累加。
-
正文節點來自一序列的連續的信息項。其節點的字串值來自連接每一個字符信息項 character code 屬性。.
-
處理指令節點來自處理指令的信息項。其擴展名的局域部分來自 target 屬性。(其擴展名的命名空間 URI 部分為空。)其字串值來自content 屬性。文檔類型定義信息項的孩子是處理指令項的無處理指令節點。
-
注釋節點來自注釋信息項。其字串值來自content 屬性。文檔類型定義信息項的孩子是注釋信息項的無注釋節點。
-
命名空間節點來自命名空間聲明信息項。其擴展名的局域部分來自prefix 屬性。(其擴展名的命名空間 URI 部分為空。)其字串值來自命名空間 URI 屬性。.