XSLT使用字母和数字排序

问题描述 投票:0回答:2

我正在寻求帮助,以解决我正在应用到基本XML文件的XSLT样式表遇到的问题,该文件将为正在构建的表输出基本HTML。具体来说,我正在尝试将<xslt:sort select="" />应用于基于ID元素的输出内容,该ID元素包括文本(始终以字母“ A”开头)以及一位和两位数数字。但是,当我运行脚本时,它不能很好地处理两位数数字。当我希望A10出现在A9之后时,它会将A10放在A1之后。

示例XML源文件:

<categories name="Category name goes here" version="2020">
        <category name="A1">
            <error id="ABC.DEFGH1"/>
            <error id="ABC.DEFGH2"/>
            <error id="ABC.DEFGH3"/>
            <error id="ABC.DEFGH4"/>
            <error id="ABC.DEFGH5"/>
        </category>
        <category name="A2">
            <error id="ABC.DEFGH1"/>
            <error id="ABC.DEFGH2"/>
            <error id="ABC.DEFGH3"/>
            <error id="ABC.DEFGH4"/>
            <error id="ABC.DEFGH5"/>
        </category>
        <category name="A9">
            <error id="ABC.DEFGH1"/>
            <error id="ABC.DEFGH2"/>
            <error id="ABC.DEFGH3"/>
            <error id="ABC.DEFGH4"/>
            <error id="ABC.DEFGH5"/>
        </category>
        <category name="A10">
            <error id="ABC.DEFGH1"/>
            <error id="ABC.DEFGH2"/>
            <error id="ABC.DEFGH3"/>
            <error id="ABC.DEFGH4"/>
            <error id="ABC.DEFGH5"/>
        </category>

这是我的XSLT当前的样子:

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

我需要在此处添加什么才能正确考虑两位数的数字?非常感谢您的帮助!

xml xslt xsl-fo
2个回答
0
投票

似乎您在正确的轨道上,但是substring-before毫无用处,把事情搞砸了。尝试删除它:

<xsl:sort select="substring-after(@name, 'A')" data-type="number"/>

0
投票

您需要按以下方式更改排序。

XSLT

<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:output indent="yes" method="xml"/>

    <xsl:template match="/categories">
        <root>
            <xsl:for-each select="category">
                <xsl:sort select="substring-after(@name, 'A')" data-type="number"/>
                <xsl:copy-of select="."/>
            </xsl:for-each>
        </root>
    </xsl:template>
</xsl:stylesheet>
© www.soinside.com 2019 - 2024. All rights reserved.