Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用XPath 1.0查找最大子计数_Xpath - Fatal编程技术网

使用XPath 1.0查找最大子计数

使用XPath 1.0查找最大子计数,xpath,Xpath,我能找到一个具有最多XPath子节点的XML节点吗 <xml> <node id="1"> <child /> <node> <node id="2"> <child /><child /> <node> <node id="3"> <child /><child /> <node> <node

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

我认为这是不可能的,因为要计算子节点,需要函数
count()
,该函数有一个参数-节点集,并返回该集中元素的计数。因此,您无法选择如何计数多个节点集以获得最大值


注意:我说的是XPath 1.0,我也不认为这是可能的(基于我没有做到这一点:)。当然,如果允许您更改xml(即使只是在处理过程中临时更改),您可以将其更新为将子计数作为节点上的属性(或作为节点值本身),然后很容易:

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

但你可能已经知道了

我认为可能有效的另一件事是,按照鸽子洞原理做一些聪明的数学运算,将总的子计数和
节点的数目作为输入,并生成max节点必须具有的最小子计数,然后执行以下操作

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

但我很快意识到,我无法想出这样一个公式来正确处理所有情况——例如,如果有10个
节点
s的子计数为10,991,1,(其余的也为1),对数字27和10的任何处理都不会产生一个包括10但不包括9的分界点。

我知道这很古老,但如果它能帮助任何人,我想这样做,我认为这很有效,至少对我来说是这样的:

/xml/node[count(./child)>count(在同级::node/child之后)和count(./child)>count(在同级::node/child之前)]


我对Xpath不太在行,所以可能我遗漏了一些东西。

我得出了相同的结论,但我会让这个问题继续讨论,也许有一些聪明的方法。@Tomalak我知道如何在XQuery中做到这一点,我认为Xpath 2.0也提供了一些方法(有变量、循环等)但不幸的是,我不能使用XPath2.0,所以我无法帮助您。@Gaim:问题的目标是1.0。我忘了提了,问题编辑。谢谢你尝试解决这个问题。:-)我想得越多,我就越相信这实际上是不可能的。我认为这在其他情况下会失败,例如,如果只有一个孩子,它会选择。
/xml/node[child[position()=formula_for_magic_number_goes_here]]