Xml 将平面列表XSLT到树层次结构

Xml 将平面列表XSLT到树层次结构,xml,xslt,xpath,transformation,flat,Xml,Xslt,Xpath,Transformation,Flat,我最近遇到了一个问题,我还没有找到一个好的解决办法 Iam提供了一个具有平面层次结构的XML文件,并希望将其转换为已定义的层次结构 <xml_file> <dd/> <b/> <b/> <dd/> <b/> <b/> <dd/> <k/> <b/> <b/> <dd/> <b/> <b/> </xml_file>

我最近遇到了一个问题,我还没有找到一个好的解决办法

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>

使用XSLT2.0实现这一点的最佳方法是什么

非常感谢你的帮助

编辑:

对不起。我没有很好地解释清楚

我得到了一个元素列表,这些元素按列表中的顺序组织

在add之后的所有bk都被认为是前一个dd的孩子

在ak之后的所有b都应该是前面的k的子对象

<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>


加上身份转换模板。

您的XML示例是否真正代表了您的实际XML?目前,它的格式不好,因为(除了
xml\u file
)没有任何标记具有关联的结束标记,这意味着XSLT将无法处理它。您需要解释层次结构“定义”的逻辑。感谢您的回复。我更新了我问题的描述。对每个以开头的组使用嵌套的
xsl: