This is the mail archive of the
xsl-list@mulberrytech.com
mailing list .
Tranforming a table with colspan and rowspan attributes to another more complex table
- From: "Rogier Hofboer" <hofboer at planet dot nl>
- To: <xsl-list at lists dot mulberrytech dot com>
- Date: Tue, 29 Jan 2002 14:08:57 +0100
- Subject: [xsl] Tranforming a table with colspan and rowspan attributes to another more complex table
- References: <001a01c1a8a8$e579c760$78fe0250@pcukmka>
- Reply-to: xsl-list at lists dot mulberrytech dot com
Hi,
Can anybody help me out with the following?
xml:
<fvtable>
<fvtr>
<fvtd>1</fvtd>
<fvtd>2</fvtd>
<fvtd>3</fvtd>
<fvtd>4</fvtd>
</fvtr>
<fvtr>
<fvtd>5</fvtd>
<fvtd>6</fvtd>
<fvtd>7</fvtd>
<fvtd>8</fvtd>
</fvtr>
</fvtable>
xslt:
<?xml version="1.0"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html" indent="yes"/>
<xsl:template match="fvtable">
<table width="100%" border="0" cellpadding="0" cellspacing="1">
<xsl:variable name="maxcells">
<xsl:for-each select="fvtr"><xsl:sort select="count(fvtd)"
order="descending"/>
<xsl:if test="position()=1"><xsl:value-of
select="count(fvtd)"/></xsl:if>
</xsl:for-each>
</xsl:variable>
<tr>
<td colspan="{$maxcells*2+1}" bgcolor="#D9DCEF" height="2"></td>
</tr>
<xsl:for-each select="fvtr">
<tr>
<td bgcolor="#D9DCEF" width="2"></td>
<xsl:for-each select="fvtd">
<td bgcolor="#FFFFDD" valign="top">
<font face="arial" size="2">
<xsl:apply-templates />
</font>
</td>
<xsl:if test="position() != last()">
<td bgcolor="#D9DCEF" width="1"></td>
</xsl:if>
</xsl:for-each>
<td bgcolor="#D9DCEF" width="2"></td>
</tr>
<xsl:if test="position() != last()">
<tr>
<td colspan="{$maxcells*2+1}" bgcolor="#D9DCEF" height="1"></td>
</tr>
</xsl:if>
</xsl:for-each>
<tr>
<td colspan="{$maxcells*2+1}" bgcolor="#D9DCEF" height="2"></td>
</tr>
</table>
</xsl:template>
</xsl:stylesheet>
This works ok.
But now I want to change the input XML to be something like this:
<fvtable>
<fvtr>
<fvtd colspan="2">1</fvtd>
<fvtd>2</fvtd>
<fvtd>3</fvtd>
<fvtd>4</fvtd>
<fvtd>5</fvtd>
</fvtr>
<fvtr>
<fvtd>6</fvtd>
<fvtd>7</fvtd>
<fvtd colspan="2">8</fvtd>
<fvtd rowspan="3">9</fvtd>
<fvtd>10</fvtd>
</fvtr>
<fvtr>
<fvtd>11</fvtd>
<fvtd colspan="2" rowspan="2">12</fvtd>
<fvtd>13</fvtd>
<fvtd>14</fvtd>
</fvtr>
<fvtr>
<fvtd>15</fvtd>
<fvtd>16</fvtd>
<fvtd>17</fvtd>
</fvtr>
</fvtable>
And this HTML as output:
<table width="100%" border="0" cellpadding="0" cellspacing="1">
<tr>
<td colspan="13" bgcolor="#D9DCEF" height="2"></td>
</tr>
<tr>
<td bgcolor="#D9DCEF" width="2"></td>
<td colspan="3" bgcolor="#FFFFDD" valign="top">
<font face="arial" size="2">1</font>
</td>
<td bgcolor="#D9DCEF" width="1"></td>
<td bgcolor="#FFFFDD" valign="top">
<font face="arial" size="2">2</font>
</td>
<td bgcolor="#D9DCEF" width="1"></td>
<td bgcolor="#FFFFDD" valign="top">
<font face="arial" size="2">3</font>
</td>
<td bgcolor="#D9DCEF" width="1"></td>
<td bgcolor="#FFFFDD" valign="top">
<font face="arial" size="2">4</font>
</td>
<td bgcolor="#D9DCEF" width="1"></td>
<td bgcolor="#FFFFDD" valign="top">
<font face="arial" size="2">5</font>
</td>
<td bgcolor="#D9DCEF" width="2"></td>
</tr>
<tr>
<td colspan="13" bgcolor="#D9DCEF" height="1"></td>
</tr>
<tr>
<td bgcolor="#D9DCEF" width="2"></td>
<td bgcolor="#FFFFDD" valign="top">
<font face="arial" size="2">6</font>
</td>
<td bgcolor="#D9DCEF" width="1"></td>
<td bgcolor="#FFFFDD" valign="top">
<font face="arial" size="2">7</font>
</td>
<td bgcolor="#D9DCEF" width="1"></td>
<td colspan="3" bgcolor="#FFFFDD" valign="top">
<font face="arial" size="2">8</font>
</td>
<td bgcolor="#D9DCEF" width="1"></td>
<td rowspan="5" bgcolor="#FFFFDD" valign="top">
<font face="arial" size="2">9</font>
</td>
<td bgcolor="#D9DCEF" width="1"></td>
<td bgcolor="#FFFFDD" valign="top">
<font face="arial" size="2">10</font>
</td>
<td bgcolor="#D9DCEF" width="2"></td>
</tr>
<tr>
<td colspan="9" bgcolor="#D9DCEF" height="1"></td>
<td colspan="3" bgcolor="#D9DCEF" height="1"></td>
</tr>
<tr>
<td bgcolor="#D9DCEF" width="2"></td>
<td bgcolor="#FFFFDD" valign="top">
<font face="arial" size="2">11</font>
</td>
<td bgcolor="#D9DCEF" width="1"></td>
<td colspan="3" rowspan="3" bgcolor="#FFFFDD" valign="top">
<font face="arial" size="2">12</font>
</td>
<td bgcolor="#D9DCEF" width="1"></td>
<td bgcolor="#FFFFDD" valign="top">
<font face="arial" size="2">13</font>
</td>
<td bgcolor="#D9DCEF" width="1"></td>
<td bgcolor="#D9DCEF" width="1"></td>
<td bgcolor="#FFFFDD" valign="top">
<font face="arial" size="2">14</font>
</td>
<td bgcolor="#D9DCEF" width="2"></td>
</tr>
<tr>
<td colspan="3" bgcolor="#D9DCEF" height="1"></td>
<td colspan="3" bgcolor="#D9DCEF" height="1"></td>
<td colspan="3" bgcolor="#D9DCEF" height="1"></td>
</tr>
<tr>
<td bgcolor="#D9DCEF" width="2"></td>
<td bgcolor="#FFFFDD" valign="top">
<font face="arial" size="2">15</font>
</td>
<td bgcolor="#D9DCEF" width="1"></td>
<td bgcolor="#D9DCEF" width="1"></td>
<td bgcolor="#FFFFDD" valign="top">
<font face="arial" size="2">16</font>
</td>
<td bgcolor="#D9DCEF" width="1"></td>
<td bgcolor="#D9DCEF" width="1"></td>
<td bgcolor="#FFFFDD" valign="top">
<font face="arial" size="2">17</font>
</td>
<td bgcolor="#D9DCEF" width="2"></td>
</tr>
<tr>
<td colspan="13" bgcolor="#D9DCEF" height="2"></td>
</tr>
</table>
I tried a lot of things... But I can't find a single
solution that's able to handle all the cases.
(just simple colspans work, but not things like the definition above)
The stylesheet I am looking for should be able to handle
all kinds combinations with colspan an rowspan
it should include a complete table handler.
Is this possible to build with XSLT? Anyone?
Thanks in advance,
Rogier Hofboer
XSL-List info and archive: http://www.mulberrytech.com/xsl/xsl-list