This is the mail archive of the
xsl-list@mulberrytech.com
mailing list .
Re: Dynamically building a HTML table from variable row data
- From: Jörg Heinicke <joerg dot heinicke at gmx dot de>
- To: <xsl-list at lists dot mulberrytech dot com>
- Date: Sun, 16 Dec 2001 13:20:04 +0100
- Subject: Re: [xsl] Dynamically building a HTML table from variable row data
- References: <LOBBICBLDJIJHPNJFPOLOEPDCCAA.ammd@bigpond.net.au>
- Reply-to: xsl-list at lists dot mulberrytech dot com
I don't know whether it's the best solution but it's a generic one:
<?xml version="1.0"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:key name="columns" match="ROW/*" use="name()"/>
<xsl:template match="BLOCK">
<table border="1">
<tr>
<xsl:for-each select="ROW/*[count(.|key('columns',name())[1]) = 1]">
<xsl:sort select="name()"/>
<td><xsl:value-of select="name()"/></td>
</xsl:for-each>
</tr>
<xsl:apply-templates/>
</table>
</xsl:template>
<xsl:template match="ROW">
<xsl:variable name="id" select="generate-id()"/>
<tr>
<xsl:for-each select="../ROW/*[count(.|key('columns',name())[1]) = 1]">
<xsl:sort select="name()"/>
<td><xsl:value-of select="../../ROW[generate-id() = $id]/*[name() =
name(current())]"/></td>
</xsl:for-each>
</tr>
</xsl:template>
</xsl:stylesheet>
----- Original Message -----
From: "Michael Leditschke" <ammd@bigpond.net.au>
To: <XSL-List@lists.mulberrytech.com>
Cc: ""Robert Koberg"" <rob@koberg.com>
Sent: Sunday, December 16, 2001 11:16 AM
Subject: Re: [xsl] Dynamically building a HTML table from variable row data
> Thanks for the reply Robert. The problem
> I have is that there are a large number of
> similarly formatted blocks but the sub-element
> names vary in each one. Thus hardcoding each
> one is something I'm trying to avoid if possible.
>
> Regards
> Michael
>
>
> how about:
>
> <xsl:template match="BLOCK">
>
> > <table border="10">
>
> <xsl:apply-templates select="row"/>
>
> > </table>
> > </xsl:template>
>
> <xsl:template match="ROW">
>
> <tr>
> <td><xsl:value-of select="A"/></td>
> <td><xsl:value-of select="B"/></td>
> <td><xsl:value-of select="C"/></td>
> <td><xsl:value-of select="D"/></td>
> <td><xsl:value-of select="E"/></td>
> </tr>
>
> </xsl:template>
>
>
>
> - ----- Original Message -----
> From: "Michael Leditschke" <ammd@bigpond.net.au>
> To: <XSL-List@lists.mulberrytech.com>
> Sent: Saturday, December 15, 2001 8:25 AM
> Subject: [xsl] Dynamically building a HTML table from variable row data
>
>
> > I am attempting to populate an HTML table
> > where the column names are generated by the
> > set of element names on each row. Not all
> > elements occur on all rows.
> >
> > My problem is thus to dynamically work out
> > the total set of columns (using the element
> > names) and dynamically position each piece
> > of data in the correct column.
> >
> > For example, assume XML looks like
> >
> > <BLOCK>
> > <ROW>
> > <A>1</A>
> > <B>2</B>
> > </ROW>
> > <ROW>
> > <A>9</A>
> > <B>3</B>
> > <C>4</C>
> > </ROW>
> > <ROW>
> > <A>5</A>
> > <D>6</D>
> > <E>7</E>
> > </ROW>
> > <BLOCK>
> >
> > I'd like to end up with a table something like
> >
> > A B C D E
> > 1 2
> > 9 3 4
> > 5 6 7
> >
> >
> > Thus far I have code something like
> >
> > <xsl:template match="BLOCK">
> > <xsl:variable name="ColumnNames"
> > select="ROW/*[not(local-name()=local-name(preceding::ROW/*)))]"/>
> > <table border="10">
> > <tr>
> > <xsl:for-each select="$ColumnNames">
> > <th>
> > <xsl:value-of select="local-name()"/>
> > </th>
> > </xsl:for-each>
> > </tr>
> > </table>
> > </xsl:template>
> >
> > I know its wrong because the local-name function is going
> > to process the first node only. So it handles the <A>
> > element ok but not any of the others.
> >
> > I'm trying to follow the
> > examples I've seen of grouping but most seem to be based
> > on element/attribute content rather than element names.
> >
> > Various wild and whacky schemes have come to mind but
> > before I looked for a zebra, I thought I'd check if anyone
> > knew of a horse.
> >
> > Any pointers much appreciated.
> >
> > Regards
> > Michael
XSL-List info and archive: http://www.mulberrytech.com/xsl/xsl-list