xsl:排序不排序数据

时间:2015-01-06 22:43:22

标签: xml xslt

我需要以下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分组保持不变,但是按照id的顺序在结果xml中列出。我正在尝试使用以下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>

1 个答案:

答案 0 :(得分:3)

看起来您应该对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>