如果我有像XML:如何使用XPath在一組元素中查找屬性的最小值?
<foo>
<bar id="1" score="192" />
<bar id="2" score="227" />
<bar id="3" score="105" />
...
</foo>
我可以使用XPath找到score
的最小值和最大值?
編輯:我使用的工具(Andariel ant任務)不支持XPath 2.0解決方案。
如果我有像XML:如何使用XPath在一組元素中查找屬性的最小值?
<foo>
<bar id="1" score="192" />
<bar id="2" score="227" />
<bar id="3" score="105" />
...
</foo>
我可以使用XPath找到score
的最小值和最大值?
編輯:我使用的工具(Andariel ant任務)不支持XPath 2.0解決方案。
原來該工具不支持XPath 2.0。
的XPath 1.0沒有花哨min()
和max()
功能,所以要找到這些價值,我們需要有點棘手與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
如果嵌入XML文件中的這些查詢像XSLT或螞蟻小號請記住編碼爲<
和>
作爲<
尊重>
。
確定。這是XPath 2.0,我會檢查它。 – brasskazoo 2009-07-15 00:22:54
是的,XPath 2.0。 – 2009-07-15 00:30:14
試試這個:
//foo/bar[not(preceding-sibling::bar/@score <= @score) and not(following-sibling::bar/@score <= @score)]
也許這將在XPath 1.0中工作。
這是一個稍微縮短的解決方案。
最大:
/foo/bar/@score[not(. < ../../bar/@score)][1]
最低:
/foo/bar/@score[not(. > ../../bar/@score)][1]
我已經編輯了謂詞,以便它適用於任何bar
序列,即使你決定改變路徑。請注意,屬性的父項是它所屬的元素。
如果嵌入在像XSLT或Ant腳本的XML文件這些查詢,請記住編碼<
和>
爲<
尊重>
。
我偶然發現了線索,並沒有找到適合我的答案,所以這裏是我最終結束了使用......
輸出的最低值,當然你可以選擇輸出來自具有最低值的節點的@id,而不是您選擇的。
<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>
我知道這是五歲。只要爲可能搜索和遇到此問題的人添加更多選項即可。
在XSLT 2.0中,類似這樣的工作對我來說很有用。
min(//bar[@score !='']/@score)
的!=''
是爲了避免帶來了NaN值一個空值(可能有一個更好的方式來做到這一點)
這裏是工作的XPath/XQuery的:
//bar/@score[@score=min(//*[@score !='']/number(@score))]
不錯的工作!我首先嚐試了排名最高的解決方案,但是這並不排除重複的最大值/最小值。 – udo 2015-08-20 09:16:02