max()输出正确的数字,count()=“正确的数字”选择正确的节点,但是count()= max()失败

时间:2019-06-10 18:38:11

标签: xpath

这是of this question的分支,并尝试使用this answer-但出了点问题...

这是代码:

 <table>
       <row>
           <column/>
       </row>
       <row>
           <column/>
           <column/>
           <column/>
       </row>
       <row>
           <column/>
           <column/>
       </row>  
</table>

目标是<row>,最多有<column>个孩子。

表达式

./table/row/count(column)

正确地止住

  

1、3、2

表达式

max(./table/row/count(column))

正确输出

  

3

表达式

./table/row[count(column) = 3]

正确选择目标行。但是-表达式

./table/row[count(column) = max(./table/row/count(column))]

没有匹配结果。

我使用不正确吗?还是只是这样?

3 个答案:

答案 0 :(得分:1)

在XPath表达式中,谓词中的context item./table/row。由于count(column)column的子代,因此row与当前节点有关并成功。您的max(...)表达式也与此context item row相关,但是它没有./table/row/count(column)子级,因此返回空。

使用这样的相对表达式返回两个级别确实可以解决此问题:

./table/row[count(column) = max(../../table/row/count(column))]

否则,如果要使用绝对路径,也可以使用

./table/row[count(column) = max(/table/row/count(column))]

在两种情况下(对于您的示例)结果都是相同的。

答案 1 :(得分:1)

您快到这里了...引起问题的唯一原因是范围。

这是正确的xpath。

./table/row[count(column) = max(/table/row/count(column))]

在原始xpath“ ./table/row[count(column)= max( / table / row / count(column))]”)中,max中的点不过是什么将范围限制为当前节点,例如./table/row。在检查所有表行以查找最大列时,应删除max函数中的

答案 2 :(得分:1)

要获得更好的可读性和更快的评估速度,请使用XPath 2.0的全部功能:

 for $vMax in max(/table/row/count(column))
    return
       /table/row[count(column) eq $vMax]