XPATH 表达式,用于选择具有两个子项的父项,而这两个子项具有子项

XPATH Expression to Select Parent With Two Children Which Have Children

提问人:John Saunders 提问时间:3/16/2011 更新时间:3/16/2011 访问量:4724

问:

我有一个类似于这样的XML结构:

<Header>
    <ElementA>
        <ElementB>
            <ElementC/>
            <ElementC/>
        </ElementB>
        <ElementB/>
    </ElementA>
</Header>

其中 可能有序列 ,也可能没有序列。<ElementB><ElementC>

我可以通过 .我可以选择包含一个节点的节点,该节点包含一个 using .<ElementA><ElementB>/Header/ElementA/ElementB/following-sibling::ElementB<ElementA><ElementB><ElementC>/Header/ElementA/ElementB[ElementC]

但是我如何选择包含一个包含一个的节点,然后是另一个包含另一个的节点。像这样的东西:<ElementA><ElementB><ElementC><ElementB><ElementC>

<Header>
    <ElementA>
        <ElementB>
            <ElementC/>
            <ElementC/>
        </ElementB>
        <ElementB>
            <ElementC/>
            <ElementC/>
        </ElementB>
    </ElementA>
</Header>
XML XPath

评论

0赞 Dimitre Novatchev 3/20/2011
@John-桑德斯:你可能会表现出一些尊重,并选择最好的答案(我认为这显然是@Robert-Rossney的答案)。
1赞 John Saunders 3/22/2011
@Dimitre:如果我在理解答案后接受答案,那将是最大的尊重。我离得很近,我没有忘记。

答:

3赞 John Saunders 3/16/2011 #1

我可能只是回答了我自己的问题:

/Header/ElementA[ElementB[ElementC]/following-sibling::ElementB[ElementC]]

似乎有效。它以前似乎不起作用的原因是我的文档,它的所有 88,000 行,都没有出现这种模式。这可能表示生成它的代码中存在错误,而不是我的 XPATH 表达式中的错误。

评论

0赞 Dimitre Novatchev 3/20/2011
@John-桑德斯:你可能会表现出一些尊重,并选择最好的答案(我认为这显然是@Robert-Rossney的答案)。
2赞 Wayne 3/16/2011 #2

嵌套谓词完成工作:

/Header/ElementA[ElementB[following-sibling::ElementB/ElementC]/ElementC]
9赞 Robert Rossney 3/16/2011 #3

请注意,您不必显式搜索以下同级轴。这两种模式将返回相同的结果:

foo[bar/following-sibling::bar]

foo[bar[2]]

因此,您的模式可以像以下几点一样简单:

/Header/ElementA[ElementB[ElementC][2]]

这将查找具有两个或多个子项的元素,每个子项都有一个子项。ElementAElementBElementC

评论

0赞 Wayne 3/16/2011
很好。一个狡辩:你可能不需要谓词,因为他没有指定存在多个谓词,即使他的例子显示了多个。ElementC[2]ElementC
1赞 3/17/2011
+1 最佳答案。如果至少有两个,那么就有第二个。所有这些都没有将接近度计入计数。
0赞 valid 9/30/2014
如果要将选择限制为正好有两个子项,请使用 .foobar//foo[count(bar)=2]