Re: [xsl] Converting an xml to another xml Using XSLT

Subject: Re: [xsl] Converting an xml to another xml Using XSLT
From: "Jon Gorman" <jonathan.gorman@xxxxxxxxx>
Date: Tue, 2 May 2006 13:51:42 -0500
On 5/2/06, Tedla, Sridhar (LNG-CSP) <Sridhar.Tedla@xxxxxxxxxxxxxx> wrote:
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>


This doesn't quite look like the other examples you've already posted. (Also, try to stick with the same thread, it can get confusing for some of us if you jump around)>

I'm finding myself confused as to why you're doing all of this...it
would seem you could simply do:

<xsl:template match="class">
<hier>
<xsl:apply-templates />
</hier>
</xsl:template>

<xsl:template match="classitem">
<hierlev>
<heading>
  <title><xsl:value-of select="name" /></title>
</heading>
<xsl:apply-templates />
</hierlev>
</xsl:template>

One of the strengths of XSLT is how it will travel down the length of
the entire tree.

Is the problem more complicated than this?  (Perhaps it is, I don't
have time to flip back a couple of of threads to find out)

Jon Gorman

Current Thread