2011-12-05 36 views
2

我有后续节点ContractLength XML,它有4倍可能的值:定制的xsl:排序 - XSLT V1

无,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> 
+0

请参阅此链接:http://stackoverflow.com/questions/7795474/can-you-define-a-custom-collat​​ion-using-a-function-in-xslt。第二个答案是XSLT 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> 

说明:当data-type="number"分类

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

NaN

NaN到来之前任何其它号码。