XPATH - 如何选择具有具有最大值的给定属性的子节点的节点?

时间:2013-01-27 22:06:51

标签: xml xpath xpath-1.0

例如:

<a>
  <b>
    <c1>c1 text</b1>
    <c2 c2attr="10">c2 text</b2>
    <c3>c3 text</b3>
  </b>
  <b>
    <c1>c1 text</b1>
    <c2 c2attr="5">c2 text</b2>
    <c3>c3 text</b3>
  </b>
</a>

我想选择<b>元素,其中<c2>子元素具有最大c2attr属性;在该示例中,第一个(10> 5)。

我试过了

/a/b[not(c2@c2attr <= preceding-sibling::c2@c2attr) and not(c2@c2attr <=following-sibling::c2@c2attr)]

但PHP说它无效......

1 个答案:

答案 0 :(得分:2)

您在@标志前缺少斜杠,您需要查找名为preceding-sibling的{​​{1}}元素,而不是b

c2

然而,这种检查在/a/b[not(c2/@c2attr <= preceding-sibling::b/c2/@c2attr) and not(c2/@c2attr <=following-sibling::b/c2/@c2attr)] 元素的数量上将是二次的,因为它将每个b与其他b进行比较。简单地提取所有b元素然后使用PHP代码迭代它们(一次)会更有效,跟踪到目前为止看到的最高b值以及{{1}属于的。这将是线性的而不是二次的。