简体   繁体   English

使用XSLT对子元素进行排序

[英]Sorting sub-elements with XSLT

I have an xml file that consists of several sub-elements. 我有一个由几个子元素组成的xml文件。 I'm trying to output all names alphabetically from my xml file via xsl but it doesn't seem to work. 我正在尝试通过xsl从我的xml文件中按字母顺序输出所有名称,但它似乎不起作用。

What am I doing wrong? 我究竟做错了什么?

data.xml 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 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 ). 您正在按错误的节点( characters|bodies|tires )用它们没有的东西( 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>

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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