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

Subject: RE: [xsl] Tranforming a table with colspan and rowspan attributes to another more complex table
From: "Andrew Welch" <andrew@xxxxxxxxxxxxxxxxxxxxxxx>
Date: Tue, 29 Jan 2002 13:47:22 -0000
Hi,

Providing your input data is just like your sample, you can use this:

<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform";>

<xsl:template match="/">
  <table>
  <xsl:apply-templates select="fvtable/fvtr"/>
  </table>
</xsl:template>

<xsl:template match="fvtr">
<tr>
  <xsl:apply-templates select="fvtd"/>
</tr>
</xsl:template>

<xsl:template match="fvtd">
<td>
  <xsl:copy-of select="@colspan|@rowspan"/>
  <xsl:value-of select="."/>
</td>
</xsl:template>

</xsl:stylesheet>


You can add your html markup as you want, but I would recommend using class
attributes and then including a css style section within cdata at the top of
your stylesheet.

I hope this is a start

cheers

andrew

===




-----Original Message-----
From: owner-xsl-list@xxxxxxxxxxxxxxxxxxxxxx
[mailto:owner-xsl-list@xxxxxxxxxxxxxxxxxxxxxx]On Behalf Of Rogier
Hofboer
Sent: Tuesday, January 29, 2002 1:09 PM
To: xsl-list@xxxxxxxxxxxxxxxxxxxxxx
Subject: [xsl] Tranforming a table with colspan and rowspan attributes
to another more complex table


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



 XSL-List info and archive:  http://www.mulberrytech.com/xsl/xsl-list


Current Thread