user3637084
user3637084

Reputation: 1

Multiple child to parent - XSLT program

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

Answers (1)

helderdarocha
helderdarocha

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

Related Questions