简体   繁体   中英

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.

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>

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM