我想使用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>
答案 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])" />