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

时间:2014-01-31 15:09:44

标签: xpath

假设我有以下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检索我需要的东西?

2 个答案:

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