XML查詢語言
作者: Jonathan Robie等 譯者: 王緒勝 寫作日期:2000-4-1
Jonathan Robie, Texcel, Inc.
Joe Lapp, webMethods, Inc.
David Schach, Microsoft Corporation
合作:
Michael Hyman, Microsoft Corporation
Jonathan Marsh, Microsoft Corporation
摘要:
XML查詢語言(XQL) 是用于定位和過濾XML文檔中元素和文本的符號。它是XSL模式語法的自然擴展,為指向特定的元素或查找具有指定特征的節點提供了簡明的可以理解的符號。該建議于1998年9月提交給XSL工作小組(http://www.w3.org/Style/XSL/Group/1998/09/XQL-proposal.html),在考慮XSL模式語法的擴展時作為基礎輸入。相關文檔查詢和轉換XML說明了將本建議中的XML查詢和轉換語言基于XSL轉換語言和模式語言擴展的優點。
------------------------------------------------------------------------
目錄:
1. 導言
2. XML模式
2.1. 上下文
2.2. 返回結果
2.3. 集合
2.4. 查詢子女及后代
2.5. 搜集元素子女
2.6. 查找屬性
2.7. 分組
2.8. 過濾
2.9. 布爾表達式
2.9.1. 布爾和與布爾或
2.9.2. 布爾非
2.10. 等值
2.10.1. 比較和向量
2.10.2. 比較和文字
2.10.3. 比較過程中文字轉化
2.11. 方法
2.11.1. 信息方法
2.11.1.1. text()
2.11.2. 集合索引函數
2.11.3. 簡化
2.12. 集合中索引
2.12.1. 查找集合中最末元素
3. XQL擴展
3.1. 命名空間
3.1.1. 命名空間方法
3.2. 查找屬性集合
3.3. 比較
3.3.1. 數據類型
3.3.2. 類型轉換函數
3.4. 任一(any)和所有(all)語義
3.5. 并和交
3.6. 集合方法
3.6.1. 文檔根部的DOM節點
3.7. 聚集函數
3.8. 附加方法
3.9. 祖先
3.10. 范圍操作符
Appendix A. XQL巴克斯范式
A.1. 符號說明
A.2. 術語
A.2.1. 值
A.2.2. 節點
A.2.3. 源節點
A.2.4. 文檔順序
A.2.5. 索引
A.2.6. 查找上下文
A.2.7. 參考節點
A.2.8. 參考節點集合
A.2.9. 查找上下文集合
A.2.10. 模式匹配
A.3. 查詢條件
A.3.1. 條件產生規則
A.3.2. 數字
A.3.3. 文本
A.3.4. 根
A.3.5. 點
A.3.6. 元素名稱
A.3.7. 屬性名稱
A.3.8. 調用
A.3.8.1. 參數
A.3.8.2. 函數
A.3.8.2.1. ancestor()
A.3.8.2.2. attribute()
A.3.8.2.3. comment()
A.3.8.2.4. date()
A.3.8.2.5. element()
A.3.8.2.6. id()
A.3.8.2.7. node()
A.3.8.2.8. pi()
A.3.8.2.9. textNode()
A.3.8.2.10. true(), false()
A.3.8.3. 方法
A.3.8.3.1. baseName()
A.3.8.3.2. count()
A.3.8.3.3. end()
A.3.8.3.4. index()
A.3.8.3.5. namespace()
A.3.8.3.6. nodeName()
A.3.8.3.7. nodeType()
A.3.8.3.8. nodeTypeString()
A.3.8.3.9. prefix()
A.3.8.3.10. text()
A.3.8.3.11. rawText()
A.3.8.3.12. value()
A.4. 查詢操作符
A.4.1. 操作符優先級
A.4.2. 操作符產生規則
A.4.3. 分離
A.4.4. 關聯
A.4.5. 否定
A.4.6. 交
A.4.7. 并
A.4.8. 比較
A.4.8.1. 操作數值-左手接收右手值
A.4.8.2. 關系
A.4.8.3. 類型轉換
A.4.8.4. 排序順序
A.4.8.5. 比較操作的值
A.4.9. 路徑
A.4.9.1. 一元子女操作符
A.4.9.2. 一元后代操作符
A.4.9.3. 二元子女操作符
A.4.9.4. 二元后代操作符
A.4.9.5. 路徑操作的值
A.4.10. Bang操作符
A.4.11. 子界
A.4.12. 過濾
A.4.13. 分組
A.5. 查詢
A.6. 語法限制
Appendix B. 示例數據
------------------------------------------------------------------------
1. 導言
XSL 模式語言( http://www.w3.org/TR/WD-xsl, section 2.6) 提供了易于理解的方式描述待處理節點。它是說明性而不是過程性語言,只需使用類目錄結構的簡單模式描述需要查找節點的類型。例如,book/author表示查找包含在book元素中的author元素。
XQL(XML查詢語言)提供對XSL模式語言的自然擴展。在XSL表示類型節點的基礎上增加了布爾邏輯,過濾,節點集合索引等。
XQL是特定為XML文檔設計,它是一種通用查詢語言,提供用于查詢,定位和模式的簡單語法。XQL精煉,簡單,具有強大的功能。
請注意術語XQL是本建議中對查詢語言的工作術語,并不意味著我們準備永久使用該術語。
對于論證XQL及其理論背景的優秀論文,請參照Jonathan Robie的論文The Design of XQL。
以下是XQL的設計目標:
XQL字符串必須緊湊;
XQL應該易于打字和閱讀;
XQL語法應簡單,以便用于簡單和通常情況;
XQL應該用易于嵌入程序,腳本和XML或HTML屬性的字符串表述;
XQL應易于分析;
XQL應該用嵌入URL的字符串表述;
XQL應能夠指定XML文檔中可能的任何路徑和指定任何條件集合以查找路徑上的節點;
XQL應能唯一指定XML文檔中的所有節點;
XQL查詢可以返回任何數量的結果,包括0;
XQL查詢是說明性,而非過程性。即:說明查找什么,而不是如何查找。這一點尤為重要,因為查詢優化器必須能夠自由選擇索引和其他結構以便高效地找到結果。
XQL查詢可以在文檔的任何級別開始計算,而不必從文檔根元素開始導航;
XQL查詢按照文檔順序,無重復地返回結果。
盡管XQL是XSL模式語言的超集,XQL設計用于許多情況,可以用于提供節點的鏈接,查找信息和許多其他應用。
XQL是從文檔中查詢信息的符號,這些信息可能是一個節點集合、節點關系信息或導出值。本說明書沒有指定輸出的格式,查詢結果可能是單個節點、節點列表、XML文檔、其他結構序列。即:XQL并不指定返回的二進制格式,而是邏輯結果。
在一些實現中,查詢結果可能是一個XML文檔或者是傳回XQL的樹。在其他情況下,結果可能是其他類型的結構,例如:指向節點指針的集合。因此,封閉性并不能保證,如果實現方案返回XML文檔,則該文檔必須格式良好,從而保證了封閉性。
2. XML模式
本節描述XQL核心符號。所有的XQL實現必須滿足這些特征,而且在不同技術使用中作為基本功能。
XQL基本語法模仿URI目錄導航語法,但不是通過物理文件結構指定導航,而是通過XML樹的元素。
例如,下例URI表示在bar目錄中查找foo.jpg文件:
bar/foo.jpg
類似地,在XQL中,下例表示查找在baz元素中查找fuz元素集合:
baz/fuz
在整篇文章中,涉及許多示例,它們都參照附錄Sample Data中的數據。
2.1. 上下文
“上下文”是當前查詢操作的節點集合。該術語在附錄A中正式定義。要理解上下文的概念,考慮包含多個節點的樹。從根節點開始查找所有命名為“X”的節點將返回結果集合,從樹枝開始查找所有命名為“X”的節點將返回不同的結果集合。因此,查詢結果取決于執行時的上下文。有許多不同方法可以用于指定查詢的輸入上下文。
XQL允許查詢在當前上下文和“根上下文”選擇作為輸入上下文。“根上下文”是一個包含文檔中最根部元素的上下文。缺省地,查詢使用當前上下文,以“/”(前傾斜)作為前綴的查詢使用根上下文。查詢可以隨意使用“./”(點,前傾斜)作為前綴顯式說明使用當前上下文。這兩個符號都是文件系統導航符號的模擬。“./”前綴只在一種情況下必須存在。使用“//”操作符表示遞歸后代。當該操作符出現在查詢開頭時,初始的“/”引起相對于文檔或存儲根部的遞歸后代執行。前綴
“.//
”允許查詢當前上下文的遞歸后代。
示例:
在當前上下文中查找所有author元素。由于句點不單獨使用,該例向前應用了其他特征
:
./author
請注意,該例等價于:
author
查找文檔中的根元素(bookstore):
/bookstore
在當前文檔中查找所有出現在任何地方的author元素:
//author
在文檔根部查找所有book元素的style屬性值與bookstore元素specialty屬性值相等的所有book元素。
book[/bookstore/@specialty = @style]
2.2. 返回結果
XQL表達式返回的集合在定義范圍內保持文檔順序,層次結構和標識。即:元素集合總是無重復地以文檔順序返回,屬性集合將無重復地返回,但由于屬性無順序地定義,返回集合并不意味著順序。
2.3. 集合
帶有特定標記名稱的所有元素集合用標記名稱自身表示。元素查詢可以被限定在當前上下文“./”,但當前上下文是認定的,通常無需顯式指定。
示例:
查找所有first-name元素。下列例子是等價的:
./first-name
first-name
查找所有未限定的book元素:
book
查找所有first.name元素:
first.name
2.4. 查詢子女和后代
某些類型的元素集合可以用路徑操作符(“/”或“//”)指定。路徑操作符將左部作為查詢來源的參數集合,右部表示需要查詢的元素。子女操作符(“/”)查詢左部元素集合的直接子女集合,后代操作符(“//”)查詢左部元素集合的任意后代集合。事實上,“//”可以被視為一個或者多個層次結構的替代方案。注意路徑操作符在查詢過程中改變上下文。通過將其串在一起,用戶可以“深鉆”進入文檔內部。
示例:
在author元素中查找所有first-name元素。首先查找當前環境的author子女,然后查找相對于author元素環境的first-name子女:
author/first-name
在bookstore元素一級或多級以下(任意后代),查找所有title元素:
bookstore//title
注意,該例與下述查找所有bookstore元素的孫子title元素的查詢并不相同:
bookstore/*/title
查找在book/excerpt元素中任意位置的emph元素,而且book/excerpt元素在
bookstore元素中任意位置:
bookstore//book/excerpt//emph
在當前環境一級或多級以下查找所有title元素。注意該情況本來是要求句點符號的唯一情況:
.//title
2.5. 搜集元素子女
可以不用標記名稱而用“*”集合引用一個元素。“*”集合不管子女元素的標記名稱,返回當前環境的所有子女元素。
示例:
查找author元素的所有子女元素:
author/*
查找book元素的所有last-name孫子元素:
book/*/last-name
查找當前環境的所有孫子元素:
*/*
查找具有指定屬性的所有元素。注意該例使用了在過濾一節涉及的子查詢和在查找屬性一節討論的屬性:
*[@specialty]
2.6. 查找屬性
屬性名稱用“@”符號開頭。XQL設計公平對待屬性和子元素,在可能的情況下,兩種類型的能力是等價的。
注意:屬性不能包含子元素。因此,在查詢中屬性不能使用路徑操作符。否則將導致語法錯誤。同樣地,屬性天生沒有順序,索引不能用于屬性。
示例:
查找當前環境的style屬性:
@style
在當前環境中查找price元素的exchange屬性:
price/@exchange
下例不是有效的查詢:
price/@exchange/total
查找所有包含style 屬性的book元素。注意該例使用了在過濾一節涉及的子查詢:
book[@style]
查找所有book元素的style屬性:
book/@style
2.7. 分組
為使操作清晰清晰或者常用的優先級不足以表示某個操作時,圓括號可以用于將集合操作符分組。
2.8. 過濾
通過對集合增加過濾子句“[ ]”,可以對任何集合進行限制和分枝。過濾是SQL中包含ANY語義的WHERE子句的模擬。過濾子句中包含了一個查詢,稱為子查詢。子查詢計算出布爾值,對集合中的每一個元素進行測試。集合中未通過子查詢測試的元素將從結果集合中省略。
為方便起見,如果集合放于過濾之中,如果集合中包含元素,則產生布爾值TRUE;如果集合為空,則產生FALSE。本質上,如author/degree的表達式表示集合到布爾值的轉換函數,象如下虛構的“存在一個”方法:
author[.there-exists-a(degree)]
注意,在表達式的給定級別上可以出現任何數目的過濾,但空過濾是不允許的。
示例:
查找至少包含一個excerpt元素的book元素:
book[excerpt]
查找至少包含一個excerpt元素的book元素的所有title:
book[excerpt]/title
查找至少包含一個excerpt元素的book元素的author,而且author元素至少包含一
個deg
ree元素:
book[excerpt]/author[degree]
查找包含author元素的book元素,而且author元素至少包含一個degree元素:
查找包含excerpt和title的所有book元素:
2.9. 布爾表達式
布爾表達式可以在子查詢中使用。例如,可以使用布爾表達式查找特定值的節點集合,或者特定范圍的節點集合。布爾表達式采取${op}$的形式,而{op}可以是任何{b|a}形式的表達式-即:操作符接收左值和右值參數,返回布爾結果。應用可以根據需要提供附加的布爾操作符,但實現結果令人氣餒。注意XQL表達式一節定義了附加的布爾操作符。操作符是大小寫敏感的。
2.9.1. 布爾與和布爾或
$and$和$or$用于執行布爾與和布爾或。
布爾操作符,和分組括號結合起來,可以用于構成非常復雜的邏輯表達式。
注意空格是無意義的,可以被省略,或者如下所示包含空格,用于增加可讀性。
示例:
查找至少包含一個degree元素和一個award元素的author元素:
author[degree $and$ award]
查找至少包含一個degree元素或者award元素,而且包含至少一個publication元素的author元素:
author[(degree $or$ award) $and$ publication]
2.9.2. 布爾非
$not$是用于子查詢中表達式值求反的布爾操作符。
示例:
查找至少包含一個degree元素,而且不包含publication元素的author元素:
author[degree $and$ $not$ publication]
查找包含publication元素,而且不包含degree元素和award元素的author元素:
author[$not$ (degree $or$ award) $and$ publication]
2.10. 等值
“=” 符號用于相等判斷,“!=”用于不相等判斷。作為選擇,$eq$和$ne$ 也可用于相等和不相等。單引號或雙引號可以用于在表達式中分隔字符串,使得在腳本語言中創建或傳遞XQL變得更為容易。
對于比較元素值而言,暗含了value()方法。也就是說,last-name < ‘foo’實際
上表示last-name!value() < foo 。
請注意,過濾總是和上下文相關的。即:表達式book[author]表示對每一個找到的book元素,查看其是否包含author子元素。同樣地,book[author = Bob ] 表示對每一個找到的book元素,查看其是否包含命名為author,且值為’Bob’的子元素。你也可以通過使用“.”(句點) 查看當前上下文的值。例如,book[. = Trenton ]表示對每一個找到的book元素,查看其值是否等于’ Trenton’。
示例:
查找last name等于Bob的所有author:
author[last-name = Bob ]
author[last-name $eq$ Bob ]
查找from屬性不等于 Harvard 的所有author:
degree[@from != Harvard ]
degree[@from $ne$ Harvard ]
查找last-name 與/guest/last-name 相同的所有author:
author[last-name = /guest/last-name]
查找文本為’ Matthew Bob’ 的所有author:
author[. = Matthew Bob ]
2.10.1. 比較與向量
比較的左值可以是一個向量或數量。而比較的右值必須是一個數量或者一個可以在運行時轉換為數量的值。
如果比較的左值是一個集合,那么any(exists)語義用于比較操作符。也就是說,如果集合中的任何元素滿足條件,則比較結果為真。
2.10.2. 比較與文字常量
表達式的左值不能是文字常量。也就是說,’1’=a是不允許的。
2.10.3. 比較過程的文字常量轉換
所有元素和屬性都是字符串,但是許多時候要求數字比較。
如果右值是一個屬性,text(lvalue)與text(rvalue)進行比較。
如果右值是一個文字常量,則運用下列規則:
常量類型 比較 示例
字符串
text(lvalue) op text(rvalue)
a < foo
整數
(long) lvalue op (long) rvalue
a < 3
實數
(double) lvalue op (double) rvalue
a < 3.1
不支持指數符號。
當元素包含類型時,參看數據類型 關于類型轉換的討論。
2.11. Methods
XQL為高級集合操作提供方法。這些方法提供節點的特定集合(查看集合方法),同時提供關于集合和節點的信息。
方法的形式為{方法}(參數表)。
考慮查詢book[author]。它將發現包含author元素的所有book。一般來講,我們稱對應于特定author的book元素為該author的參考節點。也就是說,每一個所檢查的author元素都是其中一個book元素的author(關于參考節點和其他術語的更為徹底的定義,請查看
Annotated XQL BNF附錄)。方法應用于參考節點。
例如:text()方法返回節點內包含的文字,不包括所有結構(也就是說,是包含在元素及其后代的所有文字節點的連接)。下列表達式將返回所有名為’Bob’的author:
author[text() = Bob ]
下例將返回包含first-name子節點,且該子節點的文字為’Bob’的所有author:
author[first-name!text() = Bob ]
下例將返回包含名為’Bob’的子節點的所有author:
author[*!text() = Bob ]
方法名稱是大小寫敏感的。
2.11.1. 信息方法
下列方法提供關于集合內節點的信息。這些方法返回字符串或數字,而且可以用于連接子查詢內的比較操作符。
text()
包含在元素內的文字。該方法連接所有后代節點的文字,不包括標記名稱或屬性值,注釋等。而且將如text()中討論一樣整理字符串。(返回字符串)
value()
返回一個元素值的類型轉換版本(參看Datatypes)。如果數據類型不支持或者該數據類型不提供,返回結果與text()相同。
nodeType()
返回一個指示節點類型的數字:
元素 1
屬性 2
文字 3
處理指令 7
注釋 8
文檔 9
nodeName()
節點的標記名稱,包括命名空間前綴(返回字符串)。
2.11.1.1. text()
text()方法連接所有節點后代的文字,根據節點屬性可選地規范化空白空間。如果節點或者最近的祖先節點的xml:space屬性設為’preserve’,空白空間將被保留。當空白空間規范化時,將在整個字符串范圍內進行。空格用于分隔節點間的文字。當實體引用在文檔中使用時,擴展時空格不出現在實體引用的周圍。
示例:
查找last name為’Bob’的author:
author[last-name!text() = Bob ]
該查詢等價于:
author[last-name = Bob ]
查找值為 Matthew Bob 的author:
author[text() = Matthew Bob ]
author[. = Matthew Bob ]
2.11.2. 集合索引函數
index() 返回父節點內該節點的索引號。索引號是從0開始的,所以0是第一個元素(返回一個數字) 。
查找前三個degree:
degree[index() $lt$ 3]
注意索引函數與父節點相關。考慮下列數據:
<x>
<y/>
<y/>
</x>
<x>
<y/>
<y/>
</x>
下列表達式在每一個x返回第一個y:
x/y[index() = 0]
2.11.3. 簡寫
對于比較的目的而言,如果省略了方法名,value()方法是暗含的。換句話說,當兩個項目進行比較時,比較在兩個項目的值之間進行。請記住在沒有類型信息時,value()返回文字。
下列例子是等價的:
author[last-name!value() = Bob $and$ first-name!value() = Joe ]
author[last-name = Bob $and$ first-name = Joe ]
price[@intl!value() = canada ]
price[@intl = canada ]
2.12. 集合內索引
XQL很容易在節點集合中發現一個特定的節點。簡單地將索引號放在方括號(‘[’和‘]’)里即可。序號是從0開始的。例如,下例查找第一個author元素:
author[0]
下例查找含有first-name子元素的第三個author元素:
author[first-name][2]
注意索引是相對于父節點。換句話說,考慮下列數據:
<x>
<y/>
<y/>
</x>
<x>
<y/>
<y/>
</x>
下列表達式將從每一個x中返回第一個y:
x/y[0]
下例將返回x內所有y組成的集合中的第一個y:
(x/y)[0]
下例將返回第一個x的第一個y:
x[0]/y[0]
2.12.1. 在集合中返回最后的元素
end()方法對集合的最后一個元素返回真。注意end()是相對父節點的。
示例:
查找最后的book:
book[end()]
查找每一個book元素的最后的author:
book/author[end()]
在book的所有author構成的集合中,查找最后的author:
(book/author)[end()]
3. XQL擴展
XQL功能提供在XQL客戶端所需的最小功能集合。XQL擴展描述了擴展XQL能力的額外的功能。
3.1. 命名空間
在查詢中建立命名空間是需要的。由于命名空間是局部范圍,這一點尤其重要。因
此,
XQL需要一個可以為查詢的全局范圍或者查詢內的局部范圍建立命名空間的機制。
盡管我們不得不建立明確的命名空間語法,該語法必須滿足下列要求:
該語法必須能夠設定一個缺省的命名空間用于查詢內部;
該語法必須能夠設定一個命名空間用于任何指定的范圍;
該語法必須能夠設定一個命名空間用于任何級別的查詢。換句話說,人們應該能夠
在查詢開始設定命名空間,即使它們并沒有用于查詢內部較深的元素;
該語法必須能夠建立一個匹配命名空間的長名稱的前綴。
如果沒有在查詢中指定命名空間,前綴則用于匹配。
如果命名空間定義在session上,而不是在每一個查詢基礎上,XQL處理器可以更有
效的地執行。本規范沒有為指定用于整個session的命名空間的集合描述API或XML格式。這是由應用定義的。
3.1.1. 命名空間方法
下列方法可以用于節點,返回命名空間信息。
baseName()
返回節點的名稱部分,不包括前綴。
Namespace()
返回節點命名空間的URI。
Prefix()
返回節點的前綴。
示例:
查找所有未加限定的book元素。注意該查詢不返回my:book元素:
book
查找所有包含前綴’my’的book元素。注意該查詢不返回未加限定的book元素:
my:book
查找所有包含前綴’my’而且含author子元素的book元素:
my:book[author]
查找所有包含前綴’my’的book元素,其中包含author子元素而且author子元素也
包含
前綴’my’:
my:book[my:author]
查找所有包含前綴’my’的所有元素:
my:*
在所有命名空間下查找所有的book元素:
*:book
在所有命名空間下查找所有元素:
*
在book元素中查找含前綴’my’的style屬性:
book/@my:style
3.2. 查找屬性集合
用@*可以返回元素的所有屬性,這一點對那些將屬性視為記錄域的應用程序具有潛在的作用。
示例:
查找所有當前元素上下文的所有屬性:
@*
查找所有命名空間下的所有style屬性:
@*:style
查找命名空間’my’下的所有屬性,包括命名空間’my’下元素的未加限定的屬性
:
@my:*
3.3. 比較
二進制比較操作符集合可以用于比較數字和字符串,結果返回布爾值。$lt$、 $le$、$gt$、 $ge$分別用于小于、小于或等于、大于、大于或等于。這些操作符也可用于大小寫不敏感的形式:$ieq$, $ine$, $ilt$, $ile$, $igt$, $ige$。
單引號或雙引號可以用于在表達式中分隔字符串,使得在腳本語言中創建或傳遞XQL變得更為容易。
所有元素和屬性都是字符串,但是許多時候要求數字比較。關于類型轉換信息,查看比較過程中文字常量轉換和數據類型。
<、<=、>和>=是$lt$, $le$, $gt$和$ge$的簡寫方式。
示例:
查找last name是’Bob’而且price>50的所有author元素:
author[last-name = Bob $and$ price $gt$ 50]
查找from屬性值不等于’Harvard’的所有author:
author[@from != Harvard ]
查找last name開始于’M’或更大字母的所有author:
author[last-name $ge$ M ]
查找last name開始于’M’、’m’或更大字母的所有author:
author[last-name $ige$ M ]
查找前兩個book元素:
book[index() $le$ 2]
查找publications超過10的所有author:
author[publications!count() $gt$ 10]
3.3.1. 數據類型
如果提供了數據類型,value()函數使用該類型決定元素的類型。對于比較目的而言,左值總是轉換為右值的類型,因此保證了類型在比較過程中不發生變化。任何不能強制轉換的左值將從結果集中省略。
3.3.2.類型轉換函數
XQL提供函數用于值的類型轉換。類型轉換函數可以轉換文字常量或集合。當前,只提供了date函數。它將值轉換為日期,該值必須是具有日期格式的XML數據類型。
示例:
查找所有在1995年1月5日前出版的book:
books[pub_date < date( 1995-01-01 )]
查找出版日期(pub_date)早于屬性first中存儲的值的所有book:
books[pub_date < date(@first)]
3.4. 任一(any)和所有(all)語義
作者可以通過$any$和$all$關鍵字顯式指示是否使用任一(any)和所有(all)語義。
$any$表示如果集合中的任一元素滿足條件,則條件為真。$all$表示如果集合中的所有元素滿足條件,則條件為真。
$any$和$all$關鍵字可以出現在任何表達式前。
示例:
查找其中一個last name是’Bob’的所有author元素:
author[last-name = Bob ]
author[$any$ last-name = Bob ]
查找所有last name都不是’Bob’的所有author元素:
author[$all$ last-name != Bob ]
查找第一個last name是’Bob’的所有author元素:
author[last-name[0] = Bob ]
3.5. 并(Union)和交(intersection)
$union$操作符返回多個元素,返回元素沒有重新排序,沒有重復元素,雙重指定是暗含的。選擇列表中的所有元素必須是當前選擇上下文的后代。注意:由于這是并操作,返回集合每一個類型列表中可能包含0或更多的元素。為限定返回集合至少包含列表中每一個元素,使用在過濾一節討論的過濾。是$union$的簡寫。
$intersect$操作符返回在兩個集合之間的公共元素。元素無需重新排序。
示例:
查找所有的first-name和last-name:
first-name $union$ last-name
從bookstore中查找所有book和magazine:
bookstore/(book | magazine)
查找所有book和所有author:
book $union$ book/author
查找所有的first-name、last-name、來自于book或magazine內author的degree:
(book $union$ magazine)/author/(first-name $union$ last-name $union$ degree)
查找author/first-name等于’Bob’的所有book和price小于10的所有magazine:
book[author/first-name = Bob ] $union$ magazine[price $lt$ 10]
3.6. 集合方法
集合方法為文檔中不同類型節點提供訪問方式。這些集合可以被約束和索引。集合返回滿足特定條件的參考節點的子節點集合。
textNode()
文字節點的集合。
Comment()
注釋節點的集合。
Pi()
處理指示節點的集合。
Element([ name ])
所有元素節點的集合。如果提供了可選的文字參數,將只返回匹配特定名稱的元素子節
點。The collection of all element nodes. If the optional text
parameter is p
rovided, it only returns element children matching that particular
name.
Attribute([ name ])
所有屬性節點的集合。如果提供了可選的文字參數,將只返回匹配特定名稱的屬性節點。
Node()
返回所有非屬性節點。
示例:
查找當前上下文中每一個p元素中的第二個文本節點:
p/textNode()[1]
查找文檔中第二個注釋節點。關于文檔根部上下文設置和細節,請查看上下文:
//comment()[1]
3.6.1. 文檔根部的DOM節點
請注意,在DOM中文檔對象包含注釋、處理指令、聲明、以及術語所稱的“根元素”。XQL使用術語“文檔實體”表示DOM樹的根―文檔對象-而不是“根元素”。 在用于定位的文檔實體層次允許注釋等。
示例:
查找文檔實體層次的所有注釋
/comment()
3.7. 聚合方法
下列方法基于一個集合產生聚合結果。
count() 返回集合中的節點數目。
3.8. 其他方法
下述方法返回指示節點類型的字符串。
nodeTypeString() 返回用于指示節點類型的下列字符串之一:
document
element
attribute
processing_instruction
comment
text
3.9. 祖先(ancestor)
Ancestor查找滿足查詢的最近祖先。結果返回一個元素或空集。
ancestor(query) 滿足提供查詢的最近祖先。.
示例:
查找當前元素的最近的book祖先:
ancestor(book)
查找包含在book元素最近的author祖先:
ancestor(book/author)
3.10. 腳標操作符
可以返回元素的排列。為實現該功能,在腳標操作符(方括號)內指定一個表達式而不是單個值。該表達式可以是逗號分隔的由下列條目組成的列表。
n
返回第n個元素
-n
返回從最后的元素倒數第n個元素。如:-1表示最后一個元素,-2表示倒數第2個元素。
M $to$ n
返回從m到n的元素,其中m,n是包含的。
示例:
查找第一個和第四個author元素:
author[0,3]
查找第一個到第四個author元素:
author[0 $to$ 3]
查找第一個,第三個到第五個和最后一個author元素:
author[0,2 $to$ 4, -1]
查找最后一個author元素:
author[-1]