我有一些令人沮丧的扁平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。
答案 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>