Subject: RE: dynamic HTML table generation From: "hudgins, tom" <hudgins_tom@xxxxxxx> Date: Tue, 10 Oct 2000 08:32:27 -0400 |
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@xxxxxxx] Sent: Thursday, October 05, 2000 3:18 PM To: xsl-list@xxxxxxxxxxxxxxxx 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
Current Thread |
---|
|
<- Previous | Index | Next -> |
---|---|---|
RE: dynamic HTML table generation, Kay Michael | Thread | RE: Attribute to Element, Mark Dewey |
accessing text node content(text) i, Sunil Mathew | Date | RE: returning single result from ap, Kay Michael |
Month |