настроить xsl: sort - xslt V1 - PullRequest
       1

настроить xsl: sort - xslt V1

2 голосов
/ 05 декабря 2011

У меня есть xml со следующим узлом ContractLength, и он имеет 4 возможных значения:

Нет, 1 год, 2 года, 3 года

Мне интересно, можно ли отсортировать их в порядке, указанном выше ...

<xsl:sort select="ContractLength" order="ascending" data-type="text"/>

дает мне 1 год, 2 года, 3 года, нет

<xsl:sort select="ContractLength" order="ascending" data-type="text"/>

Дает мне нет, 3 года, 2 года, 1 год

но я хочу, чтобы None рассматривался как 0, что приводит к None, 1 год, 2 года, 3 года

Я ограничен использованием xslt V1.0

Сортировка xsl в настоящее время вписывается в код следующим образом:

<xsl:choose>
  <xsl:when test="$sort = 'greenpower'">
      <xsl:apply-templates select="Product">
          <xsl:sort select="GreenPercent" order="descending" data-type="number" />
      </xsl:apply-templates>
  </xsl:when>
  <xsl:when test="$sort = 'estimatedcost'">
      <xsl:apply-templates select="Product">
          <xsl:sort select="EstimatedCost/Maximum" order="ascending" data-type="number" />
      </xsl:apply-templates>
  </xsl:when>
  <xsl:when test="$sort = 'contractterm'">
      <xsl:apply-templates select="Product">
          <xsl:sort select="ContractLength" order="ascending" data-type="text"/>
      </xsl:apply-templates>
  </xsl:when>
</xsl:choose>

1 Ответ

2 голосов
/ 05 декабря 2011

Хороший вопрос, + 1.

Это преобразование :

<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
 <xsl:output omit-xml-declaration="yes" indent="yes"/>
 <xsl:strip-space elements="*"/>

 <xsl:template match="node()|@*">
     <xsl:copy>
       <xsl:apply-templates select="node()|@*"/>
     </xsl:copy>
 </xsl:template>

 <xsl:template match="/*">
     <xsl:copy>
       <xsl:apply-templates select="*">
        <xsl:sort select="number(substring-before(.,' '))"
                  data-type="number"/>
       </xsl:apply-templates>
     </xsl:copy>
 </xsl:template>
</xsl:stylesheet>

при применении к следующему документу XML (ни один не был предоставлен)!!!):

<t>
 <clen>2 year</clen>
 <clen>none</clen>
 <clen>1 year</clen>
 <clen>3 year</clen>
</t>

дает требуемый, правильный результат :

<t>
   <clen>none</clen>
   <clen>1 year</clen>
   <clen>2 year</clen>
   <clen>3 year</clen>
</t>

Объяснение :

number(substring-before('none',' '))

равно NaN

и NaN ставится перед любым другим числом при сортировке с data-type="number".

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...