gpt4 book ai didi

xml - 将平面层次结构转换为 XSLT 深度的嵌套层次结构

转载 作者:行者123 更新时间:2023-12-02 00:34:23 24 4
gpt4 key购买 nike

我有一些令人沮丧的扁平 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以下节点直到我到达一个节点 depth <= parentDepth ,但我不确定如何实现这样的规则。

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

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

我正在使用 XSLT 1.0。

最佳答案

I think I need to use an xsl:key and then for each parentDepth match the following nodes that have depth = parentDepth + 1

不,你需要从相反的方向来看:让每个 child 找到它的 parent 并学习它的唯一id,这样它就可以被它调用。

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>

关于xml - 将平面层次结构转换为 XSLT 深度的嵌套层次结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40295763/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com