对于这个例子,我想从每个(真正的 xml 可能嵌套更深)中获取第一个b元素。t不幸的是,我仅限于xpath 1.0. 我最初的想法是这样的,//t//b[position()=1]但我无法让它发挥作用。
<t>
<a>
<b/>
<b/>
<b/>
</a>
</t>
<t>
<a>
<b/>
<b/>
<b/>
</a>
</t>
对于这个例子,我想从每个(真正的 xml 可能嵌套更深)中获取第一个b元素。t不幸的是,我仅限于xpath 1.0. 我最初的想法是这样的,//t//b[position()=1]但我无法让它发挥作用。
<t>
<a>
<b/>
<b/>
<b/>
</a>
</t>
<t>
<a>
<b/>
<b/>
<b/>
</a>
</t>
这几乎是对的。首先注意谓词[position()=1]等同于 simple [1],从现在开始我将使用更短的形式。现在根据定义
//t//b[1]
是简写
//t/descendant-or-self::node()/child::b[1]
所以它会给你所有b嵌套在 a 内的元素,并且是它们各自父元素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但这是显示两者之间细微区别的边缘情况之一......