我有一个与此类似的XML结构:
<Header>
<ElementA>
<ElementB>
<ElementC/>
<ElementC/>
</ElementB>
<ElementB/>
</ElementA>
</Header>
其中<ElementB>
的序列可能为<ElementC>
,或者可能没有。{/ p>
我可以选择<ElementA>
个<ElementB>
个/Header/ElementA/ElementB/following-sibling::ElementB
个<ElementA>
个节点。我可以使用<ElementB>
选择包含<ElementC>
节点的/Header/ElementA/ElementB[ElementC]
个节点,其中包含<ElementA>
。
但是,如何选择包含<ElementB>
的{{1}}个节点,其中包含<ElementC>
后跟另一个<ElementB>
包含另一个<ElementC>
的节点。像这样:
<Header>
<ElementA>
<ElementB>
<ElementC/>
<ElementC/>
</ElementB>
<ElementB>
<ElementC/>
<ElementC/>
</ElementB>
</ElementA>
</Header>
答案 0 :(得分:9)
请注意,您不必显式搜索以下兄弟轴。这两种模式将返回相同的结果:
foo[bar/following-sibling::bar]
和
foo[bar[2]]
所以你的模式可以简单:
/Header/ElementA[ElementB[ElementC][2]]
会找到ElementA
个包含两个或更多ElementB
个孩子的元素,每个孩子都有一个ElementC
孩子。
答案 1 :(得分:3)
我可能刚刚回答了我自己的问题:
/Header/ElementA[ElementB[ElementC]/following-sibling::ElementB[ElementC]]
似乎有效。它之前似乎不起作用的原因是我的文件,所有88,000行,没有出现这种模式。这可能表示产生它的代码中存在错误,而不是我的XPATH表达式中的错误。
答案 2 :(得分:2)
嵌套谓词可以完成工作:
/Header/ElementA[ElementB[following-sibling::ElementB/ElementC]/ElementC]