在XSLT深度

时间:2016-10-27 23:29:59

标签: xml xslt recursion xpath hierarchical-data

我有一些令人沮丧的扁平XML,看起来像这样:

<groups>
    <group id="1" depth="1" />
    <group id="2" depth="2" />
    <group id="3" depth="2" />
    <group id="4" depth="3" />
    <group id="5" depth="2" />
    <group id="6" depth="3" />
</groups>

depth的最大值似乎是5

我希望将其转换为如下所示的XML:

<groups>
    <group id="1" depth="1">
        <group id="2" depth="2">
        </group>
        <group id="3" depth="2">
            <group id="4" depth="3">
            </group>
        </group>
        <group id="5" depth="2">
            <group id="6" depth="3">
            </group>
        </group>
    </group>
</groups>

认为我需要使用xsl:key,然后为每个parentDepth匹配跟随节点depth = parentDepth + 1 < em>直到我到达了一个depth <= parentDepth的节点,但我不确定如何实现这样的规则。

我认为另一种合乎逻辑的方法可能是从&#34;底部&#34;并找到具有depth = childDepth - 1的最新节点,但我不确定是否可以在XSLT中实现。

我还不确定这是否可以针对每个深度递归完成?

我正在使用XSLT 1.0。

1 个答案:

答案 0 :(得分:3)

  

我想我需要使用xsl:key,然后才能使用parentDepth次匹配   具有depth = parentDepth + 1

以下节点

不,你需要以相反的方向看待它:让每个孩子找到它的父母并学习它的唯一身份,这样就可以被它调用。

XSLT 1.0

<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="*"/>

<xsl:key name="child" match="group" use="generate-id(preceding-sibling::group[@depth=current()/@depth - 1][1])" />

<xsl:template match="/groups">
    <xsl:copy>
        <xsl:apply-templates select="group[@depth=1]"/>
    </xsl:copy>
</xsl:template>

<xsl:template match="group">
     <group id="{@id}" depth="{@depth}">
        <xsl:apply-templates select="key('child', generate-id())"/>
    </group>
</xsl:template>

</xsl:stylesheet>