2016-03-01 48 views
0
的節點

XMLStarlet允許您使用小於/大於運算符來過濾屬性值嗎?例如,考慮這樣一個文件:XMLStarlet:選擇使用小於/大於

<xml> 
<list> 
    <node name="a" val="x" /> 
    <node name="b" val="y" /> 
    <node name="c" val="z" /> 
    etc. 
</list> 

{}代碼

有沒有辦法選擇的節點,其值是「X」更大?這個XPath似乎不使用XMLStarlet 1.5.0工作:

//node[@val > 'x'] 

也沒有這樣的:

//node[@value gt 'x'] 
+2

xmlstarlet只支持xpath 1.0,所以字符串比較僅限於'='和'!='。請參閱http://stackoverflow.com/questions/11125944/how-to-compare-strings-with-xpath-1-0 –

回答

0

比較字符,如他們的數字(ASCII值/ Unicode代碼點)是(不幸)不可能XPath 1.0,如果對更多細節感興趣,請看this SO question

因此,如果您@val屬性在XML排序,你可以用一個簡單的XPath表達式選擇一個「平等」比賽結束後所有節點實現這一目標:

//node[@val='x']/following-sibling::node 

如果沒有,你不得不使用一個XSLT樣式表。幸運的是,XMLStarlet能夠應用XSL樣式表。我從他們的概述舉:

  • 應用XSLT樣式表將XML文檔(包括EXSLT支持和參數傳遞到樣式表)

所以你必須申請一個xsl:stylesheet使用,以達到預期效果的可能性xsl:sort,它可以按字符排序。

<xsl:template match="/list"> 
    <xsl:for-each select="//node"> <!-- all nodes sorted by 'val' attribute' --> 
    <xsl:sort select="@val" data-type="text" order="ascending" case-order="upper-first"/> 
    <xsl:value-of select="@name" /> <!-- or whatever output you desire --> 
    </xsl:for-each> 
</xsl:template>