我有这样的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”值来标记这些标签?
谢谢!
答案 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。