2014-05-14 85 views
0

我是XSLT編程的新手,你們能幫我解決下面的問題嗎?多個孩子到父 - XSLT程序

這是個什麼

<File attrib1="100" attrib2="200"> 
<FileHeader attrib3="a" attrib4="5"> 
    <item attrib5="34" attrib6="3"> 
    <subitem1/> 
    <subitem2/> 
    </item> 
    <item attrib5="156" attrib6="170"> 
    <subitem1/> 
    <subitem2/> 
    </item> 
</FileHeader> 
</File> 

我想將它轉化爲

<File attrib1="100" attrib2="200"> 
    <item attrib5="34" attrib6="3"> 
    <subitem1/> 
    <subitem2/> 
    </item> 
    <item attrib5="156" attrib6="170"> 
    <subitem1/> 
    <subitem2/> 
    </item> 
    <FileHeader attrib3="a" attrib4="5"> 
    </FileHeader> 
</File> 

下面是我寫的代碼,這似乎是一項重複多個時間爲每個項目:

<xsl:template match="/"> 
<File> 
    <xsl:attribute name="attrib1"> 
    <xsl:value-of select="File/@attrib1"/> 
    </xsl:attribute> 
    <xsl:attribute name="attrib2"> 
    <xsl:value-of select="File/@attrib2"/> 
    </xsl:attribute> 

    <xsl:for-each select="File/FileHeader/item"> 
    <xsl:copy-of select="//Item[@*]"/> 
    </xsl:for-each> 

    <FileHeader> 
    <xsl:attribute name="attrib3"> 
     <xsl:value-of select="/File/FileHeader/@attrib3"/> 
    </xsl:attribute> 
    <xsl:attribute name="attrib4"> 
     <xsl:value-of select="/File/FileHeader/@attrib4"/> 
    </xsl:attribute> 
    </FileHeader> 
</File> 
</xsl:template> 

謝謝,我想通了,下面將工作正常。

<xsl:template match="/"> 
<File> 
    <xsl:attribute name="attrib1"> 
    <xsl:value-of select="File/@attrib1"/> 
    </xsl:attribute> 
    <xsl:attribute name="attrib2"> 
    <xsl:value-of select="File/@attrib2"/> 
    </xsl:attribute> 

    <xsl:copy-of select="//Item[@*]"/> 


    <FileHeader> 
    <xsl:attribute name="attrib3"> 
     <xsl:value-of select="/File/FileHeader/@attrib3"/> 
    </xsl:attribute> 
    <xsl:attribute name="attrib4"> 
     <xsl:value-of select="/File/FileHeader/@attrib4"/> 
    </xsl:attribute> 
    </FileHeader> 
</File> 
</xsl:template> 
+1

無論是輸入xml還是所需的輸出都是有效的'xml'。屬性需要一個值,例如'attrib1 = 「」'。請更新您的文章,以使您的'xml'有效。 – PhillyNJ

+0

我想通了,而不是這 – user3637084

回答

1

你可以爲此寫一個更簡單的模板。您不需要明確複製屬性:

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

    <xsl:template match="File"> 
     <xsl:copy> 
      <xsl:copy-of select="@*|FileHeader/item"/> 
      <xsl:apply-templates select="FileHeader"/> 
     </xsl:copy> 
    </xsl:template> 

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

</xsl:stylesheet> 
+0

感謝一堆這個作品完美。 – user3637084