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