|
Subject: RE: [xsl] Transforming Tables - repost From: "Michael Kay" <mike@xxxxxxxxxxxx> Date: Tue, 16 May 2006 09:19:47 +0100 |
It might be just me, but I'm finding that the lexical issues of non-XML
markup get in the way of understanding the structural transformation issues.
I would be inclined to split the problem into two: first get the structure
right with a regular XML-to-XML transformation, then do a second phase to
produce the proprietary markup syntax.
I think I would tackle the rowspans with a multi-pass approach: do a
pre-pass of the data in which any cell with a rowspan is copied into the
subsequent rows, with some kind of attribute to mark it as such. The logic
would be something like:
<xsl:template match="row" mode="expand-rowspan">
<xsl:variable name="new-cells">
<xsl:copy-of select="cell">
<xsl:for-each select="preceding-sibling::row/cell[f:row-number(..) +
@rowspan -1 gt f:row-number(current()) ]">
<xsl:copy>
<xsl:copy select="@col"/>
<xsl:attribute name="copied" select="true()"/>
where f:row-number computes the number of a row.
Michael Kay
http://www.saxonica.com/
> -----Original Message-----
> From: Jeff Sese [mailto:jsese@xxxxxxxxxxxx]
> Sent: 16 May 2006 07:58
> To: Xsl-List
> Subject: [xsl] Transforming Tables - repost
>
> Good day!
>
> I'm transforming a table xml into a InDesign tagged text
> table using XSLT 2.0 on Saxon and i'm having a problem when
> it comes to spanning. In InDesign tagged text a cell is
> constructed this way:
> <clStart:x,y>data<clEnd:>, x is the number of rows and y the
> number columns occupied by the cell. However, if the table
> has 5 columns then each row must have 5 cell entries as well
> regardless if there exist a cell the spans the rest of the
> column or a previous cell that spans the row position.
>
> So if you have a table xml like this:
> <table row="4" col="5">
> <row>
> <cell col="1">Data</cell>
> <cell col="2" colspan="3">Data</cell>
> <cell col="5">Data</cell>
> </row>
> <row>
> <cell col="1" rowspan="3">Data</cell>
> <cell col="2">Data</cell>
> <cell col="3">Data</cell>
> <cell col="4">Data</cell>
> <cell col="5">Data</cell>
> </row>
> <row>
> <cell col="2" rowspan="2">Data</cell>
> <cell col="3">Data</cell>
> <cell col="4">Data</cell>
> <cell col="5">Data</cell>
> </row>
> <row>
> <cell col="3">Data</cell>
> <cell col="4">Data</cell>
> <cell col="5">Data</cell>
> </row>
> </table>
>
> I should have a InDesign tagged text like this:
> <tStart:4,12>
> <rStart:>
> <cStart:1,1>Data<cEnd:>
> <cStart:1,3>Data<cEnd:>
> <cStart:1,1><cEnd:>
> <cStart:1,1><cEnd:>
> <cStart:1,1>Data<cEnd:>
> <rEnd:>
> <rStart:>
> <cStart:3,1>Data<cEnd:>
> <cStart:1,1>Data<cEnd:>
> <cStart:1,1>Data<cEnd:>
> <cStart:1,1>Data<cEnd:>
> <cStart:1,1>Data<cEnd:>
> <rEnd:>
> <rStart:>
> <cStart:1,1><cEnd:>
> <cStart:2,1>Data<cEnd:>
> <cStart:1,1>Data<cEnd:>
> <cStart:1,1>Data<cEnd:>
> <cStart:1,1>Data<cEnd:>
> </row>
> <rEnd:>
> <cStart:1,1><cEnd:>
> <cStart:1,1><cEnd:>
> <cStart:1,1>Data<cEnd:>
> <cStart:1,1>Data<cEnd:>
> <cStart:1,1>Data<cEnd:>
> <rEnd:>
> <tEnd:>
>
> I can get my xslt to handle column spanning, but i'm having
> trouble with rowspanning. Here is my template for the cell element:
>
> <xsl:template match="cell">
> <xsl:variable name="col" select="if (exists(@colspan) then
> @colspan else 1)"/> <xsl:variable name="row" select="if
> (exists(@rowspan) then @rowspan else 1)"/> <xsl:value-of
> select="concat('<cStart:',$row,',',$col,'>')"/>
> <xsl:apply-templates/>
> <xsl:value-of select="'<cEnd:'"/>
> <xsl:if test="exists(@colspan)">
> <xsl:value-of select="for $x in (1 to @colspan-1) return
> '<cStart:1,1><cEnd:>'"/> </xsl:if> </xsl:template>
>
> The template above generates empty cell markers based on the
> value of $col along the same row, because it is for the
> colspan. My problem is generating the empty cell markers for
> the rowspan. For example:
>
> <row>
> <cell col="1" rowspan="3">Data</cell>
> <cell col="2">Data</cell>
> <cell col="3">Data</cell>
> <cell col="4">Data</cell>
> <cell col="5">Data</cell>
> </row>
> <row>
> <cell col="2" rowspan="2">Data</cell>
> <cell col="3">Data</cell>
> <cell col="4">Data</cell>
> <cell col="5">Data</cell>
> </row>
> <row>
> <cell col="3">Data</cell>
> <cell col="4">Data</cell>
> <cell col="5">Data</cell>
> </row>
>
> If i'm processing the 1st cell in the 2nd row, i must first
> insert an empty cell marker before it because the cell above
> it spans to 3 rows.
> Same goes for the 1st cell in the 3rd row only i must still
> add another empty marker before it because of the rowspan on
> the 1st cell in row 2.
> I having trouble referencing the preceding cellm element that
> span the particular row so that i can generate the
> corresponding empty cell markers. I tried using
> preceding::cell[1] but with i can't reference the
> other rowspan.
>
> Can someone help me with generating the empty cells for row spanning?
>
> Thanks,
> Jeff
| Current Thread |
|---|
|
| <- Previous | Index | Next -> |
|---|---|---|
| [xsl] Transforming Tables - repost, Jeff Sese | Thread | Re: [xsl] Transforming Tables - rep, David Carlisle |
| Re: [xsl] Collect word count with x, George Cristian Bina | Date | Re: [xsl] Transforming Tables - rep, David Carlisle |
| Month |