我如何在以下XSLT 1.0中执行排序以下是输入XML和输出预期
输入XML:
<?xml version="1.0" encoding="utf-8"?>
<input>
<a attr1="2B"></a>
<a attr1="0003"></a>
<a attr1="1"></a>
<a attr1="AA"></a>
<a attr1="2A"></a>
<a attr1="AB"></a>
<a attr1="2"></a>
<a attr1="1A"></a>
<a attr1="04"></a>
<a attr1="3C"></a>
</input>
预期输出:
<output>
<a attr1="1"></a>
<a attr1="1A"></a>
<a attr1="2"></a>
<a attr1="2A"></a>
<a attr1="2B"></a>
<a attr1="0003"></a>
<a attr1="3C"></a>
<a attr1="04"></a>
<a attr1="AA"></a>
<a attr1="AB"></a>
</output>
更轻松的方法是使用 sort
函数忽略零(在您的情况下)和内部循环/input/a ,请参见下面的XSL(编辑):
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="xml" omit-xml-declaration="yes"/>
<xsl:template match="/">
<output>
<xsl:for-each select="/input/a">
<xsl:sort select="not(number(format-number(translate(@attr1, translate(@attr1, '1234567890', ''), ''), '#')))" order="ascending" />
<xsl:sort select="number(format-number(translate(@attr1, translate(@attr1, '1234567890', ''), ''), '#'))" order="ascending" data-type="number"/>
<xsl:copy-of select="."/>
</xsl:for-each>
</output>
</xsl:template>
</xsl:stylesheet>
因此,即使您的XML更为复杂(扩展主)如下:
<?xml version="1.0" encoding="utf-8"?>
<input>
<a attr1="2B"></a>
<a attr1="0003"></a>
<a attr1="1"></a>
<a attr1="AA"></a>
<a attr1="2A"></a>
<a attr1="AB"></a>
<a attr1="2"></a>
<a attr1="1A"></a>
<a attr1="04"></a>
<a attr1="3C"></a>
<a attr1="7"></a>
<a attr1="5K"></a>
<a attr1="100"></a>
<a attr1="10"></a>
<a attr1="11M"></a>
<a attr1="00015"></a>
<a attr1="15A"></a>
</input>
结果将如预期:
<output>
<a attr1="1"/>
<a attr1="1A"/>
<a attr1="2"/>
<a attr1="2A"/>
<a attr1="2B"/>
<a attr1="0003"/>
<a attr1="3C"/>
<a attr1="04"/>
<a attr1="5K"/>
<a attr1="7"/>
<a attr1="10"/>
<a attr1="11M"/>
<a attr1="00015"/>
<a attr1="15A"/>
<a attr1="100"/>
<a attr1="AA"/>
<a attr1="AB"/>
</output>
,是由主要输入XML转换产生的:
<output>
<a attr1="1"/>
<a attr1="1A"/>
<a attr1="2"/>
<a attr1="2A"/>
<a attr1="2B"/>
<a attr1="0003"/>
<a attr1="3C"/>
<a attr1="04"/>
<a attr1="AA"/>
<a attr1="AB"/>
</output>