使用XSLT创建嵌套XML

时间:2016-11-29 19:45:54

标签: xml xslt

我想使用XSLT从平面XML创建嵌套XML结构。你能帮帮我吗?

输入:元素可以达到第n级

<tm>
    <w001></w001>
    <w002></w002>
    <w003></w003>
    <w003></w003>
    <w002></w002>
    <w003></w003>
    <w002></w002>
    <w003></w003>
</tm>

输出应为:

<tm>
  <w001>
    <w002>
        <w003></w003>
        <w003></w003>
    </w002>
    <w002>
        <w003></w003>
    </w002>
    <w002>
        <w003></w003>
    </w002>
  </w001>
</tm>

1 个答案:

答案 0 :(得分:0)

想想看,这可以通过以下方式相对简单地完成:

XSLT 2.0

<xsl:stylesheet version="2.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="children" match="*">
    <xsl:variable name="level" select="number(substring-after(name(), 'w'))" />
    <xsl:variable name="parent-name" select="format-number($level - 1, 'w000')" />
    <xsl:variable name="parent" select="preceding-sibling::*[name()=$parent-name][1]" />
    <xsl:value-of select="generate-id($parent)"/>
</xsl:key>

<xsl:template match="/tm">
    <xsl:copy>
        <xsl:apply-templates select="w001"/>
    </xsl:copy>
</xsl:template>

<xsl:template match="*">
    <xsl:copy>
        <xsl:apply-templates select="key('children', generate-id())"/>
    </xsl:copy>
</xsl:template>

</xsl:stylesheet>

请注意,这假定不会跳过任何级别。

加了:

  

实际上水平可能会跳过。

我还没有对此进行过彻底的测试(没有这个场景的真实例子),但我认为如果你替换上面的键定义它会起作用:

<xsl:key name="children" match="*">
    <xsl:variable name="level" select="number(substring-after(name(), 'w'))" />
    <xsl:variable name="parent-name" select="format-number($level - 1, 'w000')" />
    <xsl:variable name="parent" select="preceding-sibling::*[name()=$parent-name][1]" />
    <xsl:value-of select="generate-id($parent)"/>
</xsl:key>

使用:

<xsl:key name="children" match="*" use="generate-id(preceding-sibling::*[name() lt name(current())][1])" />