提问人:John Saunders 提问时间:3/16/2011 更新时间:3/16/2011 访问量:4724
XPATH 表达式,用于选择具有两个子项的父项,而这两个子项具有子项
XPATH Expression to Select Parent With Two Children Which Have Children
问:
我有一个类似于这样的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>
答:
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]]
这将查找具有两个或多个子项的元素,每个子项都有一个子项。ElementA
ElementB
ElementC
评论
0赞
Wayne
3/16/2011
很好。一个狡辩:你可能不需要谓词,因为他没有指定存在多个谓词,即使他的例子显示了多个。ElementC[2]
ElementC
1赞
3/17/2011
+1 最佳答案。如果至少有两个,那么就有第二个。所有这些都没有将接近度计入计数。
0赞
valid
9/30/2014
如果要将选择限制为正好有两个子项,请使用 .foo
bar
//foo[count(bar)=2]
评论