RE: [xsl] flat XML to normal XML

Subject: RE: [xsl] flat XML to normal XML
From: "Aron Bock" <aronbock@xxxxxxxxxxx>
Date: Tue, 17 May 2005 01:46:57 +0000
This is more XSL-esque:

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


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

<xsl:key match="Table" name="k-transport" use="Level"/>
<xsl:key match="Table[Level=2]" name="k-brand" use="preceding-sibling::Table[Level = 1][1]"/>
<xsl:key match="Table[Level=3]" name="k-model" use="preceding-sibling::Table[Level = 2][1]"/>


   <xsl:template match="/">
       <NewDataSet>
           <xsl:apply-templates select="key('k-transport', 1)"/>
       </NewDataSet>
   </xsl:template>

   <xsl:template match="Table[Level = 1]">
       <Transport name="{Description}">
           <xsl:apply-templates select="key('k-brand', .)"/>
       </Transport>
   </xsl:template>

   <xsl:template match="Table[Level = 2]">
       <Brand name="{Description}">
           <xsl:apply-templates select="key('k-model', .)"/>
       </Brand>
   </xsl:template>

   <xsl:template match="Table[Level = 3]">
       <Model name="{Description}"></Model>
   </xsl:template>
</xsl:stylesheet>


and this says I'm bored:



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


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

<xsl:key match="Table" name="k-L1" use="Level"/>
<xsl:key match="Table[Level=2]" name="k-L2" use="preceding-sibling::Table[Level = 1][1]"/>
<xsl:key match="Table[Level=3]" name="k-L3" use="preceding-sibling::Table[Level = 2][1]"/>
<xsl:variable name="Levels" select="document('')//xsl:template[@name='Levels']/Level"/>


   <xsl:template name="Levels">
       <Level name="Transport"/>
       <Level name="Brand"/>
       <Level name="Model"/>
   </xsl:template>

   <xsl:template match="/">
       <NewDataSet>
           <xsl:apply-templates select="key('k-L1', 1)"/>
       </NewDataSet>
   </xsl:template>

<xsl:template match="Table">
<xsl:variable name="name" select="$Levels[position() = current()/Level]/@name"/>
<xsl:element name="{$name}">
<xsl:attribute name="name"><xsl:value-of select="Description"/></xsl:attribute>
<xsl:if test="Level &lt; count($Levels)">
<xsl:apply-templates select="key(concat('k-L', Level + 1), .)"/>
</xsl:if>
</xsl:element>
</xsl:template>
</xsl:stylesheet>


But they both produce this:

<NewDataSet>
 <Transport name="Cars">
   <Brand name="BMW">
     <Model name="316"/>
     <Model name="Z4"/>
   </Brand>
   <Brand name="Citroen">
     <Model name="C2"/>
     <Model name="C4 coupe"/>
   </Brand>
   <Brand name="Alfa Romeo">
     <Model name="156"/>
   </Brand>
 </Transport>
 <Transport name="Motorcycles">
   <Brand name="Kawasaki">
     <Model name="Ninja"/>
   </Brand>
   <Brand name="Suzuki">
     <Model name="Katana"/>
   </Brand>
 </Transport>
</NewDataSet>

--A

_________________________________________________________________
FREE pop-up blocking with the new MSN Toolbar  get it now! http://toolbar.msn.click-url.com/go/onm00200415ave/direct/01/


Current Thread