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/>
<y/>
</x>
<x>
<y/>
<y/>
</x>
下表演示如何选择特定的 <x> 和 <y> 元素。
表达式 |
引用 |
---|---|
x/y[1] |
每个 <x> 内的第一个 <y>。 |
(x/y)[1] |
<x> 元素内 <y> 元素的整个集中的第一个 <y>。 |
x[1]/y[1] |
第一个 <x> 内的第一个 <y>。 |
上面的示例简单地引用使用暗示默认值(例如 child:: 轴)的 XPath 集合。对于此轴,子节点集合按照前向文档顺序编制索引。
对于其他轴(例如 ancestor::),在 XPath 表达式中明确使用轴名。对于此轴,上级集合按照后向文档顺序编制索引。从上表中考虑此示例:
x/y[1]
此表达式等效于以下表达式:
x/child::y[1]
两个表达式都意味着“对于每个 <x> 元素,选择名为 <y>. 的第一个子元素”。
下面的示例使用了相同的语法。
x/ancestor::y[1]
此示例意味着“对于每个 <x> 元素,选择第一个名为 <y> 的上级元素(按相反的文档顺序)”。语法相同但是顺序相反。
查找集合中的最后一个元素
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/author) |
所有是来自当前上下文节点的任何 <book> 元素的子元素的 <author> 元素。 |
author[(degree or award) and publication] |
所有包含至少一个 <degree> 或 <award> 元素和至少一个 <publication> 元素的 <author> 元素。 |