如何使用XPath在一组元素中查找属性的最小值?

如果我有XML:

<foo> <bar id="1" score="192" /> <bar id="2" score="227" /> <bar id="3" score="105" /> ... </foo> 

我可以使用XPath来查找score的最小值和最大值吗?

编辑 :我正在使用的工具( Andarielant任务)不支持XPath 2.0解决scheme。

这是一个稍微简短的解决scheme。

最大值:

 /foo/bar/@score[not(. < ../../bar/@score)][1] 

最低:

 /foo/bar/@score[not(. > ../../bar/@score)][1] 

我已经编辑谓词,以便它适用于任何bar序列,即使您决定更改path。 请注意,属性的父项是它所属的元素。

如果将这些查询embedded到XSLT或ant脚本等XML文件中,请记住将< and >编码为&lt; 尊重&gt;

原来这个工具不支持XPath 2.0。

XPath 1.0没有花哨的min()max()函数,所以为了find这些值,我们需要对XPath逻辑稍微有点棘手,并比较节点的兄弟节点上的值:

最大值:

 /foo/bar[not(preceding-sibling::bar/@score >= @score) and not(following-sibling::bar/@score > @score)]/@score 

最低:

 /foo/bar[not(preceding-sibling::bar/@score <= @score) and not(following-sibling::bar/@score < @score)]/@score 

如果将这些查询embedded到XSLT或ant脚本等XML文件中,请记住将< and >编码为&lt; 尊重&gt;

这应该工作…

 max(foo/bar/@score) 

…和…

 min(foo/bar/@score) 

…检查这个函数的参考 。

我偶然发现了线程,并没有find一个适合我的答案,所以最终我最终使用的是哪个…

输出最低值,当然,您可以select从具有最低值的节点输出@id而不是您select。

 <xsl:for-each select="/foo"> <xsl:sort select="@score"/> <xsl:if test="position()=1"> <xsl:value-of select="@score"/> </xsl:if> </xsl:for-each> 

同样的最大值:

 <xsl:for-each select="/foo"> <xsl:sort select="@score" order="descending"/> <xsl:if test="position()=1"> <xsl:value-of select="@score"/> </xsl:if> </xsl:for-each> 

尝试这个:

 //foo/bar[not(preceding-sibling::bar/@score <= @score) and not(following-sibling::bar/@score <= @score)] 

也许这将在XPath 1.0上运行。

我知道这是五岁。 只要为可能search和碰到的人添加更多的选项。

类似这样的工作在XSLT 2.0中适用于我。

 min(//bar[@score !='']/@score) 

!=''是为了避免产生NaN值的空值(可能有更好的方法)

这是一个正在工作的xpath / xquery:

 //bar/@score[@score=min(//*[@score !='']/number(@score))]