我有跟随节点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>
答案 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"
位于任何其他数字之前。