【问题标题】:alphanumeric sort in xslt 1.0xslt 1.0 中的字母数字排序
【发布时间】:2017-12-21 17:04:46
【问题描述】:

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

【问题讨论】:

  • 为什么00032B 之后(同样043C 之后)?
  • 因为 0003 相当于 3,04 相当于 4。
  • “0A”会出现在“1”之前还是“AA”之前(在“04”之后)?在这种情况下,前导 0 会被计为数值,还是像其他数值中的 0 一样被忽略?
  • @AntonH 订单将是 04,0A,AA。所以前导 0 将被忽略。
  • @attr1 的值是否总是先编号(如果有),然后是字符?可以有多个数字和多个字母的任意顺序吗?

标签: xslt xslt-1.0


【解决方案1】:

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

【讨论】:

  • 如果后面有零怎么办?如10A。然后 10A 将排序,在 2A 之前。而且,我很好奇为什么排序数据类型是 qname。
  • @Bluewood66 你是对的,它会与它的具体例子一起工作。
  • 为什么使用qname作为数据类型?
  • @Bluewood66 请看修改后的版本,现在看起来更有活力了。
  • @O.F.我以某种方式得到以下输出。 AA 和 AB 在 1 之前缩小。 输出>
猜你喜欢
  • 2010-10-21
  • 2017-06-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-22
  • 2012-10-11
  • 1970-01-01
相关资源
最近更新 更多