自定义xsl:sort - xslt V1

时间:2011-12-05 11:48:25

标签: xslt sorting

我有跟随节点ContractLength的xml,它有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年

但我希望无被视为0,导致无,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 个答案:

答案 0 :(得分:2)

好问题,+ 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"位于任何其他数字之前。