【问题标题】:Find the maximum child count with XPath 1.0使用 XPath 1.0 查找最大子数
【发布时间】:2010-01-07 11:22:03
【问题描述】:

我能否找到一个具有 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。

【问题讨论】:

    标签: xpath


    【解决方案1】:

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

    /xml/node[count(./child) > count(following-sibling::node/child) and count(./child) > count(preceding-sibling::node/child)]

    我对 Xpath 不是很好,所以也许我遗漏了一些东西。

    【讨论】:

    • 我认为这在其他情况下会失败,例如如果 只有一个孩子,它会选择
    【解决方案2】:

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

    注意:我说的是 XPath 1.0

    【讨论】:

    • 我得出了同样的结论,但我会把这个问题留得更久一些,也许有 一些聪明的方法。
    • @Tomalak 我知道如何在 XQuery 中做到这一点,我认为 XPath 2.0 也提供了一些方法(有变量、循环等)但不幸的是我不能 XPath 2.0 所以我可以帮不了你。
    • @Gaim:无论如何,这个问题都是针对 1.0 的。我忘了提,问题已编辑。
    【解决方案3】:

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

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

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

    但你可能已经知道了。

    我认为可能有用的另一件事是沿着鸽子洞原理线做一些聪明的数学运算,将孩子总数和nodes 的数量作为输入,并产生一个最小孩子数,即 max-节点必须有,然后做

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

    但我很快意识到我无法想出这样一个可以正确处理所有情况的公式 - 例如,如果有 10 个nodes 的子计数为 10、99 1、1,(和其余的也是 1s),对数字 27 和 10 的任何操作都不会产生一个包括 10 但不包括 9 的截止点。

    【讨论】:

    • 感谢您尝试解决问题。 :-) 我想得越多,就越相信这实际上是不可能的。
    猜你喜欢
    • 2018-12-17
    • 1970-01-01
    • 1970-01-01
    • 2021-12-14
    • 1970-01-01
    • 2019-11-10
    • 1970-01-01
    • 1970-01-01
    • 2020-08-30
    相关资源
    最近更新 更多