Re: [xsl] How count the Table cell (Cals Table) using XSL

Subject: Re: [xsl] How count the Table cell (Cals Table) using XSL
From: "Mukul Gandhi" <gandhi.mukul@xxxxxxxxx>
Date: Tue, 27 Jun 2006 17:15:08 +0530
Hi Byomkesh,
 There are some problems in your code. Following corrections are required:

<xsl:variable name="rtf">
   <xsl:call-template name="FindMaxStringLength">
       <xsl:with-param name="n" select="count(//tr[3]/td)" />
   </xsl:call-template>
</xsl:variable>
(in <xsl:template match="table"> )

and, (please note //. You wrote /)

<xsl:for-each select="//tr[2]/th[$n] | //tr/td[$n]">
  <xsl:sort select="string-length(.)" order="descending" />
  <xsl:if test="position() = 1">
    <xsl:value-of select="string-length(.)" />
  </xsl:if >
</xsl:for-each>

With these changes, I get following in the output:

<colgroup>
  <col width="21.74%"/>
  <col width="36.96%"/>
  <col width="41.3%"/>
</colgroup>

Regards,
Mukul

On 6/27/06, Byomkesh <bkesh@xxxxxxxxxxxxxxx> wrote:
Hi Mukul

This is my XML file
----------------------
<html>
<body>
<h1>FCC and IEEE Regulations</h1>
<p>Table 1.3 shows the relative FCC and IEEE power output limits.</p>
<table border="0" cellspacing="0" cellpadding="1" width="90%">
<thead>
<tr>
<th valign="top" colspan="3">Table 1.3 802.11a Power Output Limits</th></tr>
<tr>
<th valign="top"><b>Spectrum Range</b></th>
<th valign="top"><b>FCC Limit</b></th>
<th valign="top"><b>IEEE Limit</b></th></tr>
</thead>
<tbody>
<tr><td valign="top">5.15 GHz&#x2013;5.25 GHz</td>
<td valign="top">5.15 GHz&#x2013;5.25 GHz</td>
<td valign="top">40 mW</td></tr>
<tr><td valign="top">5.25 GHz&#x2013;5.35 GHz</td>
<td valign="top">200 mW</td>
<td valign="top">250 mW</td></tr>
<tr><td valign="top">5.725 GHz&#x2013;5.825 GHz</td>
<td valign="top">800 mW</td>
<td valign="top">1,000 mW</td></tr>
</tbody>
</table>
</body>
</html>

XSL file
-----------------

<xsl:transform xmlns:gale="http://www.gale.com/eBooks";
xmlns:gale="http://www.w3.org/1999/xhtml";
xmlns:xsl="http://www.w3.org/1999/XSL/Transform";
xmlns:saxon="http://icl.com/saxon"; version="1.1"
 exclude-result-prefixes="gale" extension-element-prefixes="saxon">

 <xsl:param name="saxon.character.representation" select="decimal" />
 <xsl:output saxon:character-representation="'entity;decimal'" method="xml"
encoding="US-ASCII"
 indent="yes" />

<xsl:template match="/">

<document>
<xsl:apply-templates select="html"/>
</document>
</xsl:template>

<xsl:template match="body">

  <xsl:apply-templates/>
</xsl:template>

<xsl:template match="h1">
<title><xsl:apply-templates/></title>
</xsl:template>

<xsl:template match="p">
<xsl:element name="para">
<xsl:apply-templates/>
</xsl:element>
</xsl:template>

<xsl:template match="table">
     <table>
       <table.html frame="void" width="100%" rules="groups" align="left" />
       <xsl:variable name="rtf">
          <xsl:call-template name="FindMaxStringLength">
             <xsl:with-param name="n" select="count(//tr/td)" />
          </xsl:call-template>
       </xsl:variable>
       <colgroup>
         <xsl:for-each select="$rtf/x">
            <col width="{format-number(((. div (sum(../*))) * 100),
'##.##')}%"/>
         </xsl:for-each>
       </colgroup>
       <xsl:copy-of select="*" />
     </table>
  </xsl:template>

  <xsl:template name="FindMaxStringLength">
      <xsl:param name="n" />

     <xsl:if test="$n &gt; 0">
         <x>
           <xsl:for-each select="/tr[2]/th[$n] | /tr/td[$n]">
              <xsl:sort select="string-length(.)" order="descending" />
              <xsl:if test="position() = 1">
                  <xsl:value-of select="string-length(.)" />
              </xsl:if >
           </xsl:for-each>
         </x>
         <xsl:call-template name="FindMaxStringLength">
            <xsl:with-param name="n" select="$n - 1" />
         </xsl:call-template>
      </xsl:if>

</xsl:template>

<xsl:template match="tr">
<xsl:text>&#xa;</xsl:text><tr>
<xsl:apply-templates/>
</tr>
</xsl:template>

