假设我有以下xml
<root>
<x>
<y />
<z>
<y />
</z>
<n>
<m>
<y />*
</m>
</n>
</x>
<x>
<y />
<z>
<y />
</z>
<y />*
</x>
</root>
我想检索那些跟随*
的y节点因此它始终是x祖先节点中的第三个节点
我尝试过类似的事情:
//x//y[3]
然而它不起作用我想它只有在y节点处于同一水平时才会起作用。
所以我试过了
(//x//y)[3]
但它只检索整个文档中的一个节点(第三个)
所以我尝试了类似的东西:
//x(//y)[3]
//x(//y[3])
//x//(y[3])
等。但我得到解析错误
有没有办法用xpath检索我需要的东西?
答案 0 :(得分:2)
使用:
//x/descendant::y[3]
这将选择文档中每个y
的每三个x
个后代。有时候写一个扩展的表达式来看看究竟发生了什么是有帮助的。在这种情况下,以下内容:
//x//y[3]
相当于:
/descendant-or-self::node()/child::x/descendant-or-self::node()/child::y[3]
这样写道很明显为什么它没有做你想要的(即它正在寻找y
元素的第三个孩子的任何x
和没有一个)。你真正想要的是每三个y
后代。这里完全展开了:
/descendant-or-self::node()/child::x/descendant::y[3]
这里的重要教训是知道XPath abbreviated syntax的确在做什么是值得的。该规范实际上非常易读。我建议看看。
答案 1 :(得分:1)
更新:这两个示例都只是XPath 2.0。
在XPath 1.0中:
/row//y/(ancestor::x//y)[3]
在XPath 2.0中:
for $x in /row//x
return ($x//y)[3]