[xsl] Converting an xml to another xml Using XSLT

Subject: [xsl] Converting an xml to another xml Using XSLT
From: "Tedla, Sridhar \(LNG-CSP\)" <Sridhar.Tedla@xxxxxxxxxxxxxx>
Date: Tue, 2 May 2006 12:36:19 -0600
Question: Converting an XML markup to another XML Markup Using XSLT.

Sample XML Markup:
<class >
   <classitem>
     <identifier>
        <name>Sales </name>
               <code>1234</code>
     </identifier>
     <classitem>
        <identifier>
          <name> Tax</name>
          <code>5678</code>
       </identifier>
     </classitem>
    </classitem>
</class>

After XSL Transformation, the output markup should be as follows:
  <hier>
          <hierlev >
             <heading>
                <title>Sales</title>
             </heading>
             <hierlev>
                <heading>
                    <title> Tax</title>
                </heading>
               </hierlev>
            </hierlev>
    </hier>

The mapping between Input and output markup elements as follows:

class  -     hier
Classitem - heirlev
identifier -  heading
name       - title
code has no mapping i.e. the element can be ignored in XSLT Code

I have written XSLT code which works for fixed depth of class.Actually I
have written XSLT code for classItem depth of 4, but for simplicity...
the following code is for classItem depth of 2 only.
<xsl:template match="class">
        <xsl:param name="count"/>
        <xsl:param name="v1" select="descendant::name[1]/text()"/>
        <xsl:param name="v2" select="descendant::name[2]/text()"/>
        <xsl:call-template name="createHierLevElement">
          <xsl:with-param name="hierLevContent">
	       <xsl:element name="heading">
	          <xsl:element name="title">
		      <xsl:copy-of select="$v1"/>
	           </xsl:element>
	        </xsl:element>

                <xsl:if test=" $count = 2 ">
		  <xsl:call-template name="createHierLevElement">
                      <xsl:with-param name="hierLevContent">
			  <xsl:element name="heading">
 		             <xsl:element name="title">
                                  <xsl:copy-of select="$v2"/>
			     </xsl:element>
			  </xsl:element>
                       </xsl:with-param>
                   </xsl:call-template>
                </xsl:if>
             </xsl:with-param>
        </xsl:call-template>
  </xsl:template>


  <xsl:template name="createHierLevElement">
      <xsl:param name="hierLevContent" />

        <xsl:element name="hierlev">
           <xsl:copy-of select="$hierLevContent" />
        </xsl:element>
    </xsl:template>

If my input markup has arbitary depth, the above XSLT code will not
work, so I need code which accomodates any depth of ClassItem.



Thanks.
Sridhar

Current Thread