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]