使用 XSLT 对子元素进行排序

Posted

技术标签:

【中文标题】使用 XSLT 对子元素进行排序【英文标题】:Sorting sub-elements with XSLT 【发布时间】:2019-05-08 12:42:57 【问题描述】:

我有一个由几个子元素组成的 xml 文件。我试图通过 xsl 从我的 xml 文件中按字母顺序输出所有名称,但它似乎不起作用。

我做错了什么?

数据.xml

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="sortnames.xsl"?>
<root>
    <characters>
        <character>
            <name>Baby Peach</name>
        </character>
        <character>
            <name>Baby Rosalina</name>
        </character>
    </characters>
    <bodies>
        <body>
            <name>Standard Kart</name>
        </body>
        <body>
            <name>Pipe Frame</name>
        </body>
    </bodies>
    <tires>
        <tire>
            <name>Standard</name>
        </tire>
        <tire>
            <name>Monster</name>
        </tire>
    </tires>
</root>

排序名称.xsl

    <xsl:stylesheet version="2.0"
        xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
        <xsl:output method="xml" indent="yes"/>
        <xsl:template match="/">
            <results>
                <xsl:for-each select="root/*">
                    <xsl:sort select="name"/>
                    <xsl:copy-of select=".//name"/>
                </xsl:for-each>
            </results>
        </xsl:template>
    </xsl:stylesheet>

输出正确但不按字母顺序:

<?xml version="1.0" encoding="UTF-8"?>
<results>
   <name>Baby Peach</name>
   <name>Baby Rosalina</name>
   <name>Standard Kart</name>
   <name>Pipe Frame</name>
   <name>Standard</name>
   <name>Monster</name>
   <name>Super Name</name>
   <name>Cloud Name</name>
</results>

提前谢谢你。

【问题讨论】:

【参考方案1】:

您将错误的节点 (characters|bodies|tires) 排序为他们没有的 (name)。试试吧:

<xsl:template match="/root">
    <results>
        <xsl:for-each select="*/*">
            <xsl:sort select="name"/>
            <xsl:copy-of select="name"/>
        </xsl:for-each>
    </results>
</xsl:template>

【讨论】:

以上是关于使用 XSLT 对子元素进行排序的主要内容,如果未能解决你的问题,请参考以下文章

如何获取具有相同名称的元素并根据 XSLT 中的子节点值对它们进行排序

XSLT 根据最大​​子节点对父节点进行排序

XSLT 1.0 / 使用条件对每个结果进行排序

XSLT 按两个子属性对父对象进行排序

使用 CDATA 元素对 xml 中的 uuid 进行排序的 xslt 模板

XSLT 用于根据元素的属性对特定 XML 标记的元素进行排序