我有一个XML(folder
和file
节点的数量可能不同):
<root>
<system>3</system>
<type>0</type>
<file name="a"/>
<folder name="aaa">
<file name="b"/>
<file name="c"/>
<folder name="bbb">
<file name="d"/>
...
</folder>
<folder name="ccc">
<file name="e"/>
...
</folder>
...
</folder>
...
</root>
应转换为:
<root>
<system>3</system>
<type>0</type>
<folder name="all_files">
<file name="a"/>
<file name="b"/>
<file name="c"/>
...
</folder>
</root>
我需要使用XSLT来完成,但我有一个问题,我不知道如何将file
节点复制到(<folder name="all_files">
)节点中。
有可能做到吗?
一个解决方案如下XSLT:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="xml" omit-xml-declaration="yes" encoding="UTF-8" indent="yes" />
<xsl:strip-space elements="*" />
<xsl:template match="/">
<root>
<xsl:apply-templates select="//system | //type" mode="copy" />
<folder name="all_files">
<xsl:apply-templates select="//file" mode="copy" />
</folder>
</root>
</xsl:template>
<xsl:template match="@*|node()" mode="copy">
<xsl:copy>
<xsl:apply-templates select="@*|node()" />
</xsl:copy>
</xsl:template>
</xsl:transform>
应用于您的输入XML,生成以下输出:
<root>
<system>3</system>
<type>0</type>
<folder name="all_files">
<file>a</file>
<file>b</file>
<file>c</file>
<file>d</file>
<file>e</file>
</folder>
</root>
与根级别匹配的模板将模板应用于模式为copy
的system
和type
节点(以防止复制具有与所有节点和属性匹配的模板的所有节点)
然后,封装在<folder name="all_files">
中,将相同的模板应用于所有file
节点。
已保存此转换的演示。