2016-03-01 3 views
0

Поддерживает ли XMLStarlet оператор меньшего или большего размера для фильтрации значения атрибута? Например, рассмотрим документ, как это:XMLStarlet: выбор узлов с использованием меньше или больше

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

{код}

Есть ли способ, чтобы выбрать узлы, значения которых больше, чем «х»? Это 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>