XSLT。移动特定类型的所有节点为一个节点

问题描述:

我有一个XML(的folderfile节点数量可以改变):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节点复制到()节点中。

可以吗?

+1

你的问题不清楚。你在哪里得到了'?这不是你的输入。为什么只有一些'file'节点从输入复制到输出?你在说什么“特定的'(文件)'节点”?我在你的输入中看到没有'files'节点,也没有在输出 – 2015-04-05 20:43:22

+0

@ michael.hor257k所有文件被复制,'specific(files)node'是'',修正了这个问题。无论是'b'文件在源代码示例中 – euvl 2015-04-05 20:54:14

+0

@ michael.hor257k基本上我需要做的就是将所有'文件'节点复制到一个'文件夹'节点 – euvl 2015-04-05 20:57:53

一种解决方案是以下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> 

匹配根级别的模板应用模板来systemtype节点与模式copy(防止复制所有节点与模板匹配的所有节点和属性)。
然后,包装在<folder name="all_files">中,相同的模板应用于所有file节点。

保存Demo进行此转换。

+1

谢谢!帮了很多! – euvl 2015-04-06 09:25:31