Reputation: 1
I am new to XSLT programming, can you guys please help me on the below request?
This is what it is
<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>
I want to transform it as
<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>
Below is the code that I wrote, it seems like item repeats multiple time for each item:
<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>
Thanks i figured it out, the below will work fine.
<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>
Upvotes: 0
Views: 46
Reputation: 23637
You can write a simpler template for that. You don't need to explicitly copy the attributes:
<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>
Upvotes: 1