File: //usr/share/yelp-xsl/xslt/docbook/html/db2html-table.xsl
<?xml version='1.0' encoding='UTF-8'?><!-- -*- indent-tabs-mode: nil -*- -->
<!--
This program is free software; you can redistribute it and/or modify it under
the terms of the GNU Lesser General Public License as published by the Free
Software Foundation; either version 2 of the License, or (at your option) any
later version.
This program is distributed in the hope that it will be useful, but WITHOUT
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
details.
You should have received a copy of the GNU Lesser General Public License
along with this program; see the file COPYING.LGPL. If not, see <http://www.gnu.org/licenses/>.
-->
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:db="http://docbook.org/ns/docbook"
xmlns="http://www.w3.org/1999/xhtml"
exclude-result-prefixes="db"
version="1.0">
<!--!!==========================================================================
DocBook to HTML - Tables
REMARK: This needs lots of talk about CALS
-->
<!--**==========================================================================
db2html.row
Creates a `tr` element for a `row` element
[xsl:params]
$row: The `row` element to process
$colspecs: The `colspec` elements currently in scope
$spanspecs: The `spanspec` elements currently in scope
$colsep: Whether column separators are currently enabled
$rowsep: Whether column separators are currently enabled
$spanstr: The string representation of the row spans
FIXME
-->
<xsl:template name="db2html.row">
<xsl:param name="row" select="."/>
<xsl:param name="colspecs"/>
<xsl:param name="spanspecs"/>
<xsl:param name="colsep" select="''"/>
<xsl:param name="rowsep" select="''"/>
<xsl:param name="spanstr"/>
<tr>
<xsl:call-template name="html.class.attr">
<xsl:with-param name="node" select="$row"/>
<xsl:with-param name="class">
<xsl:if test="($row/../self::tbody and (count($row/preceding-sibling::row) mod 2 = 1)) or
($row/../self::db:tbody and (count($row/preceding-sibling::db:row) mod 2 = 1))">
<xsl:text>shade</xsl:text>
</xsl:if>
</xsl:with-param>
</xsl:call-template>
<xsl:if test="$row/*[1]">
<xsl:call-template name="db2html.entry">
<xsl:with-param name="entry" select="$row/*[1]"/>
<xsl:with-param name="colspecs" select="$colspecs"/>
<xsl:with-param name="spanspecs" select="$spanspecs"/>
<xsl:with-param name="colsep" select="$colsep"/>
<xsl:with-param name="rowsep">
<xsl:choose>
<xsl:when test="$row/@rowsep">
<xsl:value-of select="$row/@rowsep"/>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="$rowsep"/>
</xsl:otherwise>
</xsl:choose>
</xsl:with-param>
<xsl:with-param name="spanstr" select="$spanstr"/>
</xsl:call-template>
</xsl:if>
</tr>
<xsl:variable name="following" select="$row/following-sibling::row[1] |
$row/following-sibling::db:row[1]"/>
<xsl:if test="$following">
<xsl:call-template name="db2html.row">
<xsl:with-param name="row" select="$following"/>
<xsl:with-param name="colspecs" select="$colspecs"/>
<xsl:with-param name="spanspecs" select="$spanspecs"/>
<xsl:with-param name="colsep" select="$colsep"/>
<xsl:with-param name="rowsep" select="$rowsep"/>
<xsl:with-param name="spanstr">
<xsl:call-template name="db2html.spanstr">
<xsl:with-param name="row" select="$row"/>
<xsl:with-param name="colspecs" select="$colspecs"/>
<xsl:with-param name="spanspecs" select="$spanspecs"/>
<xsl:with-param name="spanstr" select="$spanstr"/>
</xsl:call-template>
</xsl:with-param>
</xsl:call-template>
</xsl:if>
</xsl:template>
<!--**==========================================================================
db2html.entry
Creates a `td` element for an `entry` element
[xsl:params]
$entry: The `entry` element to process
$colspecs: The `colspec` elements currently in scope
$spanspecs: The `spanspec` elements currently in scope
$colsep: Whether column separators are currently enabled
$rowsep: Whether column separators are currently enabled
$colpos: The output column position currently being considered
$colnum: The actual column number of $entry
$spanstr: The string representation of the row spans
This template processes a single `entry` element and generates `td` elements
as needed. It then calls itself on the following `entry` element, adjusting
parameters as necessary. Under certain conditions, this template may not be
able to output a `td` element immediately. In these cases, it makes whatever
adjustments are needed and calls itself or {db2html.entry.implicit} (which,
in turn, calls this template again when it's finished).
Three parameters are used to determine whether a `td` element can be output.
The $spanstr parameter provides infomation about row spans in effect from
entries in previous rows; the $colpos parameter specifies which column we
would output to if we created a `td`; and the $colnum parameter specifies
which column this `entry` should be in, according to any relevant `colspec`
or `spanspec` elemets.
There are two conditions that cause this template not to output a `td` element
immediately: if the $spanstr parameter does not start with `0:`, and if the
$colpos parameter is less than the $colnum parameter.
The $spanstr parameter specifies the row spans in effect from entries in
previous rows. As this template iterates over the `entry` elements, it strips
off parts of $spanstr so that only the parts relevant to the `entry` are
present. If $spanstr does not start with `0:`, then an entry in a previous
row occupies this column position. In this case, that value is removed from
$spanstr, the $colpos parameter is incremented, and {db2html.entry} is
called again. Additionally, since {db2html.entry.colnum} doesn't consider
row spans, the $colnum parameter may be incremented as well.
If the $colpos parameter is less than the $colnum parameter, then the
document has skipped entries by explicitly referencing a column. This is
allowed in CALS tables, but not in HTML. To fill the blank spaces, we call
{db2html.entry.implicit}, which outputs an empty `td` element spanning as
many columns as necessary to fill in the blanks. The {db2html.entry.implicit}
template then calls this template again with appropriate parameter values.
When this template is finally able to output a `td` element, it calculates
appropriate values for the `style` and `class` attribute based on DocBook
attributes on the `entry`, the relevant `colspec` or `spanspec`, and any
relevant ancestor elements. It then calls itself on the following `entry`
element to output the next `td`.
-->
<xsl:template name="db2html.entry">
<xsl:param name="entry" select="."/>
<xsl:param name="colspecs"/>
<xsl:param name="spanspecs"/>
<xsl:param name="colsep" select="''"/>
<xsl:param name="rowsep" select="''"/>
<xsl:param name="colpos" select="1"/>
<xsl:param name="colnum">
<xsl:call-template name="db2html.entry.colnum">
<xsl:with-param name="entry" select="$entry"/>
<xsl:with-param name="colspecs" select="$colspecs"/>
<xsl:with-param name="spanspecs" select="$spanspecs"/>
<xsl:with-param name="colpos" select="$colpos"/>
</xsl:call-template>
</xsl:param>
<xsl:param name="spanstr"/>
<xsl:variable name="colspan">
<xsl:choose>
<xsl:when test="$entry/@spanname or $entry/@namest">
<xsl:call-template name="db2html.entry.colspan">
<xsl:with-param name="entry" select="$entry"/>
<xsl:with-param name="colspecs" select="$colspecs"/>
<xsl:with-param name="spanspecs" select="$spanspecs"/>
</xsl:call-template>
</xsl:when>
<xsl:otherwise>1</xsl:otherwise>
</xsl:choose>
</xsl:variable>
<xsl:choose>
<!-- Another entry has a rowspan that covers this column position -->
<xsl:when test="$spanstr != '' and not(starts-with($spanstr, '0:'))">
<xsl:choose>
<xsl:when test="$colnum = $colpos">
<xsl:call-template name="db2html.entry">
<xsl:with-param name="entry" select="$entry"/>
<xsl:with-param name="colspecs" select="$colspecs"/>
<xsl:with-param name="spanspecs" select="$spanspecs"/>
<xsl:with-param name="colsep" select="$colsep"/>
<xsl:with-param name="rowsep" select="$rowsep"/>
<xsl:with-param name="colpos" select="$colpos + 1"/>
<xsl:with-param name="colnum" select="$colnum + 1"/>
<xsl:with-param name="colspan" select="$colspan"/>
<xsl:with-param name="spanstr" select="substring-after($spanstr, ':')"/>
</xsl:call-template>
</xsl:when>
<xsl:otherwise>
<xsl:call-template name="db2html.entry">
<xsl:with-param name="entry" select="$entry"/>
<xsl:with-param name="colspecs" select="$colspecs"/>
<xsl:with-param name="spanspecs" select="$spanspecs"/>
<xsl:with-param name="colsep" select="$colsep"/>
<xsl:with-param name="rowsep" select="$rowsep"/>
<xsl:with-param name="colpos" select="$colpos + 1"/>
<xsl:with-param name="colnum" select="$colnum"/>
<xsl:with-param name="colspan" select="$colspan"/>
<xsl:with-param name="spanstr" select="substring-after($spanstr, ':')"/>
</xsl:call-template>
</xsl:otherwise>
</xsl:choose>
</xsl:when>
<!-- We need to insert implicit td elements to cover blank space -->
<xsl:when test="$colnum > $colpos">
<xsl:call-template name="db2html.entry.implicit">
<xsl:with-param name="entry" select="$entry"/>
<xsl:with-param name="colspecs" select="$colspecs"/>
<xsl:with-param name="spanspecs" select="$spanspecs"/>
<xsl:with-param name="colsep" select="$colsep"/>
<xsl:with-param name="rowsep" select="$rowsep"/>
<xsl:with-param name="colpos" select="$colpos"/>
<xsl:with-param name="colnum" select="$colnum"/>
<xsl:with-param name="colspan" select="1"/>
<xsl:with-param name="spanstr" select="$spanstr"/>
</xsl:call-template>
</xsl:when>
<!-- We can output the td for this entry -->
<xsl:otherwise>
<xsl:if test="$colnum < $colpos">
<xsl:message>Column positions are not aligned.</xsl:message>
</xsl:if>
<xsl:variable name="element">
<xsl:choose>
<xsl:when test="$entry/../../self::thead or $entry/../../self::tfoot">th</xsl:when>
<xsl:when test="$entry/../../self::db:thead or $entry/../../self::db:tfoot">th</xsl:when>
<xsl:otherwise>td</xsl:otherwise>
</xsl:choose>
</xsl:variable>
<xsl:variable name="rowspan">
<xsl:choose>
<xsl:when test="$entry/@morerows">
<xsl:value-of select="$entry/@morerows + 1"/>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="1"/>
</xsl:otherwise>
</xsl:choose>
</xsl:variable>
<xsl:variable name="align">
<xsl:choose>
<xsl:when test="$entry/@align">
<xsl:value-of select="$entry/@align"/>
</xsl:when>
<xsl:when test="$colspecs[@colname = $entry/@colname]/@align">
<xsl:value-of select="$colspecs[@colname = $entry/@colname]/@align"/>
</xsl:when>
<xsl:when test="$colspecs[@colname = $entry/@namest]/@align">
<xsl:value-of select="$colspecs[@colname = $entry/@namest]/@align"/>
</xsl:when>
<xsl:when test="$spanspecs[@spanname = $entry/@spanname]/@align">
<xsl:value-of select="$spanspecs[@spanname = $entry/@spanname]/@align"/>
</xsl:when>
<xsl:when test="$colspecs[position() = $colnum]/@align">
<xsl:value-of select="$colspecs[position() = $colnum]/@align"/>
</xsl:when>
<xsl:when test="$entry/../../../@align">
<xsl:value-of select="$entry/../../../@align"/>
</xsl:when>
</xsl:choose>
</xsl:variable>
<xsl:variable name="valign">
<xsl:choose>
<xsl:when test="$entry/@valign">
<xsl:value-of select="$entry/@valign"/>
</xsl:when>
<xsl:when test="$colspecs[@colname = $entry/@colname]/@valign">
<xsl:value-of
select="$colspecs[@colname = $entry/@colname]/@valign"/>
</xsl:when>
<xsl:when test="$colspecs[@colname = $entry/@namest]/@valign">
<xsl:value-of select="$colspecs[@colname = $entry/@namest]/@valign"/>
</xsl:when>
<xsl:when test="$spanspecs[@spanname = $entry/@spanname]/@valign">
<xsl:value-of select="$spanspecs[@spanname = $entry/@spanname]/@valign"/>
</xsl:when>
<xsl:when test="$colspecs[position() = $colnum]/@valign">
<xsl:value-of select="$colspecs[position() = $colnum]/@valign"/>
</xsl:when>
<xsl:when test="$entry/../@valign">
<xsl:value-of select="$entry/../@valign"/>
</xsl:when>
<xsl:when test="$entry/../../@valign">
<xsl:value-of select="$entry/../../@valign"/>
</xsl:when>
</xsl:choose>
</xsl:variable>
<xsl:variable name="char">
<xsl:choose>
<xsl:when test="$align != 'char'"/>
<xsl:when test="$entry/@char">
<xsl:value-of select="$entry/@char"/>
</xsl:when>
<xsl:when test="$colspecs[@colname = $entry/@colname]/@char">
<xsl:value-of select="$colspecs[@colname = $entry/@colname]/@char"/>
</xsl:when>
<xsl:when test="$colspecs[@colname = $entry/@namest]/@char">
<xsl:value-of select="$colspecs[@colname = $entry/@namest]/@char"/>
</xsl:when>
<xsl:when test="$spanspecs[@spanname = $entry/@spanname]/@char">
<xsl:value-of select="$spanspecs[@spanname = $entry/@spanname]/@char"/>
</xsl:when>
<xsl:when test="$colspecs[position() = $colnum]/@char">
<xsl:value-of select="$colspecs[position() = $colnum]/@char"/>
</xsl:when>
<xsl:when test="$entry/../../../@char">
<xsl:value-of select="$entry/../../@char"/>
</xsl:when>
</xsl:choose>
</xsl:variable>
<xsl:variable name="charoff">
<xsl:choose>
<xsl:when test="$align != 'char'"/>
<xsl:when test="$entry/@charoff">
<xsl:value-of select="$entry/@charoff"/>
</xsl:when>
<xsl:when test="$colspecs[@colname = $entry/@colname]/@charoff">
<xsl:value-of select="$colspecs[@colname = $entry/@colname]/@charoff"/>
</xsl:when>
<xsl:when test="$colspecs[@colname = $entry/@namest]/@charoff">
<xsl:value-of select="$colspecs[@colname = $entry/@namest]/@charoff"/>
</xsl:when>
<xsl:when test="$spanspecs[@spanname = $entry/@spanname]/@charoff">
<xsl:value-of select="$spanspecs[@spanname = $entry/@spanname]/@charoff"/>
</xsl:when>
<xsl:when test="$colspecs[position() = $colnum]/@charoff">
<xsl:value-of select="$colspecs[position() = $colnum]/@charoff"/>
</xsl:when>
<xsl:when test="$entry/../../../@charoff">
<xsl:value-of select="$entry/../../@charoff"/>
</xsl:when>
</xsl:choose>
</xsl:variable>
<xsl:variable name="style">
<xsl:if test="$align != ''">
<xsl:value-of select="concat('text-align: ', $align, ';')"/>
</xsl:if>
<xsl:if test="$valign != ''">
<xsl:value-of select="concat('vertical-align: ', $valign, ';')"/>
</xsl:if>
</xsl:variable>
<xsl:variable name="class">
<!-- td-colsep: whether to show a column separator -->
<xsl:choose>
<!-- FIXME: we need to handle @cols better -->
<xsl:when test="number($colpos) + number($colspan) > number($entry/ancestor::tgroup[1]/@cols)"/>
<xsl:when test="number($colpos) + number($colspan) > number($entry/ancestor::db:tgroup[1]/@cols)"/>
<xsl:when test="$entry/@colsep">
<xsl:if test="$entry/@colsep = '1'">
<xsl:text> td-colsep</xsl:text>
</xsl:if>
</xsl:when>
<xsl:when test="$entry/@spanname and $spanspecs[@spanname = $entry/@spanname]/@colsep">
<xsl:if test="$spanspecs[@spanname = $entry/@spanname]/@colsep = '1'">
<xsl:text> td-colsep</xsl:text>
</xsl:if>
</xsl:when>
<xsl:when test="$entry/@colname and $colspecs[@colname = $entry/@colname]/@colsep">
<xsl:if test="$colspecs[@colname = $entry/@colname]/@colsep = '1'">
<xsl:text> td-colsep</xsl:text>
</xsl:if>
</xsl:when>
<xsl:when test="$entry/@nameend and $colspecs[@colname = $entry/@nameend]/@colsep">
<xsl:if test="$colspecs[@colname = $entry/@nameend]/@colsep = '1'">
<xsl:text> td-colsep</xsl:text>
</xsl:if>
</xsl:when>
<xsl:when test="$colspecs[position() = $colnum]/@colsep">
<xsl:if test="$colspecs[position() = $colnum]/@colsep = '1'">
<xsl:text> td-colsep</xsl:text>
</xsl:if>
</xsl:when>
<xsl:when test="$colsep = '0'"/>
<xsl:otherwise>
<xsl:text> td-colsep</xsl:text>
</xsl:otherwise>
</xsl:choose>
<!-- td-rowsep: whether to show a row separator -->
<xsl:choose>
<xsl:when test="(count($entry/../following-sibling::row) +
count($entry/../following-sibling::db:row)) <
number($rowspan)"/>
<xsl:when test="$entry/@rowsep">
<xsl:if test="$entry/@rowsep = '1'">
<xsl:text> td-rowsep</xsl:text>
</xsl:if>
</xsl:when>
<xsl:when test="$entry/@spanname and $spanspecs[@spanname = $entry/@spanname]/@rowsep">
<xsl:if test="$spanspecs[@spanname = $entry/@spanname]/@rowsep = '1'">
<xsl:text> td-rowsep</xsl:text>
</xsl:if>
</xsl:when>
<xsl:when test="$entry/@colname and $colspecs[@colname = $entry/@colname]/@rowsep">
<xsl:if test="$colspecs[@colname = $entry/@colname]/@rowsep = '1'">
<xsl:text> td-rowsep</xsl:text>
</xsl:if>
</xsl:when>
<xsl:when test="$entry/@nameend and $colspecs[@colname = $entry/@nameend]/@rowsep">
<xsl:if test="$colspecs[@colname = $entry/@nameend]/@rowsep = '1'">
<xsl:text> td-rowsep</xsl:text>
</xsl:if>
</xsl:when>
<xsl:when test="$colspecs[position() = $colnum]/@rowsep">
<xsl:if test="$colspecs[position() = $colnum]/@rowsep = '1'">
<xsl:text> td-rowsep</xsl:text>
</xsl:if>
</xsl:when>
<xsl:when test="$rowsep = '1'">
<xsl:text> td-rowsep</xsl:text>
</xsl:when>
</xsl:choose>
</xsl:variable>
<!-- Finally, output the td or th element -->
<xsl:element name="{$element}" namespace="{$html.namespace}">
<xsl:call-template name="html.lang.attrs">
<xsl:with-param name="parent" select=".."/>
</xsl:call-template>
<xsl:call-template name="html.class.attr">
<xsl:with-param name="node" select="$entry"/>
<xsl:with-param name="class" select="$class"/>
</xsl:call-template>
<xsl:if test="$style != ''">
<xsl:attribute name="style">
<xsl:value-of select="normalize-space($style)"/>
</xsl:attribute>
</xsl:if>
<xsl:if test="number($rowspan) > 1">
<xsl:attribute name="rowspan">
<xsl:value-of select="$rowspan"/>
</xsl:attribute>
</xsl:if>
<xsl:if test="$colspan > 1">
<xsl:attribute name="colspan">
<xsl:value-of select="$colspan"/>
</xsl:attribute>
</xsl:if>
<xsl:if test="$char != ''">
<xsl:attribute name="char">
<xsl:value-of select="$char"/>
</xsl:attribute>
</xsl:if>
<xsl:if test="$charoff != ''">
<xsl:attribute name="charoff">
<xsl:value-of select="$charoff"/>
</xsl:attribute>
</xsl:if>
<xsl:choose>
<xsl:when test="$entry/self::entrytbl">
<xsl:apply-templates select="$entry"/>
</xsl:when>
<xsl:when test="$entry/self::db:entrytbl">
<xsl:apply-templates select="$entry"/>
</xsl:when>
<xsl:otherwise>
<xsl:apply-templates select="$entry/node()"/>
</xsl:otherwise>
</xsl:choose>
</xsl:element>
<!-- And process the next entry -->
<xsl:variable name="following" select="$entry/following-sibling::*[1]"/>
<xsl:if test="$following">
<xsl:call-template name="db2html.entry">
<xsl:with-param name="entry" select="$following"/>
<xsl:with-param name="colspecs" select="$colspecs"/>
<xsl:with-param name="spanspecs" select="$spanspecs"/>
<xsl:with-param name="colsep" select="$colsep"/>
<xsl:with-param name="rowsep" select="$rowsep"/>
<xsl:with-param name="colpos" select="$colpos + $colspan"/>
<xsl:with-param name="spanstr">
<xsl:call-template name="db2html.spanstr.pop">
<xsl:with-param name="colspecs" select="$colspecs"/>
<xsl:with-param name="spanspecs" select="$spanspecs"/>
<xsl:with-param name="colspan" select="$colspan"/>
<xsl:with-param name="spanstr" select="$spanstr"/>
</xsl:call-template>
</xsl:with-param>
</xsl:call-template>
</xsl:if>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
<!--**==========================================================================
db2html.entry.implicit
Creates an implicit `td` element to fill up unoccupied columns
[xsl:params]
$entry: The `entry` element currently being processed
$colspecs: The `colspec` elements currently in scope
$spanspecs: The `spanspec` elements currently in scope
$colsep: Whether column separators are currently enabled
$rowsep: Whether column separators are currently enabled
$colpos: The output column position currently being considered
$colnum: The actual column number of $entry
$colspan: How many columns the implicit `td` currently spans
$spanstr: The string representation of the row spans
CALS tables in DocBook don't need to have `entry` elements for each column
in each row, even when the column is not covered by a row-spanning entry from
a previous row. An `entry` can explicitly specify which column it's in, and
any previous unfilled columns are considered blank. Since HTML tables don't
have this mechanism, we have to insert blank `td` elements to fill the gaps.
When {db2html.entry} detects a blank entry, it will call this template with
the approprite parameters. This template then calls itself recursively, each
time adjusting the $colpos, $colspan, and $spanstr parameters, until it
comes across the last column that needs to be filled. It then outputs a `td`
element with an appropriate `colspan` attribute.
Finally, this template calls {db2html.entry} again on $entry. With the
values of $colpos and $spanstr suitably adjusted, that template is then
able to output the `td` for the `entry` element.
-->
<xsl:template name="db2html.entry.implicit">
<xsl:param name="entry"/>
<xsl:param name="colspecs"/>
<xsl:param name="spanspecs"/>
<xsl:param name="colsep" select="''"/>
<xsl:param name="rowsep" select="''"/>
<xsl:param name="colpos" select="1"/>
<xsl:param name="colnum">
<xsl:call-template name="db2html.entry.colnum">
<xsl:with-param name="entry" select="$entry"/>
<xsl:with-param name="colspecs" select="$colspecs"/>
<xsl:with-param name="spanspecs" select="$spanspecs"/>
<xsl:with-param name="colpos" select="$colpos"/>
</xsl:call-template>
</xsl:param>
<xsl:param name="colspan"/>
<xsl:param name="spanstr"/>
<xsl:variable name="element">
<xsl:choose>
<xsl:when test="$entry/../../self::thead or $entry/../../self::tfoot">th</xsl:when>
<xsl:when test="$entry/../../self::db:thead or $entry/../../self::db:tfoot">th</xsl:when>
<xsl:otherwise>td</xsl:otherwise>
</xsl:choose>
</xsl:variable>
<xsl:variable name="class">
<xsl:if test="$colsep != '0'">
<xsl:text> td-colsep</xsl:text>
</xsl:if>
<xsl:if test="($rowsep = '1' and $entry/../following-sibling::row) or
($rowsep = '1' and $entry/../following-sibling::db:row)">
<xsl:text> td-rowsep</xsl:text>
</xsl:if>
</xsl:variable>
<xsl:choose>
<xsl:when test="$spanstr != '' and not(starts-with($spanstr, '0:'))">
<xsl:element name="{$element}" namespace="{$html.namespace}">
<xsl:if test="$class != ''">
<xsl:attribute name="class">
<xsl:value-of select="normalize-space($class)"/>
</xsl:attribute>
</xsl:if>
<xsl:attribute name="colspan">
<xsl:value-of select="$colspan - 1"/>
</xsl:attribute>
<xsl:text> </xsl:text>
</xsl:element>
<xsl:call-template name="db2html.entry">
<xsl:with-param name="entry" select="$entry"/>
<xsl:with-param name="colspecs" select="$colspecs"/>
<xsl:with-param name="spanspecs" select="$spanspecs"/>
<xsl:with-param name="colsep" select="$colsep"/>
<xsl:with-param name="rowsep" select="$rowsep"/>
<xsl:with-param name="colpos" select="$colpos"/>
<xsl:with-param name="colnum" select="$colnum"/>
<xsl:with-param name="spanstr" select="$spanstr"/>
</xsl:call-template>
</xsl:when>
<xsl:when test="$colnum - $colpos = 1">
<xsl:element name="{$element}" namespace="{$html.namespace}">
<xsl:if test="$class != ''">
<xsl:attribute name="class">
<xsl:value-of select="normalize-space($class)"/>
</xsl:attribute>
</xsl:if>
<xsl:attribute name="colspan">
<xsl:value-of select="$colspan"/>
</xsl:attribute>
<xsl:text> </xsl:text>
</xsl:element>
<xsl:call-template name="db2html.entry">
<xsl:with-param name="entry" select="$entry"/>
<xsl:with-param name="colspecs" select="$colspecs"/>
<xsl:with-param name="spanspecs" select="$spanspecs"/>
<xsl:with-param name="colsep" select="$colsep"/>
<xsl:with-param name="rowsep" select="$rowsep"/>
<xsl:with-param name="colpos" select="$colpos + 1"/>
<xsl:with-param name="colnum" select="$colnum"/>
<xsl:with-param name="spanstr" select="substring-after($spanstr, ':')"/>
</xsl:call-template>
</xsl:when>
<xsl:otherwise>
<xsl:call-template name="db2html.entry.implicit">
<xsl:with-param name="entry" select="$entry"/>
<xsl:with-param name="colspecs" select="$colspecs"/>
<xsl:with-param name="spanspecs" select="$spanspecs"/>
<xsl:with-param name="colsep" select="$colsep"/>
<xsl:with-param name="rowsep" select="$rowsep"/>
<xsl:with-param name="colpos" select="$colpos + 1"/>
<xsl:with-param name="colnum" select="$colnum"/>
<xsl:with-param name="colspan" select="$colspan + 1"/>
<xsl:with-param name="spanstr" select="substring-after($spanstr, ':')"/>
</xsl:call-template>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
<!--**==========================================================================
db2html.entry.colnum
Calculates the actual column number for an `entry` element
[xsl:params]
$entry: The `entry` element to process
$colspecs: The `colspec` elements currently in scope
$spanspecs: The `spanspec` elements currently in scope
$colpos: The column position, as passed by the preceding `entry`
FIXME
-->
<xsl:template name="db2html.entry.colnum">
<xsl:param name="entry" select="."/>
<xsl:param name="colspecs"/>
<xsl:param name="spanspecs"/>
<xsl:param name="colpos" select="0"/>
<xsl:choose>
<xsl:when test="$entry/@spanname">
<xsl:variable name="spanspec"
select="$spanspecs[@spanname = $entry/@spanname]"/>
<xsl:variable name="colspec"
select="$colspecs[@colname = $spanspec/@namest]"/>
<xsl:call-template name="db2html.colspec.colnum">
<xsl:with-param name="colspec" select="$colspec"/>
<xsl:with-param name="colspecs" select="$colspecs"/>
<xsl:with-param name="spanspecs" select="$spanspecs"/>
</xsl:call-template>
</xsl:when>
<xsl:when test="$entry/@colname">
<xsl:variable name="colspec"
select="$colspecs[@colname = $entry/@colname]"/>
<xsl:call-template name="db2html.colspec.colnum">
<xsl:with-param name="colspec" select="$colspec"/>
<xsl:with-param name="colspecs" select="$colspecs"/>
<xsl:with-param name="spanspecs" select="$spanspecs"/>
</xsl:call-template>
</xsl:when>
<xsl:when test="$entry/@namest">
<xsl:variable name="colspec"
select="$colspecs[@colname = $entry/@namest]"/>
<xsl:call-template name="db2html.colspec.colnum">
<xsl:with-param name="colspec" select="$colspec"/>
<xsl:with-param name="colspecs" select="$colspecs"/>
<xsl:with-param name="spanspecs" select="$spanspecs"/>
</xsl:call-template>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="$colpos"/>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
<!--**==========================================================================
db2html.colspec.colnum
Calculates the column number for a `colspec` element
[xsl:params]
$colspec: The `colspec` element to process
$colspecs: The `colspec` elements currently in scope
$spanspecs: The `spanspec` elements currently in scope
FIXME
-->
<xsl:template name="db2html.colspec.colnum">
<xsl:param name="colspec" select="."/>
<xsl:param name="colspecs"/>
<xsl:param name="spanspecs"/>
<xsl:choose>
<xsl:when test="$colspec/@colnum">
<xsl:value-of select="$colspec/@colnum"/>
</xsl:when>
<xsl:when test="$colspec/preceding-sibling::colspec or
$colspec/preceding-sibling::db:colspec">
<xsl:variable name="prec.colspec.colnum">
<xsl:call-template name="db2html.colspec.colnum">
<xsl:with-param name="colspec"
select="$colspec/preceding-sibling::colspec[1] |
$colspec/preceding-sibling::db:colspec[1]"/>
<xsl:with-param name="colspecs" select="$colspecs"/>
<xsl:with-param name="spanspecs" select="$spanspecs"/>
</xsl:call-template>
</xsl:variable>
<xsl:value-of select="$prec.colspec.colnum + 1"/>
</xsl:when>
<xsl:otherwise>1</xsl:otherwise>
</xsl:choose>
</xsl:template>
<!--**==========================================================================
db2html.entry.colspan
Calculates the `colspan` for an `entry` element
[xsl:params]
$entry: The `entry` element to process
$colspecs: The `colspec` elements currently in scope
$spanspecs: The `spanspec` elements currently in scope
This template calculates how many columns an `entry` element should span.
In CALS tables, column spanning is done by specifying starting and ending
`colspec` elements, or by specifying a `spanspec` element which specifies
starting and ending `colspec` elements.
-->
<xsl:template name="db2html.entry.colspan">
<xsl:param name="entry" select="."/>
<xsl:param name="colspecs"/>
<xsl:param name="spanspecs"/>
<xsl:variable name="namest">
<xsl:choose>
<xsl:when test="$entry/@spanname">
<xsl:value-of
select="$spanspecs[@spanname = $entry/@spanname]/@namest"/>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="$entry/@namest"/>
</xsl:otherwise>
</xsl:choose>
</xsl:variable>
<xsl:variable name="nameend">
<xsl:choose>
<xsl:when test="$entry/@spanname">
<xsl:value-of
select="$spanspecs[@spanname = $entry/@spanname]/@nameend"/>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="$entry/@nameend"/>
</xsl:otherwise>
</xsl:choose>
</xsl:variable>
<xsl:variable name="colnumst">
<xsl:call-template name="db2html.colspec.colnum">
<xsl:with-param name="colspec" select="$colspecs[@colname = $namest]"/>
<xsl:with-param name="colspecs" select="$colspecs"/>
<xsl:with-param name="spanspecs" select="$spanspecs"/>
</xsl:call-template>
</xsl:variable>
<xsl:variable name="colnumend">
<xsl:call-template name="db2html.colspec.colnum">
<xsl:with-param name="colspec" select="$colspecs[@colname = $nameend]"/>
<xsl:with-param name="colspecs" select="$colspecs"/>
<xsl:with-param name="spanspecs" select="$spanspecs"/>
</xsl:call-template>
</xsl:variable>
<xsl:choose>
<xsl:when test="$namest = '' or $nameend = ''">1</xsl:when>
<xsl:when test="$colnumend > $colnumst">
<xsl:value-of select="$colnumend - $colnumst + 1"/>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="$colnumst - $colnumend + 1"/>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
<!-- FIXME below -->
<!--**==========================================================================
db2html.spanstr
Generates a string specifying the row spans in effect
[xsl:params]
$colspecs: The `colspec` elements currently in scope
$spanspecs: The `spanspec` elements currently in scope
$spanstr: The $spanstr parameter used by the previous row
REMARK: This template needs to be explained in detail, but I forgot how it works.
-->
<xsl:template name="db2html.spanstr">
<xsl:param name="row" select="."/>
<xsl:param name="entry" select="$row/*[1]"/>
<xsl:param name="colspecs"/>
<xsl:param name="spanspecs"/>
<xsl:param name="spanstr"/>
<xsl:param name="colpos" select="1"/>
<xsl:param name="colnum">
<xsl:call-template name="db2html.entry.colnum">
<xsl:with-param name="entry" select="$entry"/>
<xsl:with-param name="colspecs" select="$colspecs"/>
<xsl:with-param name="spanspecs" select="$spanspecs"/>
</xsl:call-template>
</xsl:param>
<xsl:param name="colspan">
<xsl:choose>
<xsl:when test="$entry/@spanname or $entry/@namest">
<xsl:call-template name="db2html.entry.colspan">
<xsl:with-param name="colspecs" select="$colspecs"/>
<xsl:with-param name="spanspecs" select="$spanspecs"/>
<xsl:with-param name="entry" select="$entry"/>
</xsl:call-template>
</xsl:when>
<xsl:otherwise>1</xsl:otherwise>
</xsl:choose>
</xsl:param>
<xsl:variable name="following.spanstr">
<xsl:call-template name="db2html.spanstr.pop">
<xsl:with-param name="colspecs" select="$colspecs"/>
<xsl:with-param name="spanspecs" select="$spanspecs"/>
<xsl:with-param name="colnum" select="$colnum"/>
<xsl:with-param name="colspan" select="$colspan"/>
<xsl:with-param name="spanstr" select="$spanstr"/>
</xsl:call-template>
</xsl:variable>
<xsl:choose>
<xsl:when test="$spanstr != '' and not(starts-with($spanstr, '0:'))">
<xsl:value-of select="substring-before($spanstr, ':') - 1"/>
<xsl:text>:</xsl:text>
<xsl:call-template name="db2html.spanstr">
<xsl:with-param name="row" select="$row"/>
<xsl:with-param name="entry" select="$entry"/>
<xsl:with-param name="colspecs" select="$colspecs"/>
<xsl:with-param name="spanspecs" select="$spanspecs"/>
<xsl:with-param name="spanstr" select="substring-after($spanstr, ':')"/>
<xsl:with-param name="colpos" select="$colpos + 1"/>
<xsl:with-param name="colnum" select="$colnum"/>
<xsl:with-param name="colspan" select="$colspan"/>
</xsl:call-template>
</xsl:when>
<xsl:when test="$colnum > $colpos">
<xsl:text>0:</xsl:text>
<xsl:call-template name="db2html.spanstr">
<xsl:with-param name="row" select="$row"/>
<xsl:with-param name="entry" select="$entry"/>
<xsl:with-param name="colspecs" select="$colspecs"/>
<xsl:with-param name="spanspecs" select="$spanspecs"/>
<xsl:with-param name="spanstr" select="$following.spanstr"/>
<xsl:with-param name="colpos" select="$colpos + $colspan"/>
<xsl:with-param name="colnum" select="$colnum"/>
<xsl:with-param name="colspan" select="$colspan"/>
</xsl:call-template>
</xsl:when>
<xsl:otherwise>
<xsl:call-template name="utils.repeat_string">
<xsl:with-param name="string">
<xsl:choose>
<xsl:when test="$entry/@morerows">
<xsl:value-of select="$entry/@morerows"/>
</xsl:when>
<xsl:otherwise>0</xsl:otherwise>
</xsl:choose>
<xsl:text>:</xsl:text>
</xsl:with-param>
<xsl:with-param name="number" select="$colspan"/>
</xsl:call-template>
<xsl:choose>
<xsl:when test="$entry/following-sibling::*[1]">
<xsl:call-template name="db2html.spanstr">
<xsl:with-param name="row" select="$row"/>
<xsl:with-param name="entry" select="$entry/following-sibling::*[1]"/>
<xsl:with-param name="colspecs" select="$colspecs"/>
<xsl:with-param name="spanspecs" select="$spanspecs"/>
<xsl:with-param name="spanstr" select="$following.spanstr"/>
<xsl:with-param name="colpos" select="$colpos + $colspan"/>
</xsl:call-template>
</xsl:when>
<xsl:when test="$following.spanstr != ''">
<xsl:call-template name="db2html.spanstr.decrement">
<xsl:with-param name="spanstr" select="$following.spanstr"/>
</xsl:call-template>
</xsl:when>
</xsl:choose>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
<!--**==========================================================================
db2html.spanstr.pop
Calculates the remaining spans after an `entry` element
[xsl:params]
$colspecs: The `colspec` elements currently in scope
$spanspecs: The `spanspec` elements currently in scope
$colspan: The number of columns to pop
$spanstr: The string representation of the column spans
REMARK: This template needs to be explained in detail, but I forgot how it works.
-->
<xsl:template name="db2html.spanstr.pop">
<xsl:param name="colspecs"/>
<xsl:param name="spanspecs"/>
<xsl:param name="colspan" select="1"/>
<xsl:param name="spanstr" select="''"/>
<xsl:choose>
<xsl:when test="$colspan > 0">
<xsl:call-template name="db2html.spanstr.pop">
<xsl:with-param name="colspecs" select="$colspecs"/>
<xsl:with-param name="spanspecs" select="$spanspecs"/>
<xsl:with-param name="colspan" select="$colspan - 1"/>
<xsl:with-param name="spanstr" select="substring-after($spanstr, ':')"/>
</xsl:call-template>
</xsl:when>
<xsl:otherwise>
<xsl:value-of select="$spanstr"/>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
<!--#* db2html.spanstr.decrement -->
<xsl:template name="db2html.spanstr.decrement">
<xsl:param name="spanstr"/>
<xsl:if test="$spanstr != ''">
<xsl:choose>
<xsl:when test="starts-with($spanstr, '0:')">
<xsl:text>0:</xsl:text>
</xsl:when>
<xsl:otherwise>
<xsl:variable name="span" select="substring-before($spanstr, ':')"/>
<xsl:value-of select="$span - 1"/>
<xsl:text>:</xsl:text>
</xsl:otherwise>
</xsl:choose>
<xsl:call-template name="db2html.spanstr.decrement">
<xsl:with-param name="spanstr" select="substring-after($spanstr, ':')"/>
</xsl:call-template>
</xsl:if>
</xsl:template>
<!-- = entrytbl = -->
<xsl:template match="entrytbl | db:entrytbl">
<xsl:variable name="colsep">
<xsl:choose>
<xsl:when test="@colsep">
<xsl:value-of select="string(@colsep)"/>
</xsl:when>
<xsl:when test="not(.//*[@colsep][1])"/>
<xsl:otherwise>
<xsl:text>0</xsl:text>
</xsl:otherwise>
</xsl:choose>
</xsl:variable>
<xsl:variable name="rowsep">
<xsl:choose>
<xsl:when test="@rowsep">
<xsl:value-of select="string(@rowsep)"/>
</xsl:when>
<xsl:when test="not(//*[@rowsep][1])"/>
<xsl:otherwise>
<xsl:text>0</xsl:text>
</xsl:otherwise>
</xsl:choose>
</xsl:variable>
<table>
<xsl:call-template name="html.class.attr"/>
<xsl:call-template name="html.lang.attrs"/>
<xsl:apply-templates select="thead | db:thead">
<xsl:with-param name="colspecs" select="colspec | db:colspec"/>
<xsl:with-param name="spanspecs" select="spanspec | db:spanspec"/>
<xsl:with-param name="colsep" select="$colsep"/>
<xsl:with-param name="rowsep" select="$rowsep"/>
</xsl:apply-templates>
<xsl:apply-templates select="tbody | db:tbody">
<xsl:with-param name="colspecs" select="colspec | db:colspec"/>
<xsl:with-param name="spanspecs" select="spanspec | db:spanspec"/>
<xsl:with-param name="colsep" select="$colsep"/>
<xsl:with-param name="rowsep" select="$rowsep"/>
</xsl:apply-templates>
</table>
</xsl:template>
<!-- = table = -->
<xsl:template match="table | informaltable | db:table | db:informaltable">
<xsl:variable name="if"><xsl:call-template name="db.profile.test"/></xsl:variable>
<xsl:if test="$if != ''">
<div>
<xsl:call-template name="html.class.attr">
<xsl:with-param name="class" select="'table'"/>
</xsl:call-template>
<xsl:call-template name="html.lang.attrs"/>
<xsl:call-template name="db2html.anchor"/>
<xsl:apply-templates select="title | db:title | db:info/db:title"/>
<!-- FIXME: I have no idea what I'm supposed to do with textobject -->
<xsl:choose>
<xsl:when test="graphic | mediaobject">
<xsl:apply-templates select="graphic | mediaobject"/>
</xsl:when>
<xsl:when test="db:graphic | db:mediaobject">
<xsl:apply-templates select="db:graphic | db:mediaobject"/>
</xsl:when>
<xsl:when test="tgroup">
<xsl:apply-templates select="tgroup"/>
</xsl:when>
<xsl:when test="db:tgroup">
<xsl:apply-templates select="db:tgroup"/>
</xsl:when>
<xsl:otherwise>
<xsl:call-template name="db2html.table.table">
<xsl:with-param name="node" select="."/>
<xsl:with-param name="table" select="."/>
</xsl:call-template>
<xsl:apply-templates select="caption | db:caption"/>
</xsl:otherwise>
</xsl:choose>
</div>
</xsl:if>
</xsl:template>
<!-- = tgroup = -->
<xsl:template match="tgroup | db:tgroup">
<xsl:call-template name="db2html.table.table">
<xsl:with-param name="node" select="."/>
<xsl:with-param name="table" select=".."/>
</xsl:call-template>
</xsl:template>
<xsl:template name="db2html.table.table">
<xsl:param name="node" select="."/>
<xsl:param name="table" select="$node"/>
<xsl:variable name="colsep">
<xsl:choose>
<xsl:when test="$node/@colsep">
<xsl:value-of select="string($node/@colsep)"/>
</xsl:when>
<xsl:when test="not($node//*[@colsep][1])"/>
<xsl:otherwise>
<xsl:text>0</xsl:text>
</xsl:otherwise>
</xsl:choose>
</xsl:variable>
<xsl:variable name="rowsep">
<xsl:choose>
<xsl:when test="$node/@rowsep">
<xsl:value-of select="string($node/@rowsep)"/>
</xsl:when>
<xsl:when test="not($node//*[@rowsep][1])"/>
<xsl:otherwise>
<xsl:text>0</xsl:text>
</xsl:otherwise>
</xsl:choose>
</xsl:variable>
<xsl:variable name="style">
<xsl:if test="$table/@frame = 'all' or $table/@frame = 'border' or not($table/@frame)">
<xsl:text>border: solid 1px; </xsl:text>
</xsl:if>
<xsl:if test="$table/@frame = 'none'">
<xsl:text>border: none; </xsl:text>
</xsl:if>
<xsl:if test="$table/@frame = 'bottom' or $table/@frame = 'topbot'">
<xsl:text>border-bottom: solid 1px; </xsl:text>
</xsl:if>
<xsl:if test="$table/@frame = 'top' or $table/@frame = 'topbot'">
<xsl:text>border-top: solid 1px; </xsl:text>
</xsl:if>
<xsl:if test="$table/@frame = 'sides'">
<xsl:text>border-left: solid 1px; border-right: solid 1px; </xsl:text>
</xsl:if>
</xsl:variable>
<xsl:variable name="class">
<xsl:if test="$table/@pgwide = '1'">
<xsl:text>table-pgwide</xsl:text>
</xsl:if>
<xsl:if test="$table/@rules = 'groups'">
<xsl:text> table-rules-groups</xsl:text>
</xsl:if>
<xsl:if test="$table/@rules = 'rows'">
<xsl:text> table-rules-rows</xsl:text>
</xsl:if>
<xsl:if test="$table/@rules = 'cols'">
<xsl:text> table-rules-cols</xsl:text>
</xsl:if>
<xsl:if test="$table/@rules = 'all'">
<xsl:text> table-rules-rows table-rules-cols</xsl:text>
</xsl:if>
</xsl:variable>
<table>
<xsl:call-template name="html.class.attr">
<xsl:with-param name="node" select="$node"/>
<xsl:with-param name="class" select="$class"/>
</xsl:call-template>
<xsl:call-template name="html.lang.attrs">
<xsl:with-param name="node" select="$node"/>
</xsl:call-template>
<xsl:if test="$table/title or $table/db:title or $table/db:info/db:title">
<xsl:attribute name="summary">
<xsl:value-of select="$table/title | $table/db:title | $table/db:info/db:title"/>
</xsl:attribute>
</xsl:if>
<xsl:if test="$style != ''">
<xsl:attribute name="style">
<xsl:value-of select="normalize-space($style)"/>
</xsl:attribute>
</xsl:if>
<xsl:choose>
<xsl:when test="tr | db:tr">
<tbody>
<xsl:apply-templates select="$node/tr | $node/db:tr">
<xsl:with-param name="colsep" select="$colsep"/>
<xsl:with-param name="rowsep" select="$rowsep"/>
</xsl:apply-templates>
</tbody>
</xsl:when>
<xsl:otherwise>
<xsl:apply-templates select="$node/thead | $node/db:thead">
<xsl:with-param name="colspecs" select="$node/colspec | $node/db:colspec"/>
<xsl:with-param name="spanspecs" select="$node/spanspec | $node/db:spanspec"/>
<xsl:with-param name="colsep" select="$colsep"/>
<xsl:with-param name="rowsep" select="$rowsep"/>
</xsl:apply-templates>
<xsl:apply-templates select="$node/tbody | $node/db:tbody">
<xsl:with-param name="colspecs" select="$node/colspec | $node/db:colspec"/>
<xsl:with-param name="spanspecs" select="$node/spanspec | $node/db:spanspec"/>
<xsl:with-param name="colsep" select="$colsep"/>
<xsl:with-param name="rowsep" select="$rowsep"/>
</xsl:apply-templates>
<xsl:apply-templates select="$node/tfoot | $node/db:tfoot">
<xsl:with-param name="colspecs" select="$node/colspec | $node/db:colspec"/>
<xsl:with-param name="spanspecs" select="$node/spanspec | $node/db:spanspec"/>
<xsl:with-param name="colsep" select="$colsep"/>
<xsl:with-param name="rowsep" select="$rowsep"/>
</xsl:apply-templates>
</xsl:otherwise>
</xsl:choose>
</table>
</xsl:template>
<!-- = tbody | tfoot | thead = -->
<xsl:template match="tbody | tfoot | thead | db:tbody | db:tfoot | db:thead">
<xsl:param name="colspecs"/>
<xsl:param name="spanspecs"/>
<xsl:param name="colsep" select="''"/>
<xsl:param name="rowsep" select="''"/>
<xsl:element name="{local-name(.)}" namespace="{$html.namespace}">
<xsl:call-template name="html.lang.attrs"/>
<xsl:call-template name="html.class.attr"/>
<xsl:if test="@valign">
<xsl:attribute name="valign">
<xsl:value-of select="@valign"/>
</xsl:attribute>
</xsl:if>
<xsl:choose>
<xsl:when test="tr">
<xsl:apply-templates select="tr"/>
</xsl:when>
<xsl:when test="db:tr">
<xsl:apply-templates select="db:tr"/>
</xsl:when>
<xsl:when test="colspec | db:colspec">
<xsl:call-template name="db2html.row">
<xsl:with-param name="row" select="row[1] | db:row[1]"/>
<xsl:with-param name="colspecs" select="colspec | db:colspec"/>
<xsl:with-param name="spanspecs" select="spanspec | db:spanspec"/>
<xsl:with-param name="colsep" select="$colsep"/>
<xsl:with-param name="rowsep" select="$rowsep"/>
</xsl:call-template>
</xsl:when>
<xsl:otherwise>
<xsl:call-template name="db2html.row">
<xsl:with-param name="row" select="row[1] | db:row[1]"/>
<xsl:with-param name="colspecs" select="$colspecs"/>
<xsl:with-param name="spanspecs" select="$spanspecs"/>
<xsl:with-param name="colsep" select="$colsep"/>
<xsl:with-param name="rowsep" select="$rowsep"/>
</xsl:call-template>
</xsl:otherwise>
</xsl:choose>
</xsl:element>
</xsl:template>
<!-- = tr = -->
<xsl:template match="tr | db:tr">
<tr>
<xsl:call-template name="html.lang.attrs"/>
<xsl:call-template name="html.class.attr"/>
<xsl:choose>
<xsl:when test="@align = 'left' or @align = 'center' or
@align = 'right' or @align = 'justify' ">
<xsl:attribute name="style">
<xsl:text>text-align: </xsl:text>
<xsl:value-of select="@align"/>
</xsl:attribute>
</xsl:when>
<xsl:when test="@align = 'char'">
<xsl:attribute name="style">
<xsl:text>text-align: "</xsl:text>
<xsl:choose>
<xsl:when test="@char != ''">
<xsl:value-of select="@char"/>
</xsl:when>
<xsl:otherwise>
<xsl:text>.</xsl:text>
</xsl:otherwise>
</xsl:choose>
<xsl:text>"</xsl:text>
</xsl:attribute>
</xsl:when>
</xsl:choose>
<xsl:apply-templates/>
</tr>
</xsl:template>
<!-- = td | th = -->
<xsl:template match="td | th | db:td | db:th">
<xsl:element name="{local-name(.)}" namespace="{$html.namespace}">
<xsl:call-template name="html.lang.attrs"/>
<xsl:call-template name="html.class.attr"/>
<xsl:copy-of select="@valign | @rowspan | @colspan | @scope"/>
<xsl:choose>
<xsl:when test="@align = 'left' or @align = 'center' or
@align = 'right' or @align = 'justify' ">
<xsl:attribute name="style">
<xsl:text>text-align: </xsl:text>
<xsl:value-of select="@align"/>
</xsl:attribute>
</xsl:when>
<xsl:when test="@align = 'char'">
<xsl:attribute name="style">
<xsl:text>text-align: "</xsl:text>
<xsl:choose>
<xsl:when test="@char != ''">
<xsl:value-of select="@char"/>
</xsl:when>
<xsl:otherwise>
<xsl:text>.</xsl:text>
</xsl:otherwise>
</xsl:choose>
<xsl:text>"</xsl:text>
</xsl:attribute>
</xsl:when>
</xsl:choose>
<xsl:apply-templates/>
</xsl:element>
</xsl:template>
</xsl:stylesheet>