Hi Jay,
Thanks for the post. The code's poetry. i can see I'm going to have to
do a little work with the colspans and empty cells but other than
that, worked like a charm.
Great Post!,
Spencer
On 6/9/05, JBryant(_at_)s-s-t(_dot_)com <JBryant(_at_)s-s-t(_dot_)com> wrote:
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="{(_at_)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(_at_)gmail(_dot_)com>
06/09/2005 04:33 PM
Please respond to
xsl-list(_at_)lists(_dot_)mulberrytech(_dot_)com
To
xsl-list(_at_)lists(_dot_)mulberrytech(_dot_)com
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
--~------------------------------------------------------------------
XSL-List info and archive: http://www.mulberrytech.com/xsl/xsl-list
To unsubscribe, go to: http://lists.mulberrytech.com/xsl-list/
or e-mail:
<mailto:xsl-list-unsubscribe(_at_)lists(_dot_)mulberrytech(_dot_)com>
--~--
--~------------------------------------------------------------------
XSL-List info and archive: http://www.mulberrytech.com/xsl/xsl-list
To unsubscribe, go to: http://lists.mulberrytech.com/xsl-list/
or e-mail:
<mailto:xsl-list-unsubscribe(_at_)lists(_dot_)mulberrytech(_dot_)com>
--~--
--~------------------------------------------------------------------
XSL-List info and archive: http://www.mulberrytech.com/xsl/xsl-list
To unsubscribe, go to: http://lists.mulberrytech.com/xsl-list/
or e-mail: <mailto:xsl-list-unsubscribe(_at_)lists(_dot_)mulberrytech(_dot_)com>
--~--