xsl:sort 不对数据进行排序

xsl:sort not sorting data

我需要以下 xml 来对 id 字段进行排序:

<top>
<repeat1>
    <repeat2>
        <contents>
            <contentitem>
                <id>9</id>
                <moretags1/>
                <moretags2/>
            </contentitem>
        </contents>
    </repeat2>
</repeat1>
<repeat1>
    <repeat2>
        <contents>
            <contentitem>
                <id>6</id>
                <moretags1/>
                <moretags2/>
            </contentitem>
        </contents>
    </repeat2>
</repeat1>
<repeat1>
    <repeat2>
        <contents>
            <contentitem>
                <id>3</id>
                <moretags1/>
                <moretags2/>
            </contentitem>
        </contents>
    </repeat2>
</repeat1>
</top>

这样排序:

<top>
<repeat1>
    <repeat2>
        <contents>
            <contentitem>
                <id>3</id>
                <moretags1/>
                <moretags2/>
            </contentitem>
        </contents>
    </repeat2>
</repeat1>
<repeat1>
    <repeat2>
        <contents>
            <contentitem>
                <id>6</id>
                <moretags1/>
                <moretags2/>
            </contentitem>
        </contents>
    </repeat2>
</repeat1>
<repeat1>
    <repeat2>
        <contents>
            <contentitem>
                <id>9</id>
                <moretags1/>
                <moretags2/>
            </contentitem>
        </contents>
    </repeat2>
</repeat1>
 </top>

换句话说,我希望 contentitem 分组保持不变,但在结果 xml 中按 ID 顺序列出。我正在尝试使用以下 xsl 但没有任何运气。

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes" method="xml"/>
<!--                                                -->
<xsl:strip-space elements="*"/>
<!--                                                -->
<xsl:template match="node()|@*">
    <xsl:copy>
        <xsl:apply-templates select="node()|@*"/>
    </xsl:copy>
</xsl:template>
<!--                                                -->
<xsl:template match="contents">
    <xsl:copy>
        <xsl:apply-templates select="contentitem">
            <xsl:sort select="id" data-type="number" order="ascending"/>
        </xsl:apply-templates>
    </xsl:copy>
</xsl:template>
</xsl:stylesheet>

看来您应该对 repeat1 元素进行排序,而不是对 contents 元素进行排序。

试试这个 XSLT:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output omit-xml-declaration="yes" indent="yes" method="xml"/>
<xsl:strip-space elements="*"/>

<xsl:template match="node()|@*">
    <xsl:copy>
        <xsl:apply-templates select="node()|@*"/>
    </xsl:copy>
</xsl:template>

<xsl:template match="top">
    <xsl:copy>
        <xsl:apply-templates select="repeat1">
            <xsl:sort select="repeat2/contents/contentitem/id" data-type="number" order="ascending"/>
        </xsl:apply-templates>
    </xsl:copy>
</xsl:template>
</xsl:stylesheet>