对于这个例子,我想从每个b
获得第一个t
元素(真正的xml可能会更深层次嵌套)。不幸的是,我被限制在xpath 1.0
。我最初的想法是//t//b[position()=1]
,但我无法让它发挥作用。
<t>
<a>
<b/>
<b/>
<b/>
</a>
</t>
<t>
<a>
<b/>
<b/>
<b/>
</a>
</t>
答案 0 :(得分:1)
这几乎是正确的。首先请注意,谓词[position()=1]
仅相当于[1]
,我将从现在开始使用较短的形式。现在按照定义
//t//b[1]
是
的简写//t/descendant-or-self::node()/child::b[1]
因此它会为您提供嵌套在b
内某处的所有t
个元素,并且是其各自父元素的第一个b
子元素。因此给出
<t>
<a>
<b attr="1"/>
<b attr="2"/>
</a>
<a>
<b attr="3"/>
</a>
</t>
你会得到b的1 和 3.如果你只希望每个b
内有第一个t
,那么你需要
//t/descendant::b[1]
鉴于上面的示例XML,这将只返回<b attr="1"/>
您通常可以将.//x
视为等同于descendant::x
,但这是显示两者之间微妙区别的边缘情况之一......