XSLT1.0中的字母数字排序

XSLT1.0中的字母数字排序,xslt,xslt-1.0,Xslt,Xslt 1.0,如何在以下XSLT1.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

如何在以下XSLT1.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>
<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>

更简单的方法是使用
排序
函数忽略零(在您的情况下)和内部循环/input/a,请参见下面的XSL(编辑的):


因此,即使您的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>
<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>
<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>
<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>


为什么
0003
2B
之后(同样
04
3C
之后)?因为0003相当于3,04相当于4。“0A”是在“1”之前还是在“AA”之前(在“04”之后)?在这种情况下,前导的0会被算作一个数值,还是像其他数值中的0一样被忽略?@antoh顺序是04,0A,AA。因此,前导0将被忽略。@attr1值是否总是先编号(如果有),然后是字符?可以有任意顺序的多个数字和多个字母吗?如果后面有一个零呢?如10A所示。然后10A排序,在2A之前。而且,我很好奇为什么排序数据类型是qname。@Bluewood66您是对的,它将与它的具体示例一起工作。为什么您使用qname作为数据类型?@Bluewood66请查看编辑的版本,看起来它现在更具动态性。@O.F.我不知怎的得到了以下输出。AA和AB应在1之前。