XSLT。移动特定类型的所有节点为一个节点
问题描述:
我有一个XML(的folder
和file
节点数量可以改变):XSLT。移动特定类型的所有节点为一个节点
<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
节点复制到()节点中。
可以吗?
答
一种解决方案是以下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进行此转换。
+1
谢谢!帮了很多! – euvl 2015-04-06 09:25:31
你的问题不清楚。你在哪里得到了'?这不是你的输入。为什么只有一些'file'节点从输入复制到输出?你在说什么“特定的'(文件)'节点”?我在你的输入中看到没有'files'节点,也没有在输出 – 2015-04-05 20:43:22
@ michael.hor257k所有文件被复制,'specific(files)node'是'',修正了这个问题。无论是'b'文件在源代码示例中 – euvl 2015-04-05 20:54:14
@ michael.hor257k基本上我需要做的就是将所有'文件'节点复制到一个'文件夹'节点 – euvl 2015-04-05 20:57:53