XSLT - 如何按不同的属性值对多个元素进行排序

时间:2014-07-21 20:26:30

标签: xml sorting xslt

我正在尝试按组排序xml文档。我的样本xml如下:

<a>
    <b sortKey="e"></b>
    <b sortKey="b"></b>
    <d sortKey="b"></d>
    <d sortKey="a"></d>
    <c></c>
</a>

我想分别对所有b和所有d进行排序。 bd可能有不同的排序键。

我根据我在这里和其他地方看到的内容尝试了很多不同的选项,但是他们要么只给我排序的元素,要么给我排序的元素+剩下的元素。

这是我的一次尝试:

<xsl:stylesheet version="2.0"
                xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                xmlns:xs="http://www.w3.org/2001/XMLSchema"
                >
    <xsl:output method="xml" encoding="UTF-8" indent="yes"/>
    <xsl:strip-space elements="*"/>

    <xsl:template match="@*|node()">
        <xsl:copy>
            <xsl:choose>
                <xsl:when test="*[local-name()='b']">
                    <xsl:apply-templates select="@* | node()">
                        <xsl:sort select="@sortKey" />
                    </xsl:apply-templates>
                </xsl:when>
                <xsl:when test="*[local-name()='d']">
                    <xsl:apply-templates select="@* | node()">
                        <xsl:sort select="@sortKey" />
                    </xsl:apply-templates>
                </xsl:when>
                <xsl:otherwise>

                </xsl:otherwise>
            </xsl:choose>
        </xsl:copy>
    </xsl:template>
</xsl:stylesheet> 

这个所有元素的属性为sortKey,而不是bd

我是XSLT的菜鸟。所以任何帮助都非常感谢

ETA:我想要的xml就像这样

<a>
    <b sortKey="b"></b>
    <b sortKey="e"></b>
    <d sortKey="a"></d>
    <d sortKey="b"></d>
    <c></c>
</a>

1 个答案:

答案 0 :(得分:1)

这样的事情对你有用吗?

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

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

<xsl:template match="a">
    <xsl:copy>
        <xsl:apply-templates select="b">
            <xsl:sort select="@sortKey"/>
        </xsl:apply-templates>
        <xsl:apply-templates select="d">
            <xsl:sort select="@sortKey"/>
        </xsl:apply-templates>
        <xsl:apply-templates select="*[not(self::b or self::d)]"/>
    </xsl:copy>
</xsl:template>

</xsl:stylesheet>