Xpath 正在根节点中查找x节点的第n个实例
假设我有以下xmlXpath 正在根节点中查找x节点的第n个实例,xpath,Xpath,假设我有以下xml <root> <x> <y /> <z> <y /> </z> <n> <m> <y />* </m> </n> </x> &l
<root>
<x>
<y />
<z>
<y />
</z>
<n>
<m>
<y />*
</m>
</n>
</x>
<x>
<y />
<z>
<y />
</z>
<y />*
</x>
</root>
但是它不起作用,我想它只有在y节点处于同一级别时才起作用
所以我试过了
(//x//y)[3]
但它只检索整个文档中的一个节点(第三个节点)
所以我尝试了以下方法:
//x//y[3]
//x(//y)[3]
//x(//y[3])
//x//(y[3])
等等,但我得到了解析错误
是否有任何方法可以使用xpath检索我需要的内容?更新:这两个示例都只是xpath 2.0 在XPath 1.0中: 在XPath 2.0中:
for $x in /row//x
return ($x//y)[3]
使用:
这将每隔三分之一选择文档中每个x
的后代y
。有时写一个扩展表达式来看看到底发生了什么会有帮助。在这种情况下,应满足以下条件:
//x//y[3]
相当于:
/descendant-or-self::node()/child::x/descendant-or-self::node()/child::y[3]
以这种方式编写,很明显它为什么不做您想要的事情(即,它正在寻找任何y
,它是x
元素的第三个子元素,但没有)。你真正想要的是每三分之一的后代。在这里,它被完全扩展:
/descendant-or-self::node()/child::x/descendant::y[3]
这里的重要教训是,了解XPath真正在做什么是值得的。该规范实际上相当可读。我建议您看一看。XPath 1.0代码片段给出了
无效表达式
您使用的是什么XPath引擎?我在Saxon 9.5中测试了这个表达式,它成功了。它在旧版本的萨克森或Xalan中失败。可能Saxon 9.5将表达式计算为XPath 2.0…看起来您正在确认XPath 1.0问题。首先,当我研究这个问题时,它看起来像是“很容易解决”。但是,我只有XPath1.0,我找不到一种方法。。。疯了,没想到!但是,你的调查需要+1。可以等待XPath2.0最终得到更广泛的部署。(或事实标准)
/descendant-or-self::node()/child::x/descendant-or-self::node()/child::y[3]
/descendant-or-self::node()/child::x/descendant::y[3]