2015-04-05 89 views
0

我有一個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

你的問題不清楚。你在哪裏得到了<<文件名=「b」/>'?這不是你的輸入。爲什麼只有一些'file'節點從輸入複製到輸出?你在說什麼「特定的'(文件)'節點」?我在你的輸入中看到沒有'files'節點,也沒有在輸出 – 2015-04-05 20:43:22

+0

@ michael.hor257k所有文件被複制,'specific(files)node'是'<文件夾名稱=「all_files」>',修正了這個問題。無論是'b'文件在源代碼示例中 – euvl 2015-04-05 20:54:14

+0

@ michael.hor257k基本上我需要做的就是將所有'文件'節點複製到一個'文件夾'節點 – euvl 2015-04-05 20:57:53

回答

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> 

匹配根級別的模板應用模板來systemtype節點與模式copy(防止複製所有節點與模板匹配的所有節點和屬性)。
然後,包裝在<folder name="all_files">中,相同的模板應用於所有file節點。

保存Demo進行此轉換。

+1

謝謝!幫了很多! – euvl 2015-04-06 09:25:31