XSLT是树层次结构的平面列表

时间:2017-08-29 07:33:45

标签: xml xslt xpath transformation flat

我最近遇到了一个问题,我还没有找到一个好的解决方案。

Iam给出了一个具有平面层次结构的XML文件,并希望将其转换为定义的层次结构。

<xml_file>
<dd/>
<b/>
<b/>
<dd/>
<b/>
<b/>
<dd/>
<k/>
<b/>
<b/>
<dd/>
<b/>
<b/>
</xml_file>

我想把它变成:

<xml_file>
    <dd>
        <b/>
        <b/>
    </dd>
    <dd>
        <b/>
        <b/>
    </dd>
    <dd>
        <k>
           <b/>
           <b/>
        </k>
    </dd>
    <dd>
        <b/>
        <b/>
    </dd>
</xml_file>

使用xslt 2.0执行此操作的最佳方法是什么?

非常感谢你的帮助。

修改

对不起。我没有真正解释它..

我给出了按照列表中顺序组织的元素列表。

dd 之后的所有 b k 应该是前一个 dd 的子项。

k 之后的所有 b 应该是前一个 k 的子项。

1 个答案:

答案 0 :(得分:1)

您可以使用

<xsl:template match="xml_file">
    <xsl:copy>
        <xsl:for-each-group select="*" group-starting-with="dd">
            <xsl:copy>
                <xsl:for-each-group select="current-group() except ." group-starting-with="k">
                    <xsl:choose>
                        <xsl:when test="self::k">
                            <xsl:copy>
                                <xsl:apply-templates select="current-group() except ."/>
                            </xsl:copy>
                        </xsl:when>
                        <xsl:otherwise>
                            <xsl:apply-templates select="current-group()"/>
                        </xsl:otherwise>
                    </xsl:choose>
                </xsl:for-each-group>
            </xsl:copy>
        </xsl:for-each-group>
    </xsl:copy>
</xsl:template>

加上身份转换模板。