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

[xsl] Incorrect colname attribute value in case of rowspan attribute presence in html while HTML to CALS Table Transformation


Subject: [xsl] Incorrect colname attribute value in case of rowspan attribute presence in html while HTML to CALS Table Transformation
From: "Joga Singh Rawat" <jrawat@xxxxxxxxxxxxxx>
Date: Sun, 29 Apr 2012 10:59:11 +0530

HI Everybody,
I am converting plain html table to cals table. I have calculated 'colspan'
into 'spanname' correctly but I don't have any clue to transform 'rowspan'.

Please let me know any clue. Below is INPUT, XSLT, OUTPUT and Required
output


Input:
<div class="divTable">
<table class="numtable" id="table2">
  <tbody>
   <tr>
    <td class="tch rowspan="2">col1</td>                    
    <td class="tch" colspan="3">col2-4</td>
   </tr>
   <tr>
    <td class="tch">col2</td>
    <td class="tch">col3</td>
    <td class="tch">col4</td>
   </tr>
   <tr>
    <td class="tch">col1</td>
    <td class="tch">col2</td>
    <td class="tch">col3</td>
    <td class="tch">col4</td>
   </tr>                                 
   <tr>
    <td class="tch">col1</td>                   
    <td class="tch" rowspan="3">col2</td>
    <td class="tch" colspan="2">col3-4</td>
   </tr>
   <tr>
    <td class="tch">col1</td>
    <td class="tch">col3</td>
    <td class="tch">col4</td>
   </tr>
   <tr>
    <td class="tch">col1</td>
    <td class="tch">col3</td>
    <td class="tch">col4</td>
    </tr>
   </tbody>
  </table>
</div>


XSLT
<xsl:template match="td">
 <entry>
  <xsl:call-template name="colname-spanname"/>
  <xsl:apply-templates/>
 </entry>
</xsl:template>

<xsl:template name="colname-spanname">
  <xsl:if test="not(@colspan)">
   <xsl:attribute name="colname">
    <xsl:text>col</xsl:text>
    <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:attribute>
  </xsl:if>
  <xsl:if test="@colspan">
   <xsl:attribute name="spanname">
    <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:attribute>
   <xsl:attribute name="namest">
    <xsl:text>col</xsl:text>
    <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:value-of
select="count(preceding-sibling::td[not(@colspan)])+sum(preceding-sibling::t
d[@colspan]/@colspan)+1"/>
    </xsl:if>
   </xsl:attribute>
   <xsl:attribute name="nameend">
    <xsl:text>col</xsl:text>
    <xsl:if test="not(preceding-sibling::td[@colspan])">
     <xsl:value-of select="count(preceding-sibling::td)+@colspan"/>
    </xsl:if>
    <xsl:if test="preceding-sibling::td[@colspan]">
     <xsl:value-of
select="count(preceding-sibling::td[not(@colspan)])+sum(preceding-sibling::t
d[@colspan]/@colspan)+@colspan"/>
    </xsl:if>
   </xsl:attribute>
  </xsl:if>
 </xsl:template>

<xsl:template name="max_column">
  <xsl:if test="not(descendant::td[@colspan][not(@class='Table_Caption' or
@class='Table_caption')][not(@class='Table_Subtitle' or
@class='Table_subtitle')])">
   <xsl:value-of select="for $x in descendant::tbody return (max((for $y in
descendant::tr[not(child::td[@class='Table_Caption' or
@class='Table_caption'])][not(child::td[@class='Table_Subtitle' or
@class='Table_subtitle'])] return count($y/td))))"/>
  </xsl:if>
  <xsl:if test="descendant::td[@colspan][not(@class='Table_Caption' or
@class='Table_caption')][not(@class='Table_Subtitle' or
@class='Table_subtitle')]">
   <xsl:variable name="tr_without_colspan" as="xsd:integer?">
    <xsl:value-of select="for $x in descendant::tbody return if
(descendant::tr[not(child::td[@colspan])]) then (max((for $y in
descendant::tr[not(child::td[@colspan])][not(child::td[@class='Table_Caption
' or @class='Table_caption'])][not(child::td[@class='Table_Subtitle' or
@class='Table_subtitle'])] return count($y/td)))) else 0"/>
   </xsl:variable>
   <xsl:variable name="tr_with_colspan" as="xsd:integer?">
    <xsl:value-of select="for $x in descendant::tbody return (max((for $y in
descendant::tr[child::td[@colspan]][not(child::td[@class='Table_Caption' or
@class='Table_caption'])][not(child::td[@class='Table_Subtitle' or
@class='Table_subtitle'])] return number(count($y/td[not(@colspan)]) +
sum($y/td/@colspan)))))"/>
   </xsl:variable>
   <xsl:value-of select="max(($tr_with_colspan,$tr_without_colspan))"/>
  </xsl:if>
 </xsl:template>

Output:
<table id="FileName_table2">
  <tgroup cols="4">      
   <thead>
    <row>
     <entry colname="col1" morerows="1">col1</entry>
     <entry spanname="2to4" namest="col2" nameend="col4">col2-4</entry>
    </row>
    <row>
     <entry colname="col1">col2</entry>
     <entry colname="col2">col3</entry>
     <entry colname="col3">col4</entry>
    </row>
    <row>
     <entry colname="col1">col1</entry>
     <entry colname="col2">col2</entry>
     <entry colname="col3">col3</entry>
     <entry colname="col4">col4</entry>
    </row>
    <row>
     <entry colname="col1">col1</entry>
     <entry colname="col2" morerows="2">col2</entry>
     <entry spanname="3to4" namest="col3" nameend="col4">col3-4</entry>
    </row>
    <row>
     <entry colname="col1">col1</entry>
     <entry colname="col2">col3</entry>
     <entry colname="col3">col4</entry>
    </row>
    <row>
     <entry colname="col1">col1</entry>
     <entry colname="col2">col3</entry>
     <entry colname="col3">col4</entry>
    </row>
   </thead>
  </tgroup>
</table>

Required Output:
<table id="FileName_table2">
 <tgroup cols="4">      
  <thead>
   <row>
    <entry colname="col1" morerows="1">col1</entry>
    <entry spanname="2to4" namest="col2" nameend="col4">col2-4</entry>
   </row>
   <row>
    <entry colname="col2">col2</entry>
    <entry colname="col4">col3</entry>
    <entry colname="col4">col4</entry>
   </row>
   <row>
    <entry colname="col1">col1</entry>
    <entry colname="col2">col2</entry>
    <entry colname="col3">col3</entry>
    <entry colname="col4">col4</entry>
   </row>
   <row>
    <entry colname="col1">col1</entry>
    <entry colname="col2" morerows="2">col2</entry>
    <entry spanname="3to4" namest="col3" nameend="col4">col3-4</entry>
   </row>
   <row>
    <entry colname="col1">col1</entry>
    <entry colname="col3">col3</entry>
    <entry colname="col4">col4</entry>
   </row>
   <row>
    <entry colname="col1">col1</entry>
    <entry colname="col3">col3</entry>
    <entry colname="col4">col4</entry>
   </row>
  </thead>
 </tgroup>
</table>

Thanks
...JSR


Current Thread
Keywords