-
XPath 集合
XPath 查询返回的集合在定义的范围内保留文档顺序 、层次结构和标识。也就是说,按照文档顺序返回元素集合,没有重复的元素 。因为根据定义,属性不排序 ,所以,为特定元素返回的属性不进行明确地排序。
具有特定标记名的所有元素的集合使用标记名本身表示。限定方法可以通过使用句点和正斜杠 (./ ) 表明元素是从当前上下文中选择,但是默认情况下将使用当前上下文,不必明确说明 。
表达式 | 引用 |
---|---|
./first-name | 所有 <first-name> 元素。注意,此表达式等效于后面的表达式。 |
first-name | 所有 <first-name> 元素。 |
为集合编制索引
使用 XPath 表达式可以很容易在节点集中查询特定的节点。只需为索引序号加上方括号。序号从 1 开始(第一个元素是编号 1)。
方括号字符 ([] ) 的优先级高于斜杠字符(/ 和 // )。有关更多信息,请参见运算符和特殊字符 。
示例:
表达式 | 引用 |
---|---|
author[1] | 第一个 <author> 元素。 |
author[first-name][3] | 具有 <first-name> 子元素的第三个 <author> 元素。 |
注意,索引相对于筛选的节点集。下表显示如何选择特定的 <x> 和 <y> 元素:
x/y[2] 每个 <x> 中的第二个 <y> ,可选择多个。 | (x/y)[2] <x> 与 <y> 组成的整个集合元素集的第三个 <y> ,有且仅有一个。 | x[2]/y[2] 第二个 <x> 中的第二个 <y> ,也有且仅有一个。 |
<x> <y/> <y/> </x> <x> <y/> <y/> </x> | <x> <y/> <y/> </x> <x> <y/> <y/> </x> | <x> <y/> <y/> </x> <x> <y/> <y/> </x> |
上面的示例简单地引用使用暗示默认值(例如 child:: 轴)的 XPath 集合。对于此轴,子节点集合按照前向文档顺序编制索引。
对于其他轴(例如 ancestor:: ),在 XPath 表达式中需明确使用轴名。对于此轴,上级集合按照后向文档顺序编制索引。从上表中考虑此示例:
x/y[1]
此表达式等效于以下表达式:
x/child::y[1]
两个表达式均意味着“对每个 <x> 元素选择第一个名为 <y> 的子元素”。
下面的示例使用了相同的语法。
x/y/ancestor::x[1]
此示例意味着“对每个 <y> 元素选择第一个名为 <x> 的祖先元素(按照后向文档顺序)”。语法相同但是顺序相反。
查找集合中的最后一个元素
last() 函数对集合中的最后一个元素返回 True。注意,last 相对于父节点。
示例:
表达式 | 引用 |
---|---|
book[last()] | 最后一个 <book> 元素。 |
book/author[last()] | 每个 <book> 元素中的最后一个 <author> 元素。 |
(book/author)[last()] | <book> 元素中整个 <author> 元素集的最后一个 <author> 元素。 |
分组
为了清楚起见,或正常的优先级不足以表达某个运算,可以使用括号为集合运算符分组。分组运 算符可以在任何筛选表达式(谓词)中使用,例如 author[(degree or award)and publication] 。也可以在顶级步长表达式中使用,例如 (book|magazine) 或 (author/degree | book/award) 。不能应用于低级步长表达式。例如,author/(degree | award) 无效。但另外 (book | magazine)/price是可以的,因为分组括号用在了第一级步长。
示例:
表达式 | 引用 |
---|---|
(book/author) | 属于当前上下文节点中任何 <book> 元素的子元素的所有 <author> 元素。 |
author[(degree or award) and publication] | 至少包含一个 <degree> 或 <award> 元素以及至少包含一个 <publication> 元素的所有 <author> 元素。 |