我有一个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">
)节点。
有可能吗?
答案 0 :(得分:1)
一种解决方案是遵循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>
与根级别匹配的模板将模板应用于system
和type
节点,模式为copy
(以防止复制具有匹配所有节点和属性的模板的所有节点)。登记/>
然后,包含在<folder name="all_files">
中的相同模板将应用于所有file
个节点。
为此次转化保存Demo。