This is the mail archive of the
xsl-list@mulberrytech.com
mailing list .
RE: dynamic HTML table generation
- To: "'xsl-list at mulberrytech dot com'" <xsl-list at mulberrytech dot com>
- Subject: RE: dynamic HTML table generation
- From: "hudgins, tom" <hudgins_tom at emc dot com>
- Date: Tue, 10 Oct 2000 08:32:27 -0400
- Reply-To: xsl-list at mulberrytech dot com
I know this is a bit late and you may have already gotten a solution but
here is something I got from Corey Haines on another list that might do what
you want. After I slogged through it and got it working, I found it *very*
slow (due to all the recursion) and didn't continue using it.
Here's the xml
<?xml version="1.0"?>
<tables>
<table>
<attributes>
<table border="1" cellspacing="0" cellpadding="0"
width="80%"/>
<tr align="center" style="background-color: Gray;
color: Blue;"/>
<td width="33%"/>
</attributes>
<item row="2" col="2">2,2</item>
<item row="5" col="3">5,3</item>
<default>*</default>
</table>
</tables>
And here's the xsl
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html" />
<xsl:template match="/">
<html>
<body>
<xsl:for-each select="//table">
<xsl:call-template name="createtable">
<xsl:with-param name="table" select="." />
</xsl:call-template>
</xsl:for-each>
</body>
</html>
</xsl:template>
<xsl:template name="createtable">
<xsl:param name="table" />
<xsl:variable name='maxrows'>
<xsl:call-template name="findmaxatt">
<xsl:with-param name="list" select="$table/item" />
<xsl:with-param name="tocomp">row</xsl:with-param>
<xsl:with-param name="curval" select="'0'" />
</xsl:call-template>
</xsl:variable>
<xsl:variable name='maxcols'>
<xsl:call-template name="findmaxatt">
<xsl:with-param name="list" select="$table/item" />
<xsl:with-param name="tocomp">col</xsl:with-param>
<xsl:with-param name="curval" select="'0'" />
</xsl:call-template>
</xsl:variable>
<xsl:variable name='blanktable'>
<table border='1'>
<xsl:call-template name="createblanktable">
<xsl:with-param name="numrows" select="$maxrows" />
<xsl:with-param name="numcols" select="$maxcols" />
</xsl:call-template>
</table>
</xsl:variable>
<xsl:variable name='filledtable'>
<table>
<xsl:for-each select="$table/attributes/table/@*">
<xsl:copy />
</xsl:for-each>
<xsl:for-each select="$blanktable/table/tr">
<tr>
<xsl:for-each
select="$table/attributes/tr/@*">
<xsl:copy />
</xsl:for-each>
<xsl:for-each select="td">
<td>
<xsl:for-each
select="$table/attributes/td/@*">
<xsl:copy />
</xsl:for-each>
<xsl:choose>
<xsl:when
test="$table/item[@col = 1 + $maxcols - current()/@index and @row = 1 +
$maxrows - current()/../@index]">
<xsl:value-of select="$table/item[@col = 1 + $maxcols - current()/@index and
@row = 1 + $maxrows - current()/../@index]" />
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="$table/default" />
</xsl:otherwise>
</xsl:choose>
</td>
</xsl:for-each>
</tr>
</xsl:for-each>
</table>
</xsl:variable>
<xsl:copy-of select="$filledtable" />
</xsl:template>
<xsl:template name="createblanktable">
<xsl:param name="numrows" />
<xsl:param name="numcols" />
<xsl:if test="$numrows > 0">
<tr>
<xsl:attribute name='index'><xsl:value-of select="$numrows"
/></xsl:attribute>
<xsl:call-template name="makeblankrow">
<xsl:with-param name="currow">1</xsl:with-param>
<xsl:with-param name="numcols" select="$numcols" />
</xsl:call-template>
</tr>
<xsl:call-template name='createblanktable'>
<xsl:with-param name='numrows' select="$numrows - 1" />
<xsl:with-param name="numcols" select="$numcols" />
</xsl:call-template>
</xsl:if>
</xsl:template>
<xsl:template name="makeblankrow">
<xsl:param name="numcols" />
<xsl:param name="currow" />
<xsl:if test="$numcols > 0">
<td><xsl:attribute name='index'><xsl:value-of select="$numcols"
/></xsl:attribute></td>
<xsl:call-template name="makeblankrow">
<xsl:with-param name="numcols" select="$numcols - 1" />
<xsl:with-param name="currow" select="$currow" />
</xsl:call-template>
</xsl:if>
</xsl:template>
<xsl:template name="findminatt">
<xsl:param name="list" />
<xsl:param name="tocomp" />
<xsl:param name="curval" />
<xsl:choose>
<xsl:when test="count($list) = 0">
<xsl:value-of select="$curval" />
</xsl:when>
<xsl:otherwise>
<xsl:variable name="compval">
<xsl:value-of select="$list[1]/@*[name()=$tocomp]" />
</xsl:variable>
<xsl:variable name="newval" >
<xsl:choose>
<xsl:when test="$compval < $curval">
<xsl:value-of select="$compval" />
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="$curval" />
</xsl:otherwise>
</xsl:choose>
</xsl:variable>
<xsl:call-template name="findminatt">
<xsl:with-param name="list" select="$list[position() > 1]" />
<xsl:with-param name="tocomp"><xsl:value-of select="$tocomp"
/></xsl:with-param>
<xsl:with-param name="curval" select="$newval" />
</xsl:call-template>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
<xsl:template name="findmaxatt">
<xsl:param name="list" />
<xsl:param name="tocomp" />
<xsl:param name="curval" />
<xsl:choose>
<xsl:when test="count($list) = 0">
<xsl:value-of select="$curval" />
</xsl:when>
<xsl:otherwise>
<xsl:variable name="compval">
<xsl:value-of select="$list[1]/@*[name()=$tocomp]" />
</xsl:variable>
<xsl:variable name='newval'>
<xsl:choose>
<xsl:when test="$compval > $curval">
<xsl:value-of select="$compval" />
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="$curval" />
</xsl:otherwise>
</xsl:choose>
</xsl:variable>
<xsl:call-template name="findmaxatt">
<xsl:with-param name="list" select="$list[position() > 1]" />
<xsl:with-param name="tocomp" select="$tocomp" />
<xsl:with-param name="curval" select="$newval" />
</xsl:call-template>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
</xsl:stylesheet>
-----Original Message-----
From: Ireney Berezniak [mailto:iberezniak@usa.net]
Sent: Thursday, October 05, 2000 3:18 PM
To: xsl-list@mulberrytech.com
Subject: dynamic HTML table generation
Hi,
I have a problem and so far I have been unsuccessful finding a solution.
Any
help you guys could provide would be greatly appreciated.
I need to format and create an HTML result set table dynamically.
For example, in one instance I have a resultset in XML that contains 10
records. I need to have an XSL file which generates a table with 2 rows and
5
columns. In another instance, I might have a resultset that contains 20
records, and I need to present it in a 5 row by 4 column table using the
same
XSL file. I really want to do this dynamically. I can pass the desired row
and
column count into XSLT file so I know how many rows and columns I need to
create, but how do I do the looping to achieve this?
Thanks!
ib.
xml sample:
<rs:data>
<z:row Product_Id="98652"/>
<z:row Product_Id="98682"/>
<z:row Product_Id="98718"/>
<z:row Product_Id="104512"/>
<z:row Product_Id="106564"/>
<z:row Product_Id="174272"/>
<z:row Product_Id="175242"/>
<z:row Product_Id="191765"/>
<z:row Product_Id="194131"/>
<z:row Product_Id="194132"/>
</rs:data>
desired HTML table to be generated dynamically:
<TABLE>
<TR>
<TD></TD>
<TD></TD>
<TD></TD>
<TD></TD>
<TD></TD>
</TR>
<TR>
<TD></TD>
<TD></TD>
<TD></TD>
<TD></TD>
<TD></TD>
</TR>
</TABLE>
or (depending on the rows/columns required)
<TABLE>
<TR>
<TD></TD>
<TD></TD>
</TR>
<TR>
<TD></TD>
<TD></TD>
</TR>
<TR>
<TD></TD>
<TD></TD>
</TR>
<TR>
<TD></TD>
<TD></TD>
</TR>
<TR>
<TD></TD>
<TD></TD>
</TR>
</TABLE>
____________________________________________________________________
Get free email and a permanent address at http://www.amexmail.com/?A=1
XSL-List info and archive: http://www.mulberrytech.com/xsl/xsl-list
XSL-List info and archive: http://www.mulberrytech.com/xsl/xsl-list