如何使用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 >
编码为<
尊重>
。
原来这个工具不支持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 >
编码为<
尊重>
。
这应该工作…
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))]