xsl-list
[Top] [All Lists]

RE: flat XML to normal XML

2005-05-16 18:46:57
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[(_at_)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/


--~------------------------------------------------------------------
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>
--~--