Re: [xsl] Interesting Table loop

Subject: Re: [xsl] Interesting Table loop
From: JBryant@xxxxxxxxx
Date: Thu, 9 Jun 2005 17:32:16 -0500
Hi, Spencer,

How about:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform";>
<xsl:output method="html" omit-xml-declaration="no" indent="yes"/>

  <xsl:template match="/">
    <html>
      <body>
        <xsl:apply-templates/>
      </body>
    </html>
  </xsl:template>

  <xsl:template match="Table">
    <table border="1">
      <!-- Make the header row -->
      <tr>
        <xsl:for-each select="Cell[qp_table_numeric_head]">
          <xsl:apply-templates select="."/>
        </xsl:for-each>
      </tr>
      <!-- Make the body rows -->
        <xsl:for-each-group 
select="Cell[qp_table_numeric_body]|Cell[qp_table_numeric_data]" 
group-starting-with="Cell[qp_table_numeric_body]">
          <tr>
            <xsl:apply-templates select="current-group()/self::*"/>
          </tr>
        </xsl:for-each-group>
      <!-- Make the footnote -->
      <tr>
        <xsl:for-each select="Cell[qp_table_numeric_footnote]">
          <xsl:apply-templates select="."/>
        </xsl:for-each>
      </tr>
    </table>
  </xsl:template>

  <xsl:template match="Cell[qp_table_numeric_head]">
    <th>
      <xsl:apply-templates/>
    </th>
  </xsl:template>

  <xsl:template 
match="Cell[qp_table_numeric_body]|Cell[qp_table_numeric_data]">
    <td>
      <xsl:apply-templates/>
    </td>
  </xsl:template>

  <xsl:template match="Cell[qp_table_numeric_footnote]">
    <td colspan="{@ccols}">
      <xsl:apply-templates/>
    </td>
  </xsl:template>

  <xsl:template 
match="qp_table_numeric_head|qp_table_numeric_body|qp_table_numeric_data|qp_table_numeric_footnote">
    <xsl:value-of select="."/>
  </xsl:template>

</xsl:stylesheet>

I assumed that the only thing that actually spanned columns would be 
footnotes. I bet you can add spanning if you need to, though. Also, this 
will break if the first data value in each row is not a 
qp_table_numeric_body node.

To test this, I extended your data set to have two body rows and ran it 
through Saxon 8.4. I got what I expected. (Minor issue: You might want to 
fiddle with normalize-space a bit, as this stylesheet inserts spaces and 
linebreaks quite a bit - a consequence of trying to make a readable 
stylesheet.)

I love for-each-group.

Jay Bryant
Bryant Communication Services
(presently consulting at Synergistic Solution Technologies)



Spencer Tickner <spencertickner@xxxxxxxxx> 
06/09/2005 04:33 PM
Please respond to
xsl-list@xxxxxxxxxxxxxxxxxxxxxx


To
xsl-list@xxxxxxxxxxxxxxxxxxxxxx
cc

Subject
[xsl] Interesting Table loop






Hi everyone,

Thanks in advance for the help. I have a table comming out of another
program, I have to turn it into a html table. Using xslt 2.0.

So far I have tried recursively calling 2 templates representing the
rows and column counts of tables. Of course, because these have no
reference to the original table (there is more than 1 in each
document), I cannot acurately grab the content. Here is the xml:

<Table xmlns:aid="http://ns.adobe.com/AdobeInDesign/4.0/";
aid:table="table" aid:trows="3" aid:tcols="7">

<Cell aid:table="cell" aid:crows="1" aid:ccols="1"
aid:ccolwidth="192"> 
 
<qp_table_numeric_head>Performance Measure</qp_table_numeric_head>
 </Cell>

<Cell aid:table="cell" aid:crows="1" aid:ccols="1" aid:ccolwidth="50">
 
 
<qp_table_numeric_head>2001/02Actual</qp_table_numeric_head>
</Cell>

<Cell aid:table="cell" aid:crows="1" aid:ccols="1" aid:ccolwidth="50">
 
 
<qp_table_numeric_head>2002/03Actual</qp_table_numeric_head>
</Cell>

<Cell aid:table="cell" aid:crows="1" aid:ccols="1" aid:ccolwidth="50">
 
 
<qp_table_numeric_head>2003/04Actual</qp_table_numeric_head>
</Cell>

<Cell aid:table="cell" aid:crows="1" aid:ccols="1" aid:ccolwidth="50">
 
 
<qp_table_numeric_head>2004/05Target</qp_table_numeric_head>
 </Cell>

<Cell aid:table="cell" aid:crows="1" aid:ccols="1" aid:ccolwidth="50">
 
 
<qp_table_numeric_head>2004/05Actual</qp_table_numeric_head>
 </Cell>

<Cell aid:table="cell" aid:crows="1" aid:ccols="1" aid:ccolwidth="50">
 
            <qp_table_numeric_head>2004/05
Variance</qp_table_numeric_head>
</Cell>

<Cell aid:table="cell" aid:crows="1" aid:ccols="1"
aid:ccolwidth="192"> 
 
<qp_table_numeric_body>2.2Percentage of total
caseload.</qp_table_numeric_body>
 </Cell>

 <Cell aid:table="cell" aid:crows="1" aid:ccols="1"
aid:ccolwidth="50"> 
 
<qp_table_numeric_data>28.4%</qp_table_numeric_data>
</Cell>

<Cell aid:table="cell" aid:crows="1" aid:ccols="1" aid:ccolwidth="50">
 
    <qp_table_numeric_data>35.4%</qp_table_numeric_data>
</Cell>

<Cell aid:table="cell" aid:crows="1" aid:ccols="1" aid:ccolwidth="50">
 
 
<qp_table_numeric_data>43.3%</qp_table_numeric_data>
</Cell>

 <Cell aid:table="cell" aid:crows="1" aid:ccols="1"
aid:ccolwidth="50"> 
 
<qp_table_numeric_data>46.0%</qp_table_numeric_data>
</Cell>

<Cell aid:table="cell" aid:crows="1" aid:ccols="1" aid:ccolwidth="50">
 
      <qp_table_numeric_data>49.8%</qp_table_numeric_data>
</Cell>

<Cell aid:table="cell" aid:crows="1" aid:ccols="1" aid:ccolwidth="50">
 
       <qp_table_numeric_data>+3.8%</qp_table_numeric_data>
</Cell>

<Cell aid:table="cell" aid:crows="1" aid:ccols="7">
<qp_table_numeric_footnote>Source: Planning.</qp_table_numeric_footnote>
</Cell>

 </Table>


So I here's the pseudo xslt I figure should make the table.

<xsl:template match="table"/>
  <!-- Loop until you get to the end of @aid:trows -->
  <tr>
      <!-- Loop until you get to the end of @aid:tcols -->
        <td><xsl:apply-templates select="Cell"/></td>
       <!-- End col loop -->
  </tr>
  <!-- End row loop -->
</xsl:template>

I'm kinda perplexed by how to do this, any suggestions, or if another
way jumps out at you, I'd be very gratefull for the advice. As a side
note, @aid:ccols in the Cell attribute seem to represent colspan.

Spencer

Current Thread