Re: [xsl] transforming xml to tables

Subject: Re: [xsl] transforming xml to tables
From: Niclas Hedhman <niclas@xxxxxxxxxxx>
Date: Wed, 16 Jun 2004 15:15:01 +0800
On Tuesday 15 June 2004 00:41, Pedro Castro wrote:
> Hi, all. I'm a beginner in this xsl world and I'm trying to learn.
> I could do the work I have to do in a different way but I'm trying to see
> the advantages of xsl (which are convincing me). But I was stopped in the
> process because of a problem which I (try to) describe next:

You need two XSL passes, generating one file for each pass.

The first one is very simple, as you take the 'same suff' strip out some 
attributes and check a string containing the _ID at the end...

<xsl:template match="aaa" >
  <table>
    <xsl:attribute name="name">
      <xsl:value-of select="@name" />
    </xsl:attribute>
    <xsl:apply-templates />
  </table>
</xsl:template>

<xsl:template match="bbb" >
  <column>
    <xsl:attribute name="name">
      <xsl:value-of select="@name" />
    </xsl:attribute>
    <xsl:if test="contains( @name, '_ID' )" >
      <xsl:attribute name="primaryKey">true</xsl:attribute>
    </xsl:if>
  </column>
</xsl:template>


The second phase is handled roughly the manner...

<xsl:template match="aaa/bbb[ @type = 't2'] " >
  <table>
    <xsl:attribute name="name">
      <xsl:value-of select="../@name" />
    </xsl:attribute>
<!-- You need to extract the pieces you want to generate the required result 
here. I'm barely awake to follow your intentions, and this section will get a 
little bit 'tricky', so some trial and error will help, but basically no 
template matching/applying should be used. -->
  </table>
</xsl:template>


Hope that help as a start...

Cheers
Niclas


> I have the following xml:
>
> <aaa name="t1">
> 	<bbb name="t1_ID" type="n"/>
> 	<bbb name="c1" type="t2"/>
> 	<bbb name="c2"/>
> 	<bbb name="c3" type="n"/>
> </aaa>
>
> And I want to transform this (part) into a script for create a relational
> table structure (for later processing):
>
> (A table has always an id that is conventioned to be the table name
> followed by "_ID" word)
>
> <table name="t1">
> 	<column name="t1_ID" primaryKey="true"/>
> 	<column name="c1"/>
> 	<column name="c2"/>
> 	<column name="c3"/>
> </table>
>
> <table name="t1_t2_nxn">
> 	<column name="t1_ID" primaryKey="true"/>
> 	<column name="t2_ID" primaryKey="true"/>
> 	<foreign-key foreignTable="t1">
> 		<reference local="t1_ID" foreign="t1_ID"/>
> 	</foreign-key>
> 	<foreign-key foreignTable="t2">
> 		<reference local="t2_ID" foreign="t2_ID"/>
> 	</foreign-key>
> </table>
>
>
> The rules for transformation are simple: if an inner element for the <aaa>
> element has a type other than none or "n" (like the type="t2" case) than i
> need to create the second table which is an n x n table between t1 and (an
> already existent) t2 table.
>
> Is this possible to do in xsl?
> I'm sorry for the long question, and I hope that anybody can understand and
> help :)
>
> Thanks in advance!!
>
>
> Pedro Castro.
> Portugal.
>
>
>
> --+------------------------------------------------------------------
> 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@xxxxxxxxxxxxxxxxxxxxxx>
> --+--

-- 
   +------//-------------------+
  / http://www.bali.ac        /
 / http://niclas.hedhman.org / 
+------//-------------------+


Current Thread