Xpath:从每个子集获取具有特定标记的第一个节点

时间:2013-01-14 18:44:44

标签: xml xpath xml-parsing

对于这个例子,我想从每个b获得第一个t元素(真正的xml可能会更深层次嵌套)。不幸的是,我被限制在xpath 1.0。我最初的想法是//t//b[position()=1],但我无法让它发挥作用。

<t>
 <a>
   <b/>
   <b/>
   <b/>
 </a>
</t>
<t>
 <a>
   <b/>
   <b/>
   <b/>
 </a>
</t>

1 个答案:

答案 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,但这是显示两者之间微妙区别的边缘情况之一......