使用 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 对子元素进行排序的主要内容,如果未能解决你的问题,请参考以下文章