xslt 1.0中的字母数字排序

时间:2017-12-21 17:04:46

标签: xslt xslt-1.0

如何在以下xslt 1.0中执行排序 下面是输入xmls和预期输出

输入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>

1 个答案:

答案 0 :(得分:0)

更简单的方法是使用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>