xsl-list
[Top] [All Lists]

[xsl] InDesign IDML table conversion

2012-08-17 08:12:06
Hi All,

I am trying to convert to CALS table to IDML (InDesign Markup
Language) table. As a first step I am merging html table model with
cals table attributes so that we can view the correct input.

I am facing difficulty in modifying the cell value when morerows has
been given. Here is my xml
<table>
                                <tbody>
                                        <tr>
                                                <td>Alcohol</td>
                                                <td>82</td>
                                                <td>65</td>
                                                <td>3.6</td>
                                        </tr>
                                        <tr>
                                                <td morerows="1" 
rowspan="2">Cigarettes</td>
                                                <td>NA</td>
                                                <td morerows="1" 
rowspan="2">test</td>
                                                <td>7.6</td>
                                        </tr>
                                        <tr>
                                                <td>47</td>
                                                <td>4.4</td>
                                        </tr>
                                        <tr>
                                                <td morerows="1" 
rowspan="2">Inhalants</td>
                                                <td morerows="1" 
rowspan="2">6</td>
                                                <td morerows="1" 
rowspan="2">0.5</td>
                                                <td>0.0</td>
                                        </tr>
                                        <tr>
                                                <td>0.0</td>
                                        </tr>
</tbody>
</table>

Expected output:

<Table Self="d1e4"
       HeaderRowCount="2"
       FooterRowCount="0"
       BodyRowCount="8"
       ColumnCount="4"
       AppliedTableStyle="TableStyle/$ID/[Basic Table]"
       TableDirection="LeftToRightDirection">
   <Column Self="d36e3" Name="0" SingleColumnWidth="25"/>
   <Column Self="d36e3" Name="1" SingleColumnWidth="25"/>
   <Column Self="d36e3" Name="2" SingleColumnWidth="25"/>
   <Column Self="d36e3" Name="3" SingleColumnWidth="25"/>
   <Cell Self="d1e25" Name="2:0" RowSpan="1" ColumnSpan="1">Alcohol</Cell>
   <Cell Self="d1e27" Name="2:1" RowSpan="1" ColumnSpan="1">82</Cell>
   <Cell Self="d1e29" Name="2:2" RowSpan="1" ColumnSpan="1">65</Cell>
   <Cell Self="d1e31" Name="2:3" RowSpan="1" ColumnSpan="1">3.6</Cell>
   <Cell Self="d1e34" Name="3:0" RowSpan="2" ColumnSpan="1">Cigarettes</Cell>
   <Cell Self="d1e36" Name="3:1" RowSpan="1" ColumnSpan="1">NA</Cell>
   <Cell Self="d1e38" Name="3:2" RowSpan="2" ColumnSpan="1">test</Cell>
   <Cell Self="d1e40" Name="3:3" RowSpan="1" ColumnSpan="1">7.6</Cell>
   <Cell Self="d1e43" Name="4:1" RowSpan="1" ColumnSpan="1">47</Cell>
   <Cell Self="d1e45" Name="4.3" RowSpan="1" ColumnSpan="1">4.4</Cell>
   <Cell Self="d1e48" Name="5:0" RowSpan="2" ColumnSpan="1">Inhalants</Cell>
   <Cell Self="d1e50" Name="5:1" RowSpan="2" ColumnSpan="1">6</Cell>
   <Cell Self="d1e52" Name="5:2" RowSpan="2" ColumnSpan="1">0.5</Cell>
   <Cell Self="d1e54" Name="5:3" RowSpan="1" ColumnSpan="1">0.0</Cell>
   <Cell Self="d1e57" Name="6:3" RowSpan="1" ColumnSpan="1">0.0</Cell>
</Table>

I am trying to find out the number tds before the td[@morerows], so
that i can increase the cell count accordingly. But it is not giving
the exact number of tds. For the first set it should give 0 and 2 and
for the 2nd set it should give 3 . But it is giving 2 everywhere.
Please suggest me where I am going wrong.

Here is my style sheet

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"; version="2.0">
        <xsl:strip-space elements="*"/>
        <xsl:output method="xml" indent="yes"/>
        <xsl:template match="/">
                <xsl:apply-templates/>
        </xsl:template>
        <xsl:template match="tgroup">
                <Table>
                        <xsl:attribute name="Self">
                                <xsl:value-of select="generate-id()"/>
                        </xsl:attribute>
                        <xsl:attribute name="HeaderRowCount">
                                <xsl:value-of select="count(thead/tr)"/>
                        </xsl:attribute>
                        <xsl:attribute name="FooterRowCount">0</xsl:attribute>
                        <xsl:attribute name="BodyRowCount">
                                <xsl:value-of select="count(tbody/tr)"/>
                        </xsl:attribute>
                        <xsl:attribute name="ColumnCount">
                                <xsl:value-of select="@cols"/>
                        </xsl:attribute >
                        <xsl:attribute 
name="AppliedTableStyle">TableStyle/$ID/[Basic
Table]</xsl:attribute>
                        <xsl:attribute 
name="TableDirection">LeftToRightDirection</xsl:attribute>
                        <!-- ForView -->
                        <xsl:apply-templates/>
                </Table>
        </xsl:template>
        <xsl:template match="colspec">
                <Column Self="d36e3" Name="{@colnum - 1}" 
