Xpath 正在根节点中查找x节点的第n个实例

Xpath 正在根节点中查找x节点的第n个实例,xpath,Xpath,假设我有以下xml <root> <x> <y /> <z> <y /> </z> <n> <m> <y />* </m> </n> </x> &l

假设我有以下xml

<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]