<xsl:template match="td">
<xsl:text>&#xa;</xsl:text><td>
<xsl:apply-templates/>
</td>
</xsl:template>

<xsl:template match="th">
<xsl:text>&#xa;</xsl:text><th>
<xsl:apply-templates/>
</th>
</xsl:template>

<xsl:template match="thead">
<xsl:text>&#xa;</xsl:text><thead>
<xsl:apply-templates/>
</thead>
</xsl:template>

<xsl:template match="tbody">
<xsl:text>&#xa;</xsl:text><tbody>
<xsl:apply-templates/>
</tbody>
</xsl:template>
 </xsl:transform>

Now Output -->
-----------------

<?xml version="1.0" encoding="US-ASCII"?>
<document>

  <title>FCC and IEEE Regulations</title>
  <para>Table 1.3 shows the relative FCC and IEEE power output
limits.</para>
  <table>
     <table.html frame="void" width="100%" rules="groups" align="left"/>
     <colgroup>
        <col width="NaN%"/>
        <col width="NaN%"/>
        <col width="NaN%"/>
        <col width="NaN%"/>
        <col width="NaN%"/>
        <col width="NaN%"/>
        <col width="NaN%"/>
        <col width="NaN%"/>
        <col width="NaN%"/>
     </colgroup>
     <thead>
        <tr>
           <th valign="top" colspan="3">Table 1.3 802.11a Power Output
Limits</th>
        </tr>
        <tr>
           <th valign="top">
              <b>Spectrum Range</b>
           </th>
           <th valign="top">
              <b>FCC Limit</b>
           </th>
           <th valign="top">
              <b>IEEE Limit</b>
           </th>
        </tr>
     </thead>
     <tbody>
        <tr>
           <td valign="top">5.15 GHz&#8211;5.25 GHz</td>
           <td valign="top">5.15 GHz&#8211;5.25 GHz</td>
           <td valign="top">40 mW</td>
        </tr>
        <tr>
           <td valign="top">5.25 GHz&#8211;5.35 GHz</td>
           <td valign="top">200 mW</td>
           <td valign="top">250 mW</td>
        </tr>
        <tr>
           <td valign="top">5.725 GHz&#8211;5.825 GHz</td>
           <td valign="top">800 mW</td>
           <td valign="top">1,000 mW</td>
        </tr>
     </tbody>
  </table>

</document>

Not convert to percentage and maximu <col width="?">

Thanks,

Byomkesh
----- Original Message -----
From: "Mukul Gandhi" <gandhi.mukul@xxxxxxxxx>
To: "Byomkesh" <bkesh@xxxxxxxxxxxxxxx>
Cc: <xsl-list@xxxxxxxxxxxxxxxxxxxxxx>
Sent: Tuesday, June 27, 2006 1:13 PM
Subject: Re: [xsl] How count the Table cell (Cals Table) using XSL


> Hi Byomkesh, > I am not getting the error you posted. > > XML is (I had to correct a well formdness error): > > <table border="0" cellspacing="0" cellpadding="1" width="90%"> > <thead> > <tr> > <th valign="top" colspan="3"><b>Table 1.1 802.11b Channels</b></th> > </tr> > <tr> > <th>Channel Number</th> > <th>Center Frequency (in GHz)</th> > <th>USA</th> > </tr> > </thead> > <tbody> > <tr> > <td>1</td> > <td>2.412</td> > <td>&#x2713;</td> > </tr> > </tbody> > </table> > > With the stylesheet I posted, I am getting output: > > java net.sf.saxon.Transform bk.xml bk.xsl > <?xml version="1.0" encoding="UTF-8"?> > <table> > <table.html frame="void" width="100%" rules="groups" align="left"/> > <colgroup> > <col width="7.14%"/> > <col width="59.52%"/> > <col width="33.33%"/> > </colgroup> > <thead> > <tr> > <th valign="top" colspan="3"> > <b>Table 1.1 802.11b Channels</b> > </th> > </tr> > <tr> > <th>Channel Number</th> > <th>Center Frequency (in GHz)</th> > <th>USA</th> > </tr> > </thead> > <tbody> > <tr> > <td>1</td> > <td>2.412</td> > <td>NB#C4</td> > </tr> > </tbody> > </table> > > I am using Saxon basic version. Are you using Saxon Schema Aware version? > > Regards, > Mukul > > On 6/27/06, Byomkesh <bkesh@xxxxxxxxxxxxxxx> wrote: > > Hi Mukul, > > > > Thanks for your help. But its showing validation Error > > <!--- > > Validation error > > FORG0001: Cannot convert string "" to a double > > Transformation failed: Run-time errors were reported > > > > --> > > > > I have using Saxon 8.7.3j. I did not understand this error. Please Sorry > > again i am disturb you. > > > > Now what can i do? > > > > > > Thanks > > > > Byomkesh

Current Thread