XMLStarlet:使用小于/大于的选择节点

时间:2016-03-01 17:32:47

标签: xpath xmlstarlet

XMLStarlet是否允许您使用小于/大于运算符来过滤属性值?例如,考虑这样的文档:

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

{代码}

有没有办法选择值大于&#34; x&#34;?的节点?这个XPath似乎不适用于XMLStarlet 1.5.0:

//node[@val > 'x']

这也不是:

//node[@value gt 'x']

1 个答案:

答案 0 :(得分:0)

比较像数字(ASCII值/ UniCode代码点)这样的字符(遗憾的是)在XPath 1.0中是不可能的,如果对更多细节感兴趣,请查看this SO question

因此,如果您的@val属性在XML中排序,则可以使用简单的XPath表达式选择“等于”匹配后的所有节点来实现此目的:

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

如果没有,则必须使用XSLT样式表。幸运的是,XMLStarlet能够应用XSL-Stylesheets。我引用他们的概述:

  • 将XSLT样式表应用于XML文档(包括EXSLT支持,并将参数传递给样式表)

因此,您可以使用xsl:sort来应用xsl:stylesheet来实现所需的结果,http://www.mywebsite.it能够按字符排序。

<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>