2009-07-15 33 views

回答

16

原來該工具不支持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或螞蟻小號請記住編碼爲<>作爲&lt;尊重&gt;

+0

不錯的工作!我首先嚐試了排名最高的解決方案,但是這並不排除重複的最大值/最小值。 – udo 2015-08-20 09:16:02

5

這應該工作...

max(foo/bar/@score) 

......還有......

min(foo/bar/@score) 

...看看這個function reference

+0

確定。這是XPath 2.0,我會檢查它。 – brasskazoo 2009-07-15 00:22:54

+0

是的,XPath 2.0。 – 2009-07-15 00:30:14

3

試試這個:

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

也許這將在XPath 1.0中工作。

36

這是一個稍微縮短的解決方案。

最大:

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

最低:

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

我已經編輯了謂詞,以便它適用於任何bar序列,即使你決定改變路徑。請注意,屬性的父項是它所屬的元素。

如果嵌入在像XSLT或Ant腳本的XML文件這些查詢,請記住編碼<>&lt;尊重&gt;

4

我偶然發現了線索,並沒有找到適合我的答案,所以這裏是我最終結束了使用......

輸出的最低值,當然你可以選擇輸出來自具有最低值的節點的@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> 
3

我知道這是五歲。只要爲可能搜索和遇到此問題的人添加更多選項即可。

在XSLT 2.0中,類似這樣的工作對我來說很有用。

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

!=''是爲了避免帶來了NaN值一個空值(可能有一個更好的方式來做到這一點)

這裏是工作的XPath/XQuery的:

//bar/@score[@score=min(//*[@score !='']/number(@score))] 
相關問題