Hello there,
This is practically the first time that I am posting to this list, so
aplogies if I have broken any of the rules.
I have an HTML table where in I need to create colspec and spanspec, please
see if you can help. I have been scratching my head on this for a week now
but couldn't even reach close to it. I understand that the code and examples
below are too lengthy to go through, but please help. I should be able to go
forward even if somebody could provide me with a logical hint. Thanks very
much. I could have posted the code I tried but just wanted to avoid making
my whole query less lengthy and less complicated.
INPUT XML FILE:
<table>
<tbody>
<tr>
<td class="tch" align="left">1</td>
<td class="tch" colspan="9" align="right">2</td>
</tr>
<tr>
<td class="tch" align="left">4</td>
<td class="tch" align="left">5</td>
<td class="tch" align="center">6</td>
<td class="tch" align="center">7</td>
<td class="tch" colspan="5" align="left">8</td>
<td class="tch" align="left">9</td>
</tr>
<tr>
<td class="tb" align="left">10</td>
<td class="tb" colspan="9" align="right">11</td>
</tr>
<tr>
<td class="tb" align="left">12</td>
<td class="tb" align="left">13</td>
<td class="tb" colspan="3" align="right">14</td>
<td class="tb" align="left">15</td>
<td class="tb" colspan="2" align="left">16</td>
</tr>
</tbody>
</table>
CURRENT OUTPUT:
<table>
<tgroup cols="10">
<thead>
<row>
<entry class="tch" align="left" name="col1">1</entry>
<entry class="tch" colspan="9" align="right" name="col2to10">2</entry>
</row>
<row>
<entry class="tch" align="left" name="col1">4</entry>
<entry class="tch" align="left" name="col2">5</entry>
<entry class="tch" align="center" name="col3">6</entry>
<entry class="tch" align="center" name="col4">7</entry>
<entry class="tch" colspan="5" align="left" name="col5to9">8</entry>
<entry class="tch" align="left" name="col10">9</entry>
</row>
</thead>
<tbody>
<row>
<entry class="tb" align="left" name="col1">10</entry>
<entry class="tb" colspan="9" align="right" name="col2to10">11</entry>
</row>
<row>
<entry class="tb" align="left" name="col1">12</entry>
<entry class="tb" align="left" name="col2">13</entry>
<entry class="tb" colspan="3" align="right" name="col3to5">14</entry>
<entry class="tb" align="left" name="col6">15</entry>
<entry class="tb" colspan="2" align="left" name="col7to8">16</entry>
</row>
</tbody>
</tgroup>
</table>
DESIRED OUTPUT:
<table>
<tgroup cols="10">
<!--value of name should be same as the row name, value of align should be
the string that has occurred maximum times in rows. For instance, in this
example there are four "col1" one inside each row, three of which have
"left" as the value of align and one has "right", so colspec name="col1"
should have align="left" because it has the maximum occurence of the two. If
all the occurences would have been equal, we could have picked any. There
could be as many values of align as it is allowed to.-->
<colspec name="col1" align="left"/>
<colspec name="col2" align="left"/>
<colspec name="col3" align="center"/>
<colspec name="col4" align="center"/>
<colspec name="col6" align="left"/>
<colspec name="col10" align="left"/>
<spanspec name="col2to10" align="right"/>
<spanspec name="col3to5" align="right"/>
<spanspec name="col5to9" align="left"/>
<spanspec name="col7to8" align="left"/>
<thead>
<row>
<entry class="tch" align="left" name="col1">1</entry>
<entry class="tch" colspan="9" align="right" name="col2to10">2</entry>
</row>
<row>
<entry class="tch" align="left" name="col1">4</entry>
<entry class="tch" align="left" name="col2">5</entry>
<entry class="tch" align="center" name="col3">6</entry>
<entry class="tch" align="center" name="col4">7</entry>
<entry class="tch" colspan="5" align="left" name="col5to9">8</entry>
<entry class="tch" align="left" name="col10">9</entry>
</row>
</thead>
<tbody>
<row>
<entry class="tb" align="right" name="col1">10</entry>
<entry class="tb" colspan="9" align="right" name="col2to10">11</entry>
</row>
<row>
<entry class="tb" align="left" name="col1">12</entry>
<entry class="tb" align="left" name="col2">13</entry>
<entry class="tb" colspan="3" align="right" name="col3to5">14</entry>
<entry class="tb" align="left" name="col6">15</entry>
<entry class="tb" colspan="2" align="left" name="col7to8">16</entry>
</row>
</tbody>
</tgroup>
</table>
CURRENT CODE:
<xsl:template match="table">
<table>
<tgroup>
<xsl:apply-templates/>
</tgroup>
</table>
</xsl:template>
<xsl:template match="tr">
<xsl:if
test="child::td[@class='tch'][not(preceding::tr[1][child::td[@class='tch']])]">
<thead>
<row>
<xsl:apply-templates/>
</row>
<!--code to group all class="tch" appearing together as thead-->
</thead>
</xsl:if>
<xsl:if
test="child::td[@class='tbtm'][not(preceding::tr[1][child::td[@class='tbtm']])]">
<tfoot>
<row>
<xsl:apply-templates/>
</row>
<!--code to group all class="tbtm" appearing together as tfoot-->
</tfoot>
</xsl:if>
<xsl:if
test="child::td[@class='tb'][not(preceding::tr[1][child::td[@class='tb']])]">
<tbody>
<row>
<xsl:apply-templates/>
</row>
<!--code to group all class="tb" appearing together as tbody-->
</tbody>
</xsl:if>
</xsl:template>
<xsl:template match="tbody">
<xsl:apply-templates/>
</xsl:template>
<xsl:template match="td">
<entry>
<xsl:attribute name="class">
<xsl:value-of select="@class"/>
</xsl:attribute>
<xsl:if test="@colspan">
<xsl:attribute name="colspan">
<xsl:value-of select="@colspan"/>
</xsl:attribute>
</xsl:if>
<!--following is the code to generate value of name attribute, the values of
name attribute of colspec and spanspec should be same as the values
generated by the code below-->
<xsl:attribute name="name">
<xsl:text>col</xsl:text>
<xsl:if test="not(@colspan)">
<xsl:if test="not(preceding-sibling::td[@colspan])">
<xsl:value-of select="count(preceding-sibling::td)+1"/>
</xsl:if>
<xsl:if test="preceding-sibling::td[@colspan]">
<xsl:variable name="colspan_values"
select="sum(preceding-sibling::td[@colspan]/@colspan)"/>
<xsl:variable name="td_number" select="count(preceding-sibling::td)"/>
<xsl:variable name="colspan_td_number"
select="count(preceding-sibling::td[@colspan])"/>
<xsl:value-of select="($td_number+$colspan_values+1) - $colspan_td_number"/>
</xsl:if>
</xsl:if>
<xsl:if test="@colspan">
<xsl:if test="not(preceding-sibling::td[@colspan])">
<xsl:value-of select="count(preceding-sibling::td)+1"/>
<xsl:text>to</xsl:text>
<xsl:variable name="td_number" select="count(preceding-sibling::td)"/>
<xsl:variable name="colspan" select="@colspan"/>
<xsl:value-of select="count(preceding-sibling::td)+@colspan"/>
</xsl:if>
<xsl:if test="preceding-sibling::td[@colspan]">
<xsl:variable name="colspan_values"
select="sum(preceding-sibling::td[@colspan]/@colspan)"/>
<xsl:variable name="td_number" select="count(preceding-sibling::td)"/>
<xsl:variable name="colspan_number"
select="count(preceding-sibling::td[@colspan])"/>
<xsl:variable name="starting_value">
<xsl:value-of select="($td_number+$colspan_values+1) - $colspan_number"/>
</xsl:variable>
<xsl:value-of select="$starting_value"/>
<xsl:text>to</xsl:text>
<xsl:value-of select="$starting_value+@colspan - 1"/>
</xsl:if>
</xsl:if>
</xsl:attribute>
<xsl:apply-templates/>
</entry>
</xsl:template>
<xsl:template match="p">
<p>
<xsl:apply-templates/>
</p>
</xsl:template>
Thanks again,
Siddhi