xsl:sort:按数值对两位数进行排序

xsl:sort: sorting double digit by numeric value

更新:示例并添加一些信息。

我必须在 XSLT 1.0 中按数字顺序整理下面的数字。 “代码”遵循以下模式:

例如,

<?xml version="1.0" encoding="ISO-8859-1"?>
<DATA>
    <CTX>
        <VA>
            <code>25896_1_1_1</code>
        </VA>   
        <VA>
            <code>25896_10_1_1</code>
        </VA>   
        <VA>
            <code>25896_2_1_2</code>
        </VA>   
        <VA>
            <code>25896_3_1_1</code>
        </VA>                       
        <VA>
            <code>25896_4_1_1</code>
        </VA>                           
        <VA>
            <code>25897_1_1_1</code>
        </VA>                           
        <VA>
            <code>25897_2_1_1</code>
        </VA>                           
        <VA>
            <code>25897_2_1_2</code>
        </VA>   
    </CTX>
</DATA>

    

当我执行 时,它会显示上面的结果。

但是,我希望它是这样的:

25896_1_1_1
25896_2_1_2
25896_3_1_1
25896_4_1_1
25896_10_1_1
25897_1_1_1
25897_2_1_1
25897_2_1_2

我该怎么做?

JAXP XSLT API (javax.xml.transform) 转换 xml 文件。使用 XSL 转换,引擎是 Saxon 6.5.5 // https://xml.apache.org/xalan-j/trax.html

要在纯 XSLT 1.0 中执行此操作,您需要以简单的方式执行此操作:

<xsl:sort select="substring-before(code, '_')" data-type="number"/>
<xsl:sort select="substring-before(substring-after(code, '_'), '_')" data-type="number"/>
<xsl:sort select="substring-before(substring-after(substring-after(code, '_'), '_'), '_')" data-type="number"/>
<xsl:sort select="substring-after(substring-after(substring-after(code, '_'), '_'), '_')" data-type="number"/>

如果你的处理器恰好支持EXSLT str:tokenize()扩展功能,你可以让它更优雅一点:

<xsl:sort select="str:tokenize(code, '_')[1]" data-type="number"/>
<xsl:sort select="str:tokenize(code, '_')[2]" data-type="number"/>
<xsl:sort select="str:tokenize(code, '_')[3]" data-type="number"/>
<xsl:sort select="str:tokenize(code, '_')[4]" data-type="number"/>

未测试,因为没有提供代码。