SingleColumnWidth="25"/>
        </xsl:template>
        <xsl:template match="tr">
                <xsl:apply-templates/>
        </xsl:template>
        <xsl:template match="th|td">
                <xsl:variable name="hrow">
                        <xsl:choose>
                                <xsl:when test="name()='th'">0
                                </xsl:when>
                                <xsl:otherwise>
                                        <xsl:value-of 
select="count(ancestor::tgroup/thead/tr)"/>
                                </xsl:otherwise>
                        </xsl:choose>
                </xsl:variable>
                <xsl:variable name="trpos">
                        <xsl:value-of 
select="count(parent::tr/preceding-sibling::tr) + $hrow"/>
                </xsl:variable>
                <xsl:variable name="colspan">
                        <xsl:choose>
                                <xsl:when test="@namest">
                                        <xsl:value-of 
select="number(substring-after(@nameend,'col')) -
number(substring-after(@namest,'col')) + 1"/>
                                </xsl:when>
                                <xsl:otherwise>1</xsl:otherwise>
                        </xsl:choose>
                </xsl:variable>
                <xsl:variable name="rowspan">
                        <xsl:choose>
                                <xsl:when test="@morerows">
                                        <xsl:value-of select="@morerows + 1"/>
                                </xsl:when>
                                <xsl:otherwise>1</xsl:otherwise>
                        </xsl:choose>
                </xsl:variable>
                <Cell>
                        <xsl:attribute name="Self">
                                <xsl:value-of select="generate-id()"/>
                        </xsl:attribute>
                        <xsl:attribute name="Name">
                                <xsl:choose>
                                        <xsl:when 
test="preceding-sibling::td[@namest] or
preceding-sibling::th[@namest]">
                                                <xsl:value-of 
select="concat($trpos,':',position()-1+$colspan)"/>
                                        </xsl:when>
                                        <xsl:when test="(@namest and 
not(following-sibling::td)) and
(not(following-sibling::th) and @namest)">
                                                <xsl:value-of 
select="concat($trpos,':',position() - 1 +
($colspan - 1))"/>
                                        </xsl:when>
                                        <xsl:when 
test="parent::tr/preceding-sibling::tr[1]/td[@morerows]">
                                                <xsl:value-of
select="concat($trpos,':',count(parent::tr/preceding-sibling::tr[1]/td[@morerows]/preceding-sibling::td))"/>
                                        </xsl:when>
                                        <xsl:otherwise>
                                                <xsl:value-of 
select="concat($trpos,':',position()-1)"/>
                                        </xsl:otherwise>
                                </xsl:choose>
                        </xsl:attribute>
                        <xsl:attribute name="RowSpan">
                                <xsl:value-of select="$rowspan"/>
                        </xsl:attribute>
                        <xsl:attribute name="ColumnSpan">
                                <xsl:value-of select="$colspan"/>
                        </xsl:attribute>
                        <xsl:apply-templates/>
                </Cell>
        </xsl:template>
</xsl:stylesheet>

Here is the output of this code.

<Table Self="d1e4"
       HeaderRowCount="2"
       FooterRowCount="0"
       BodyRowCount="8"
       ColumnCount="4"
       AppliedTableStyle="TableStyle/$ID/[Basic Table]"
       TableDirection="LeftToRightDirection">
   <Column Self="d36e3" Name="0" SingleColumnWidth="25"/>
   <Column Self="d36e3" Name="1" SingleColumnWidth="25"/>
   <Column Self="d36e3" Name="2" SingleColumnWidth="25"/>
   <Column Self="d36e3" Name="3" SingleColumnWidth="25"/>
   <Cell Self="d1e25" Name="2:0" RowSpan="1" ColumnSpan="1">Alcohol</Cell>
   <Cell Self="d1e27" Name="2:1" RowSpan="1" ColumnSpan="1">82</Cell>
   <Cell Self="d1e29" Name="2:2" RowSpan="1" ColumnSpan="1">65</Cell>
   <Cell Self="d1e31" Name="2:3" RowSpan="1" ColumnSpan="1">3.6</Cell>
   <Cell Self="d1e34" Name="3:0" RowSpan="2" ColumnSpan="1">Cigarettes</Cell>
   <Cell Self="d1e36" Name="3:1" RowSpan="1" ColumnSpan="1">NA</Cell>
   <Cell Self="d1e38" Name="3:2" RowSpan="2" ColumnSpan="1">test</Cell>
   <Cell Self="d1e40" Name="3:3" RowSpan="1" ColumnSpan="1">7.6</Cell>
   <Cell Self="d1e43" Name="4:2" RowSpan="1" ColumnSpan="1">47</Cell>
   <Cell Self="d1e45" Name="4:2" RowSpan="1" ColumnSpan="1">4.4</Cell>
   <Cell Self="d1e48" Name="5:0" RowSpan="2" ColumnSpan="1">Inhalants</Cell>
   <Cell Self="d1e50" Name="5:1" RowSpan="2" ColumnSpan="1">6</Cell>
   <Cell Self="d1e52" Name="5:2" RowSpan="2" ColumnSpan="1">0.5</Cell>
   <Cell Self="d1e54" Name="5:3" RowSpan="1" ColumnSpan="1">0.0</Cell>
   <Cell Self="d1e57" Name="6:2" RowSpan="1" ColumnSpan="1">0.0</Cell>
</Table>

Regards,
Ganesh

--~------------------------------------------------------------------
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>
--~--

<Prev in Thread] Current Thread [Next in Thread>