[XSL-LIST Mailing List Archive Home]
[By Thread]
[By Date]
Dear Nic,
Please have a look and see if you can use anything of the following. It's based on DocBook XSL roundtrip (wich is XSLT 1.0, therefore there are two named templates instead of functions, for historical reasons), but slightly improved.
<!-- (w:tbl and w:tr translate to tgroup and row straightforwardly; not included here) -->
<!-- w:vMerge without Attribute means: a cell that is occupied by virtue of a row spanning cell in the preceding row, and which should be suppressed in CALS: -->
<xsl:template match="w:tc[not(w:tcPr/w:vMerge[count(@*) = 0])]">
<xsl:element name="entry">
<!-- Process any spans -->
<xsl:call-template name="cell.span"/>
<xsl:call-template name="cell.morerows"/>
<!-- <xsl:call-template name="cell.style"/> --><!-- (you didn't ask for styles) -->
<xsl:apply-templates />
</xsl:element>
</xsl:template>
<!-- recursively count preceding columns, including spans -->
<xsl:function name="letex:colcount" as="xs:double" saxon:memo-function="yes">
<xsl:param name="count" as="xs:double"/>
<xsl:param name="cell" as="node()"/>
<xsl:choose>
<xsl:when test="$cell/preceding-sibling::w:tc">
<xsl:variable name="span" select="if ($cell/preceding-sibling::w:tc[1]/w:tcPr/w:gridSpan/@w:val)
then $cell/preceding-sibling::w:tc[1]/w:tcPr/w:gridSpan/@w:val
else 1"/>
<xsl:sequence select="letex:colcount($count + $span, $cell/preceding-sibling::w:tc[1])" />
</xsl:when>
<xsl:otherwise>
<xsl:sequence select="$count"/>
</xsl:otherwise>
</xsl:choose>
</xsl:function>
<!-- The trickiest part: -->
<xsl:template name="cell.morerows">
<xsl:if test="w:tcPr/w:vMerge/@w:val = 'restart'">
<xsl:variable name="counts" as="xs:integer*">
<xsl:choose>
<xsl:when test="../following-sibling::w:tr[1]/w:tc[letex:colcount(1, .) = letex:colcount(1, current())]/w:tcPr/w:vMerge[count(@*) = 0]">
<xsl:for-each-group select="../following-sibling::w:tr/w:tc[letex:colcount(1, .) = letex:colcount(1, current())]" group-adjacent="if (w:tcPr/w:vMerge[count(@*) = 0]) then true() else false()">
<xsl:sequence select="count(current-group())"/>
</xsl:for-each-group>
</xsl:when>
<xsl:otherwise>
<!-- shouldn't happen, need to fix the code: -->
<xsl:sequence select="24"/>
</xsl:otherwise>
</xsl:choose>
</xsl:variable>
<xsl:attribute name="morerows" select="$counts[1]" />
<xsl:attribute name="style" select="'border-bottom: none;'" />
</xsl:if>
</xsl:template>
I should have taken care of the "otherwise return 24" above. But I'm staying sick at home, and all I could do is copy and paste this code that I once wrote. I'm unable to think about it right now. Hope this helps anyway.
Gerrit
On 23.03.2010 13:07, Nic Gibson wrote:
Re: [xsl] OOXML tables and CALS tables
Subject: Re: [xsl] OOXML tables and CALS tables From: "Imsieke, Gerrit, le-tex" <gerrit.imsieke@xxxxxxxxx> Date: Tue, 23 Mar 2010 16:26:00 +0100 |
Dear Nic,
Please have a look and see if you can use anything of the following. It's based on DocBook XSL roundtrip (wich is XSLT 1.0, therefore there are two named templates instead of functions, for historical reasons), but slightly improved.
<!-- (w:tbl and w:tr translate to tgroup and row straightforwardly; not included here) -->
<!-- w:vMerge without Attribute means: a cell that is occupied by virtue of a row spanning cell in the preceding row, and which should be suppressed in CALS: -->
<xsl:template match="w:tc[not(w:tcPr/w:vMerge[count(@*) = 0])]">
<xsl:element name="entry">
<!-- Process any spans -->
<xsl:call-template name="cell.span"/>
<xsl:call-template name="cell.morerows"/>
<!-- <xsl:call-template name="cell.style"/> --><!-- (you didn't ask for styles) -->
<xsl:apply-templates />
</xsl:element>
</xsl:template>
<!-- recursively count preceding columns, including spans -->
<xsl:function name="letex:colcount" as="xs:double" saxon:memo-function="yes">
<xsl:param name="count" as="xs:double"/>
<xsl:param name="cell" as="node()"/>
<xsl:choose>
<xsl:when test="$cell/preceding-sibling::w:tc">
<xsl:variable name="span" select="if ($cell/preceding-sibling::w:tc[1]/w:tcPr/w:gridSpan/@w:val)
then $cell/preceding-sibling::w:tc[1]/w:tcPr/w:gridSpan/@w:val
else 1"/>
<xsl:sequence select="letex:colcount($count + $span, $cell/preceding-sibling::w:tc[1])" />
</xsl:when>
<xsl:otherwise>
<xsl:sequence select="$count"/>
</xsl:otherwise>
</xsl:choose>
</xsl:function>
<xsl:template name="cell.span"> <xsl:variable name="span" select="0 + w:tcPr/w:gridSpan/@w:val"/> <xsl:if test="$span > 0"> <!-- Get the current cell number --> <xsl:variable name="colstart" select="letex:colcount(1, .)" /> <xsl:attribute name="namest"> <xsl:value-of select="concat('col', $colstart)"/> </xsl:attribute> <xsl:attribute name="nameend"> <xsl:value-of select="concat('col', $colstart + $span - 1)"/> </xsl:attribute> </xsl:if> </xsl:template>
<!-- The trickiest part: -->
<xsl:template name="cell.morerows">
<xsl:if test="w:tcPr/w:vMerge/@w:val = 'restart'">
<xsl:variable name="counts" as="xs:integer*">
<xsl:choose>
<xsl:when test="../following-sibling::w:tr[1]/w:tc[letex:colcount(1, .) = letex:colcount(1, current())]/w:tcPr/w:vMerge[count(@*) = 0]">
<xsl:for-each-group select="../following-sibling::w:tr/w:tc[letex:colcount(1, .) = letex:colcount(1, current())]" group-adjacent="if (w:tcPr/w:vMerge[count(@*) = 0]) then true() else false()">
<xsl:sequence select="count(current-group())"/>
</xsl:for-each-group>
</xsl:when>
<xsl:otherwise>
<!-- shouldn't happen, need to fix the code: -->
<xsl:sequence select="24"/>
</xsl:otherwise>
</xsl:choose>
</xsl:variable>
<xsl:attribute name="morerows" select="$counts[1]" />
<xsl:attribute name="style" select="'border-bottom: none;'" />
</xsl:if>
</xsl:template>
I should have taken care of the "otherwise return 24" above. But I'm staying sick at home, and all I could do is copy and paste this code that I once wrote. I'm unable to think about it right now. Hope this helps anyway.
Gerrit
On 23.03.2010 13:07, Nic Gibson wrote:
Morning
This is a sort "on the off chance" query. I'm just about to sit down and write XSLT to convert some tables created in Word and saved to docx files to CALS tables (in DocBook). I don't actually need to replicate anything much on the formatting side except the row and column spanning cells (merged in Word terminology). I was wondering if anyone has actually done this already and would be willing to share the XSLT they used.
cheers
nic -- Nic Gibson Director, Corbas Consulting Ltd Editorial and Technical Consultancy and Training http://www.corbas.co.uk, +44 (0)7718 906817
-- Gerrit Imsieke Geschdftsf|hrer / Managing Director le-tex publishing services GmbH Weissenfelser Str. 84, 04229 Leipzig, Germany Phone +49 341 355356 110, Fax +49 341 355356 510 gerrit.imsieke@xxxxxxxxx, http://www.le-tex.de
Registergericht / Commercial Register: Amtsgericht Leipzig Registernummer / Registration Number: HRB 24930
Geschdftsf|hrer: Gerrit Imsieke, Svea Jelonek, Thomas Schmidt, Dr. Reinhard Vvckler
Current Thread |
---|
|
<- Previous | Index | Next -> |
---|---|---|
[xsl] OOXML tables and CALS tables, Nic Gibson | Thread | Re: [xsl] OOXML tables and CALS tab, Nic Gibson |
Re: [xsl] Comparing possibly empty , Martynas Jusevicius | Date | Re: [xsl] Create Table, bernie bonn |
Month |