xsl-list
[Top] [All Lists]

RE: XSLT to conver flat XML to Heirarchy XML

2005-04-27 02:51:44
Please try this XSL..

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform";>

<xsl:output method="xml" indent="yes" />

<xsl:template match="/">
  <xsl:element name="{//Record[1]/keyfieldValue}">
    <xsl:copy-of
select="//Record[1]/*[not(self::keyfieldValue)]" />
    <xsl:element name="{//Record[2]/keyfieldValue}">
      <xsl:copy-of
select="//Record[2]/*[not(self::keyfieldValue)]" />   
  
      <xsl:call-template name="xyz">
        <xsl:with-param name="x" select="//Record[3]"
/>
      </xsl:call-template>
      <APPOINTMENT>
        <xsl:copy-of select="//Record[keyfieldValue =
'APPOINTMENT']/*" />
      </APPOINTMENT>
      <xsl:for-each select="//Record[keyfieldValue =
'NAME']">
        <NAME>
          <xsl:copy-of select="*" />
          <ADDRESS>
            <xsl:copy-of
select="following-sibling::Record[1]/*" />
          </ADDRESS>
        </NAME>
      </xsl:for-each>
    </xsl:element> 
  </xsl:element>
</xsl:template>

<xsl:template name="xyz">
  <xsl:param name="x" />
  
  <xsl:if test="$x and not($x/keyfieldValue =
'APPOINTMENT') and not($x/keyfieldValue = 'NAME') and
not(($x/keyfieldValue = 'ADDRS') and
($x/preceding-sibling::Record[1]/keyfieldValue =
'NAME'))">
    <xsl:element name="{$x/keyfieldValue}">
      <xsl:copy-of select="$x/fieldValue" />
      <xsl:call-template name="xyz">
        <xsl:with-param name="x"
select="$x/following-sibling::Record[1]" />
      </xsl:call-template>
    </xsl:element>
  </xsl:if>  
</xsl:template>

</xsl:stylesheet>

I have slightly changed the syntax (as compared to my
previous stylesheet).. I am now using <xsl:copy-of
instead of xsl:for-each (for the syntactic
convenience).. Also to simply things, I have removed
the namespace declerations from source XML..

When the above stylesheet is applied to XML -
<ns>
  <RECSETNAME>
    <Record>
        <keyfieldValue>HEADR</keyfieldValue>
        <fieldValue>CDJOB</fieldValue>
        <fieldValue>TRA</fieldValue>
    </Record>
    <Record>
        <keyfieldValue>TRANS</keyfieldValue>
        <fieldValue>DATA</fieldValue>
        <fieldValue>EXCHG</fieldValue>
        <fieldValue>EXCH</fieldValue>
    </Record>
    <Record>
        <keyfieldValue>MTPNT</keyfieldValue>
        <fieldValue>74842606</fieldValue>
    </Record>
    <Record>
        <keyfieldValue>ADDRS</keyfieldValue>
        <fieldValue>MTRPT</fieldValue>
        <fieldValue>BRITISH TELECOM</fieldValue>
    </Record>
    <Record>
        <keyfieldValue>ASSET</keyfieldValue>
        <fieldValue>INSTL</fieldValue>
        <fieldValue>METER</fieldValue>
    </Record>
    <Record>
        <keyfieldValue>METER</keyfieldValue>
        <fieldValue>T</fieldValue>
    </Record>
   <Record>
        <keyfieldValue>APPOINTMENT</keyfieldValue>
        <fieldValue>T</fieldValue>
    </Record>
    <Record>
        <keyfieldValue>NAME</keyfieldValue>
        <fieldValue>TEST</fieldValue>
        <fieldValue>BRITISH TELECOM</fieldValue>
    </Record>
    <Record>
        <keyfieldValue>ADDRS</keyfieldValue>
        <fieldValue>NAME</fieldValue>
        <fieldValue>BRITISH TELECOM</fieldValue>
    </Record>
  </RECSETNAME>
</ns>

The output recieved is -
<?xml version="1.0" encoding="UTF-8"?>
<HEADR>
   <fieldValue>CDJOB</fieldValue>
   <fieldValue>TRA</fieldValue>
   <TRANS>
      <fieldValue>DATA</fieldValue>
      <fieldValue>EXCHG</fieldValue>
      <fieldValue>EXCH</fieldValue>
      <MTPNT>
         <fieldValue>74842606</fieldValue>
         <ADDRS>
            <fieldValue>MTRPT</fieldValue>
            <fieldValue>BRITISH TELECOM</fieldValue>
            <ASSET>
               <fieldValue>INSTL</fieldValue>
               <fieldValue>METER</fieldValue>
               <METER>
                  <fieldValue>T</fieldValue>
               </METER>
            </ASSET>
         </ADDRS>
      </MTPNT>
      <APPOINTMENT>
         <keyfieldValue>APPOINTMENT</keyfieldValue>
         <fieldValue>T</fieldValue>
      </APPOINTMENT>
      <NAME>
         <keyfieldValue>NAME</keyfieldValue>
         <fieldValue>TEST</fieldValue>
         <fieldValue>BRITISH TELECOM</fieldValue>
         <ADDRESS>
            <keyfieldValue>ADDRS</keyfieldValue>
            <fieldValue>NAME</fieldValue>
            <fieldValue>BRITISH TELECOM</fieldValue>
         </ADDRESS>
      </NAME>
   </TRANS>
</HEADR>

Regards,
Mukul

--- sreekanth(_dot_)gangula(_at_)wipro(_dot_)com wrote:


Hi Mukul ,
  Thanks a lot. But I have got two more elements at
the end.
  This requirement I got it a couple of hours ago.
  I am just wondering whether is it possible.
  Your help is really appreciated. Thanks in
adavnce.
  <ns:MT_Test xmlns:ns="http://Centrica/Test";>
  <RECSETNAME xmlns:ns="http://Centrica/Test";>
    <Record>
        <keyfieldValue>HEADR</keyfieldValue>
        <fieldValue>CDJOB</fieldValue>
        <fieldValue>TRA</fieldValue>
    </Record>
    <Record>
        <keyfieldValue>TRANS</keyfieldValue>
        <fieldValue>DATA</fieldValue>
        <fieldValue>EXCHG</fieldValue>
        <fieldValue>EXCH</fieldValue>
    </Record>
    <Record>
        <keyfieldValue>MTPNT</keyfieldValue>
        <fieldValue>74842606</fieldValue>
    </Record>
    <Record>
        <keyfieldValue>ADDRS</keyfieldValue>
        <fieldValue>MTRPT</fieldValue>
        <fieldValue>BRITISH TELECOM</fieldValue>
    </Record>
    <Record>
        <keyfieldValue>ASSET</keyfieldValue>
        <fieldValue>INSTL</fieldValue>
        <fieldValue>METER</fieldValue>
    </Record>
    <Record>
        <keyfieldValue>METER</keyfieldValue>
        <fieldValue>T</fieldValue>
    </Record>
   <Record>
        <keyfieldValue>APPOINTMENT</keyfieldValue>
        <fieldValue>T</fieldValue>
    </Record>
    <Record>
        <keyfieldValue>NAME</keyfieldValue>
        <fieldValue>TEST</fieldValue>
        <fieldValue>BRITISH TELECOM</fieldValue>
    </Record>
    <Record>
        <keyfieldValue>ADDRS</keyfieldValue>
        <fieldValue>NAME</fieldValue>
        <fieldValue>BRITISH TELECOM</fieldValue>
    </Record>
  </RECSETNAME>
</ns:MT_Test>

The result of this looks like:
<?xml version="1.0" encoding="UTF-8"?>
<HEADR>
   <fieldValue>CDJOB</fieldValue>
   <fieldValue>TRA</fieldValue>
   <TRANS>
      <fieldValue>DATA</fieldValue>
      <fieldValue>EXCHG</fieldValue>
      <fieldValue>EXCH</fieldValue>
      <MTPNT>
         <fieldValue>74842606</fieldValue>
         <ADDRS>
            <fieldValue>MTRPT</fieldValue>
            <fieldValue>BRITISH TELECOM</fieldValue>
            <ASSET>
               <fieldValue>INSTL</fieldValue>
               <fieldValue>METER</fieldValue>
               <METER>
                  <fieldValue>T</fieldValue>
               </METER>
            </ASSET>
         </ADDRS>
      </MTPNT>
      <APPOINTMENT>
         <keyfieldValue>APPOINTMENT</keyfieldValue>
        <fieldValue>T</fieldValue>
     </APPOINTMENT>
     <NAME>
        <keyfieldValue>NAME</keyfieldValue>
        <fieldValue>TEST</fieldValue>
        <fieldValue>BRITISH TELECOM</fieldValue>
       <ADDRESS>
        <keyfieldValue>ADDRS</keyfieldValue>
        <fieldValue>NAME</fieldValue>
        <fieldValue>BRITISH TELECOM</fieldValue>
       </ADDRESS>
     </NAME>
   </TRANS>
</HEADR>


__________________________________________________
Do You Yahoo!?
Tired of spam?  Yahoo! Mail has the best spam protection around 
http://mail.yahoo.com 

--~------------------------------------------------------------------
XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list
To unsubscribe, go to: http://lists.mulberrytech.com/xsl-list/
or e-mail: <mailto:xsl-list-unsubscribe(_at_)lists(_dot_)mulberrytech(_dot_)com>
--~--



<Prev in Thread] Current Thread [Next in Thread>