通过基于属性对xml元素进行分组来更改xml结构

时间:2014-12-04 18:10:08

标签: xslt xslt-2.0 xslt-grouping

我必须根据属性在同一个xml结构中重新组合xml元素 我有一个像这样的xml

<a>
    <b>
        <c>
            <d1 att2="t1">test 1</d1>
            <d1>test 2</d1>
            <d1>test 3</d1>
            <d1 att2="t1">test 4</d1>
        </c>
    </b>
</a>

我需要将这个xml转换为

<a>
    <b>
        <c>
            <d1 att2="t1">test 1</d1>
            <d1 att2="t1">test 4</d1>
        </c>
    </b>
</a>
<a>
    <b>
        <c>
            <d1>test 2</d1>
        </c>
    </b>
</a>
<a>
    <b>
        <c>
            <d1>test 3</d1>
        </c>
    </b>
</a>

1 个答案:

答案 0 :(得分:0)

这是一个非常缺乏灵感/手动的努力,但似乎完成了工作。该模板将单独的分支应用于具有和不具有@att2属性的元素。

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

    <xsl:template match="/">
        <root>
            <xsl:for-each-group select="//d1[@att2]" group-by="@att2">
                <a>
                    <b>
                        <c>
                            <xsl:for-each select="current-group()">
                                <xsl:apply-templates select="." mode="nowrapper"></xsl:apply-templates>
                            </xsl:for-each>
                        </c>
                    </b>
                </a>
            </xsl:for-each-group>
            <xsl:apply-templates select="//d1[not(@att2)]" mode="wrapper" />
        </root>
    </xsl:template>

    <xsl:template match="d1" mode="wrapper">
        <a>
            <b>
                <c>
                    <xsl:apply-templates select="." mode="nowrapper" />
                </c>
            </b>
        </a>
    </xsl:template>

    <xsl:template match="d1" mode="nowrapper">
        <xsl:copy-of select="." />
    </xsl:template>

</xsl:stylesheet>