[XSL-LIST Mailing List Archive Home] [By Thread] [By Date]

[xsl] Tranforming a table with colspan and rowspan attributes to another more complex table


Subject: [xsl] Tranforming a table with colspan and rowspan attributes to another more complex table
From: "Rogier Hofboer" <hofboer@xxxxxxxxx>
Date: Tue, 29 Jan 2002 14:08:57 +0100

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



Current Thread
Keywords
xml