在同一个xpath查询中结合使用前后兄弟

时间:2010-08-02 14:54:31

标签: xpath

我有一个非常简单的问题,但我似乎无法解决它。假设我有以下代码:

<a>
    <b property="p1">zyx</b>
    <b>wvu</b>
    <b>tsr</b>
    <b property="p2">qpo</b>
    <b>qcs</b>
</a>

我想选择拥有b的{​​{1}}节点和property="p1" b节点之间的节点。我可以用前面的兄弟和下面的兄弟轴做任何一个,但我似乎无法找到如何将两者结合起来。

3 个答案:

答案 0 :(得分:19)

XPath 1.0

/a/b[preceding-sibling::b/@property='p1' and following-sibling::b/@property='p2']

XPath 2.0:
上面的表达式在XSLT 2.0中有一些怪癖,最好使用新的更安全的运算符<<(之前)和>>(之后)。

/a/b[../b[@property='p2'] << . and . >> ../b[@property='p1']]

答案 1 :(得分:7)

此外,这个XPath 1.0:

/a/b[preceding-sibling::b/@property='p1'][following-sibling::b/@property='p2']

注意:请勿使用//作为第一步。每当您可以用谓词替换and运算符时,请执行此操作。

在XPath 2.0中:

/a/b[. >> ../b[@property='p1']][../b[@property='p2'] >> .]

答案 2 :(得分:-1)

您可以使用and组合谓词中的测试。