gpt4 book ai didi

xslt - xsl :sort: sorting by numeric value

转载 作者:行者123 更新时间:2023-11-30 23:48:09 25 4
gpt4 key购买 nike

我必须按数字顺序整理代码。
代码有四个字符和四个数字。

例如,

COMP2100
COMP2400
COMP3410
LAWS2202
LAWS2250

当我只做 <xsl:sort select="code" order="ascending" />它显示上面的结果。

但是,我希望它按“数字顺序”排列,即
COMP2100
LAWS2202
COMP2250
COMP2400
COMP3410

我该怎么做呢?

最佳答案

注意:OP 现在提供了示例 XML。下面的理论可以简单地适用于这个 XML。

一、XSLT 1.0(第 1 部分)

这是一个简单的解决方案,假设您的断言(“代码有四个字符和四个数字”)始终如此:

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="1.0">
<xsl:output omit-xml-declaration="no" indent="yes" />
<xsl:strip-space elements="*" />

<xsl:variable name="vNums" select="'1234567890'" />

<xsl:template match="node()|@*">
<xsl:copy>
<xsl:apply-templates select="node()|@*" />
</xsl:copy>
</xsl:template>

<xsl:template match="/*">
<t>
<xsl:apply-templates>
<xsl:sort select="substring(., 5)"
data-type="number" />
</xsl:apply-templates>
</t>
</xsl:template>
</xsl:stylesheet>

...应用于想象的 XML 文档,随机排列:
<?xml version="1.0" encoding="utf-8"?>
<t>
<i>COMP3410</i>
<i>LAWS2202</i>
<i>COMP2400</i>
<i>COMP2100</i>
<i>LAWS2250</i>
</t>

...产生正确的结果:
<?xml version="1.0" encoding="utf-8"?>
<t>
<i>COMP2100</i>
<i>LAWS2202</i>
<i>LAWS2250</i>
<i>COMP2400</i>
<i>COMP3410</i>
</t>

解释:
  • Identity Transform —— XSLT 中最基本的设计模式之一(如果不是的话) —— 按原样将所有节点从源 XML 文档复制到结果 XML 文档。
  • 一个模板通过根据字符串中从位置 5 到字符串末尾的字符对 <t> 的所有子项进行排序来覆盖身份转换。

  • 同样,请注意,此解决方案假设您的原始断言——“代码有四个字符和四个数字”——是(并且永远是)正确的。

    II. XSLT 1.0(第 2 部分)

    一个(可能)更安全的解决方案是假设 <i> 节点内的不同位置可能有许多非数字字符。在这种情况下,这个 XSLT:
    <?xml version="1.0" encoding="utf-8"?>
    <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    version="1.0">
    <xsl:output omit-xml-declaration="no" indent="yes" />
    <xsl:strip-space elements="*" />

    <xsl:variable name="vNums" select="'1234567890'" />

    <xsl:template match="node()|@*">
    <xsl:copy>
    <xsl:apply-templates select="node()|@*" />
    </xsl:copy>
    </xsl:template>

    <xsl:template match="/*">
    <t>
    <xsl:apply-templates>
    <xsl:sort select="translate(., translate(., $vNums, ''), '')"
    data-type="number" />
    </xsl:apply-templates>
    </t>
    </xsl:template>
    </xsl:stylesheet>

    ...提供相同的结果:
    <?xml version="1.0" encoding="utf-8"?>
    <t>
    <i>COMP2100</i>
    <i>LAWS2202</i>
    <i>LAWS2250</i>
    <i>COMP2400</i>
    <i>COMP3410</i>
    </t>

    解释:
  • 再次使用 Identity Transform
  • 在这种情况下,附加模板使用所谓的 Double Translate Method (首先由 Michael Kay 提出,由 Dimitre Novatchev 首次向我展示)在排序之前从每个 <i> 元素的值中删除所有非数字字符。


  • 三。 XSLT 2.0 解决方案

    这是一个可能的 XSLT 2.0 解决方案,它与 XSLT 1.0 解决方案的第 2 部分非常相似;它只是用 XPath 2.0 处理正则表达式的能力替换了 Double Translate Method:
    <xsl:sort select="replace(., '[^\d]', '')" data-type="number" />

    请注意,在 XPath 2.0 中绝不需要使用正则表达式; Double Translate Method 与 XPath 1.0 中的工作方式一样好。然而, replace() 方法很可能更有效。

    关于xslt - xsl :sort: sorting by numeric value,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12449939/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com