使用XPath 1.0查找最大子计数

时间:2010-01-07 11:22:04

标签: xpath

我可以找到一个XPath最多的孩子的XML节点吗?

<xml>
  <node id="1">
    <child />
  <node>
  <node id="2">
    <child /><child />
  <node>
  <node id="3">
    <child /><child />
  <node>
  <node id="4">
    <child /><child /><child />
  <node>
  <node id="5">
    <child /><child /><child />
  <node>
</xml>

我想用一个纯XPath 1.0表达式选择节点4或节点5。

3 个答案:

答案 0 :(得分:2)

我知道这已经很老了,但如果它可以帮助任何人,我想这样做,我认为这样做,至少它对我有用:

/ xml / node [count(./ child)&gt; count(follow-sibling :: node / child)和count(./ child)&gt;计数(前同辈节点:: /子)]

我对Xpath不太好,所以也许我错过了什么。

答案 1 :(得分:1)

我认为这是不可能的,因为要计算你需要函数count()的子函数,它有一个参数 - node-set并返回此集合中元素的数量。所以你没有选择如何计算更多的节点集而不是一个节点集来获得最大值。

注意:我在谈论XPath 1.0

答案 2 :(得分:1)

我也不认为这是可能的(基于我无法做到的事实:))。当然,如果您被允许更改xml(即使只是在此处理期间暂时),您可以更新它以将子计数作为属性放在节点上(或作为节点值本身),之后很容易:

/xml/node[not(../node/@childCount > ./@childCount)]

/xml/node[not(../node > .)]

但你可能已经知道了。

我认为可能有用的另一件事是沿着鸽子洞原则线做一些聪明的数学,把孩子的总数和node的数量作为输入,并产生一个最小的儿童数量。 max-node 必须,然后执行

/xml/node[child[position()=formula_for_magic_number_goes_here]]

但我很快意识到我无法想出能够正确处理所有情况的公式 - 例如,如果有10个node个子计数为10,99 1,1, (其余1也是如此),对数字27和10的操纵数量不会产生包括10但不包括9的截止点。