Сравнение персонажей, как они были числа (значения 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>
xmlstarlet поддерживает только xpath 1.0, поэтому сравнение строк ограничено '=' и '! ='. См. Http://stackoverflow.com/questions/11125944/how-to-compare-strings-with-xpath-1-0. –