XSLT - 在应用模板中对动态节点进行分组

XSLT - Grouping dynamic nodes within apply-template

我有一个这样的xml,

<doc>
    <aa type="xx">aaaa</aa>
    <aa type="xx">bbbb</aa>
    <aa type="yy">ccccc</aa>
    <aa type="zz">dddd</aa>
    <aa type="yy">eeee</aa>
    <aa type="xx">ffff</aa>
    <aa type="yy">gggg</aa>
</doc>

在我的场景中type属性是一个变量,我需要通过检查type属性将上面的xml按顺序分组,出现在top的type attr值应该优先,所以输出应该是

<doc>
    <aa type="xx">aaaa</aa>
    <aa type="xx">bbbb</aa>
    <aa type="xx">ffff</aa>
    <aa type="yy">ccccc</aa>
    <aa type="yy">eeee</aa>
    <aa type="yy">gggg</aa>
    <aa type="zz">dddd</aa>       
</doc>

由于type属性值是一个变量(我不知道确切的type值),我写了一个模板如下,

<xsl:template match="doc">
    <doc>
        <xsl:apply-templates select="aa[@type='{@type}']"/>
    </doc>
</xsl:template>

使用 group-by 实现一个方法来完成任务会更容易,但我可以只使用 apply-template

我了解到您想以有序的方式在所有 <aa> 节点上应用模板。您可以使用 for-each 执行此操作,它允许排序:

<xsl:template match="doc">
    <doc>
        <xsl:for-each select="aa">
            <xsl:sort select="@type"/>
            <xsl:apply-templates select="."/>
        </xsl:for-each>
    </doc>
</xsl:template>