gpt4 book ai didi

XSLT 1.0 : recursively flatten/denormalize a structure

转载 作者:行者123 更新时间:2023-12-05 01:03:01 25 4
gpt4 key购买 nike

我正在尝试递归地展平/标准化下面的结构,但没有成功。

<models>
<model name="AAA" root="true">
<items>
<item name="a"/>
<item name="b"/>
</items>
<submodels>
<submodel ref="BBB"/>
<submodel ref="CCC" />
</submodels>
</model>
<model name="BBB">
<items>
<item name="c"/>
<item name="d"/>
</items>
<submodels>
<submodel ref="CCC" />
</submodels>
</model>
<model name="CCC">
<item name="e" />
</model>
</models>

预期结果如下:

/AAA
/AAA/a
/AAA/b
/AAA/BBB
/AAA/BBB/c
/AAA/BBB/d
/AAA/BBB/CCC
/AAA/BBB/CCC/e
/AAA/CCC
/AAA/CCC/e

我试过以递归方式使用。但主要问题是多个模型可以引用单个模型。例如。 AAA -> CCC 和 BBB -> CCC。

最佳答案

这个简短的转换:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text"/>

<xsl:key name="kmodelByName" match="model" use="@name"/>
<xsl:key name="ksubmodelByRef" match="submodel" use="@ref"/>

<xsl:template match="/*">
<xsl:apply-templates select="model[not(key('ksubmodelByRef', @name))]"/>
</xsl:template>

<xsl:template match="model|item">
<xsl:param name="pPath"/>
<xsl:value-of select="concat('&#xA;', $pPath, '/', @name)"/>
<xsl:apply-templates select="item|*/item|*/submodel">
<xsl:with-param name="pPath" select="concat($pPath, '/', @name)"/>
</xsl:apply-templates>
</xsl:template>

<xsl:template match="submodel">
<xsl:param name="pPath"/>
<xsl:apply-templates select="key('kmodelByName', @ref)">
<xsl:with-param name="pPath" select="$pPath"/>
</xsl:apply-templates>
</xsl:template>
</xsl:stylesheet>

应用于提供的 XML 文档时:

<models>
<model name="AAA" root="true">
<items>
<item name="a"/>
<item name="b"/>
</items>
<submodels>
<submodel ref="BBB"/>
<submodel ref="CCC" />
</submodels>
</model>
<model name="BBB">
<items>
<item name="c"/>
<item name="d"/>
</items>
<submodels>
<submodel ref="CCC" />
</submodels>
</model>
<model name="CCC">
<item name="e"/>
</model>
</models>

产生想要的、正确的结果:

/AAA
/AAA/a
/AAA/b
/AAA/BBB
/AAA/BBB/c
/AAA/BBB/d
/AAA/BBB/CCC
/AAA/BBB/CCC/e
/AAA/CCC
/AAA/CCC/e

解释:

  1. 正确使用键可以使转换简短、易于表达并且高效

  2. 正确使用模板。

  3. 正确使用参数 - 传递给模板。

关于XSLT 1.0 : recursively flatten/denormalize a structure,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12531570/

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