2014-02-10 140 views
1

我是初學者學習XSL和我需要的XSL文件有助於改變我原來的XML,它看起來像組元素,新的父節點(XSLT)

<dataroot> 
    <pod> 
     <id>1</id> 
     <mfp> 
     <type>1</type> 
     <val>10</val> 
     </mfp> 
     <mfp> 
     <type>2</type> 
     <val>12</val> 
     </mfp> 
    </pod> 
    <pod> 
     <id>2</id> 
     <mfp> 
     <type>1</type> 
     <val>100</val> 
     </mfp> 
    </pod> 
</dataroot> 

,我需要有包含新節點MFPS所有mfp元素爲一個吊艙,如

<dataroot> 
    <pod> 
     <id>1</id> 
     <MFPS> 
     <mfp> 
      <type>1</type> 
      <val>10</val> 
     </mfp> 
     <mfp> 
      <type>2</type> 
      <val>12</val> 
     </mfp> 
     </MFPS> 
    </pod> 
    <pod> 
     <id>2</id> 
     <MFPS> 
     <mfp> 
      <type>1</type> 
      <val>100</val> 
     </mfp> 
     </MFPS> 
    </pod> 
</dataroot> 

請幫我解決這個問題。由於

+1

您輸入只有一個 「吊艙」 元素(根節點)。但是,你的輸出似乎有更多(輸出不能有多於一個根節點,但輸出不是這種情況)。你能通過發佈完整的XML輸入和輸出更清楚嗎? –

+0

原始XML看起來像 [code] <?xml version =「1.0」?> .... [/代碼] 只有一個根,很多 ...節點 – user3294104

+0

剛纔編輯的問題 – user3294104

回答

0

使用該模板:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="xml" indent="yes" /> 
    <xsl:strip-space elements="*"/> 

    <xsl:template match="@* | node()"> 
    <xsl:copy> 
     <xsl:apply-templates select="@* | node()"/> 
    </xsl:copy> 
    </xsl:template> 

    <xsl:template match="pod"> 
    <xsl:copy> 
     <xsl:apply-templates select="@* | node()[not(name() = 'mfp')]"/> 
     <MFPS> 
     <xsl:apply-templates select="mfp"/> 
     </MFPS> 
    </xsl:copy> 
    </xsl:template> 
</xsl:stylesheet> 
+0

它的工作原理,但得到的文件是在一個線。如何獲得換行符? – user3294104

+0

我發現了一個解決方案,以保留原始xml的換行符,應該加上: user3294104

0

使用XSLT 2.0,您可以使用,每個組

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output method="xml" indent="yes" /> 
    <xsl:strip-space elements="*"/> 

    <xsl:template match="@* | node()"> 
     <xsl:copy> 
      <xsl:apply-templates select="@* | node()"/> 
     </xsl:copy> 
    </xsl:template> 

    <xsl:template match="pod"> 
     <xsl:copy> 
      <xsl:for-each-group select="*" group-adjacent="if (self::mfp) then 1 else 0"> 
       <xsl:choose> 
        <xsl:when test="current-grouping-key()"> 
         <MFPS> 
          <xsl:apply-templates select="current-group()"/> 
         </MFPS> 
        </xsl:when> 
        <xsl:otherwise> 
         <xsl:apply-templates select="current-group()"/> 
        </xsl:otherwise> 
       </xsl:choose> 
      </xsl:for-each-group> 
     </xsl:copy> 
    </xsl:template> 
</xsl:stylesheet>