如果需要使用第二个标记的相对路径,如何在两个标记之间通过XPath选择所有标记

时间:2014-10-21 13:00:32

标签: xml xpath

我有这样的xml结构:

<orange attr="orangeXXX"/>

<apple attr="somedata" attr2="xxx"/>
<apple attr="somedata" attr2="yyy"/>
...
<apple attr="somedata" attr2="zzz"/>

<orange attr="orangeYYY"/>

<apple attr="somedata" attr2="aaa"/>
<apple attr="somedata" attr2="bbb"/>
...
<apple attr="somedata" attr2="ccc"/>

<orange attr="orangeZZZ"/>

我想在<orange attr="orangeXXX"/>之后获取<orange attr="orangeYYY"/>与下一个标记之间的所有标记:

<apple attr="somedata" attr2="xxx"/>
<apple attr="somedata" attr2="yyy"/>
...
<apple attr="somedata" attr2="zzz"/>

我创建了这样的XPath来获取这些标记:

/apple[@attr="somedata" and preceding-sibling::orange[@attr="orangeXXX"] 
                        and following-sibling::orange[@attr="orangeYYY"]]

问题是我在这里使用直接属性'orangeYYY',但我想避免直接使用这个属性并使用一些相关结构。

是否有可能制作这样的XPath,可以在<orange attr="orangeXXX"/><orange attr="orangeYYY"/>之间使用“orangeYYY”值来标记这些标签?

谢谢!

1 个答案:

答案 0 :(得分:2)

一种可能的方式:

/apple[
        @attr="somedata" 
            and 
        preceding-sibling::orange[@attr="orangeXXX"] 
            and 
        count(following-sibling::orange)=count(preceding-sibling::orange[@attr="orangeXXX"]/following-sibling::orange)
      ]

密钥位于第二个and之后的部分:

count(following-sibling::orange)=count(preceding-sibling::orange[@attr="orangeXXX"]/following-sibling::orange)

上面的表达式计算当前<orange>节点之后的<apple>兄弟节点的数量,并且仅返回<apple><orange>的数量等于orange[@attr="orangeXXX"]兄弟姐妹的数量{{1}} } node。

相关问题