2016-03-01 36 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>