【发布时间】:2011-01-10 20:46:01
【问题描述】:
给定 XML
<a>
<c>
<b id="1" value="noob"/>
</c>
<b id="2" value="tube"/>
<a>
<c>
<b id="3" value="foo"/>
</c>
<b id="4" value="goo"/>
<b id="5" value="noob"/>
<a>
<b id="6" value="near"/>
<b id="7" value="bar"/>
</a>
</a>
</a>
和 Xpath 1.0 查询
//b[@id=2]/ancestor::a[1]//b[@value="noob"]
上面的 Xpath 返回节点 id 1 和 5。目标是将结果限制为节点 id=1,因为它是唯一的 @value="noob" 元素,它是同一 <a> 的后代(@987654326 @) 也是的后代。
换句话说,“查找所有 b 元素,其值为“noob”,它们是 a 元素的后代,该元素也有一个 id 为 2 的后代,但是不是任何其他 a 元素的后代”。怎么这么纠结?实际上,id 编号和值是可变的,并且会有数百种节点类型。
如果 id=2,我们期望返回元素 id=1 而不是 id=5,因为它包含在另一个 a 元素中。如果 id=4,我们期望返回 id=5,但不返回 id=1,因为它不在第一个祖先中的元素为 id=4。
编辑: 基于 Dimitre 和 Alejandro 的 cmets,我发现 this 有用的博客条目解释了 count() 与 | union 运算符以及其他一些出色的技巧。
【问题讨论】:
-
好问题,+1。请参阅我的答案以获得比当前接受的答案更简单的解决方案以及可以理解的解释。 :)
标签: xpath