user2023
user2023

Reputation: 47

Sorting sub-elements with XSLT

I have an xml file that consists of several sub-elements. I'm trying to output all names alphabetically from my xml file via xsl but it doesn't seem to work.

What am I doing wrong?

data.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>

sortnames.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>

The output is correct but not in alphabetical order:

<?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>

Thank you in advance.

Upvotes: 0

Views: 32

Answers (1)

michael.hor257k
michael.hor257k

Reputation: 116992

You are sorting the wrong nodes (characters|bodies|tires) by something they don't have (name). Try instead:

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

Upvotes: 1

Related Questions