2
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
3
xmlns:fo="http://www.w3.org/1999/XSL/Format"
6
<!-- ********************************************************************
7
$Id: htmltbl.xsl 8392 2009-04-01 08:47:55Z bobstayton $
8
********************************************************************
10
This file is part of the XSL DocBook Stylesheet distribution.
11
See ../README or http://docbook.sf.net/release/xsl/current/ for
12
copyright and other information.
14
******************************************************************** -->
16
<!-- ==================================================================== -->
18
<!-- Outputs an fo:table only, not the caption -->
19
<xsl:template match="table|informaltable" mode="htmlTable">
21
<xsl:variable name="numcols">
22
<xsl:call-template name="widest-html-row">
23
<xsl:with-param name="rows" select=".//tr"/>
27
<xsl:variable name="prop-columns"
28
select=".//col[contains(@width, '%')] |
29
.//colgroup[contains(@width, '%')]"/>
31
<xsl:variable name="table.width">
32
<xsl:call-template name="table.width"/>
35
<fo:table xsl:use-attribute-sets="table.table.properties">
37
<xsl:when test="$fop.extensions != 0 or
38
$passivetex.extensions != 0">
39
<xsl:attribute name="table-layout">fixed</xsl:attribute>
43
<xsl:attribute name="width">
45
<xsl:when test="@width">
46
<xsl:value-of select="@width"/>
48
<xsl:when test="$table.width">
49
<xsl:value-of select="$table.width"/>
51
<xsl:otherwise>100%</xsl:otherwise>
55
<xsl:call-template name="table.frame">
56
<xsl:with-param name="frame">
58
<xsl:when test="@frame = 'box'">all</xsl:when>
59
<xsl:when test="@frame = 'border'">all</xsl:when>
60
<xsl:when test="@frame = 'below'">bottom</xsl:when>
61
<xsl:when test="@frame = 'above'">top</xsl:when>
62
<xsl:when test="@frame = 'hsides'">topbot</xsl:when>
63
<xsl:when test="@frame = 'vsides'">sides</xsl:when>
64
<xsl:when test="@frame = 'lhs'">lhs</xsl:when>
65
<xsl:when test="@frame = 'rhs'">rhs</xsl:when>
66
<xsl:when test="@frame = 'void'">none</xsl:when>
67
<xsl:when test="@border != '' and @border != 0">all</xsl:when>
68
<xsl:when test="@border != '' and @border = 0">none</xsl:when>
69
<xsl:when test="@frame != ''">
70
<xsl:value-of select="@frame"/>
72
<xsl:when test="$default.table.frame != ''">
73
<xsl:value-of select="$default.table.frame"/>
75
<xsl:otherwise>all</xsl:otherwise>
80
<xsl:call-template name="make-html-table-columns">
81
<xsl:with-param name="count" select="$numcols"/>
84
<xsl:apply-templates select="thead" mode="htmlTable"/>
85
<xsl:apply-templates select="tfoot" mode="htmlTable"/>
87
<xsl:when test="tbody">
88
<xsl:apply-templates select="tbody" mode="htmlTable"/>
91
<fo:table-body start-indent="0pt" end-indent="0pt">
92
<xsl:apply-templates select="tr" mode="htmlTable"/>
100
<!-- This template writes rowsep or colsep equivalant for html tables -->
101
<xsl:template name="html.table.cell.rules">
102
<xsl:variable name="border"
103
select="(ancestor::table |
104
ancestor::informaltable)[last()]/@border"/>
105
<xsl:variable name="table.rules"
106
select="(ancestor::table |
107
ancestor::informaltable)[last()]/@rules"/>
109
<xsl:variable name="rules">
111
<xsl:when test="$table.rules != ''">
112
<xsl:value-of select="$table.rules"/>
114
<xsl:when test="$default.table.rules != ''">
115
<xsl:value-of select="$default.table.rules"/>
121
<xsl:when test="$border != '' and $border != 0">
122
<xsl:attribute name="border">
123
<xsl:value-of select="$table.cell.border.thickness"/>
124
<xsl:text> </xsl:text>
125
<xsl:value-of select="$table.cell.border.style"/>
126
<xsl:text> </xsl:text>
127
<xsl:value-of select="$table.cell.border.color"/>
130
<xsl:when test="$rules = 'none'">
131
<xsl:attribute name="border-start-style">none</xsl:attribute>
132
<xsl:attribute name="border-end-style">none</xsl:attribute>
133
<xsl:attribute name="border-top-style">none</xsl:attribute>
134
<xsl:attribute name="border-bottom-style">none</xsl:attribute>
137
<xsl:when test="$rules = 'cols' and following-sibling::*">
138
<!-- If not the last column, add border after -->
139
<xsl:attribute name="border-start-style">none</xsl:attribute>
140
<xsl:attribute name="border-top-style">none</xsl:attribute>
141
<xsl:attribute name="border-bottom-style">none</xsl:attribute>
142
<xsl:attribute name="border-end-style">
143
<xsl:value-of select="$table.frame.border.style"/>
145
<xsl:attribute name="border-end-width">
146
<xsl:value-of select="$table.frame.border.thickness"/>
148
<xsl:attribute name="border-end-color">
149
<xsl:value-of select="$table.frame.border.color"/>
152
<!-- If not the last row, add border below -->
153
<xsl:when test="$rules = 'rows'">
154
<xsl:variable name="rowborder">
156
<!-- If in thead and tbody has rows, add border -->
157
<xsl:when test="parent::tr/parent::thead/
158
following-sibling::tbody/tr">1</xsl:when>
159
<!-- If in tbody and tfoot has rows, add border -->
160
<xsl:when test="parent::tr/parent::tbody/
161
following-sibling::tfoot/tr">1</xsl:when>
162
<xsl:when test="parent::tr/parent::tbody/
163
preceding-sibling::tfoot/tr">1</xsl:when>
164
<!-- If following rows, but not rowspan reaches last row -->
165
<xsl:when test="parent::tr/following-sibling::tr and
166
not(@rowspan = count(parent::tr/following-sibling::tr) + 1)">1</xsl:when>
167
<xsl:otherwise>0</xsl:otherwise>
171
<xsl:if test="$rowborder = 1">
172
<xsl:attribute name="border-start-style">none</xsl:attribute>
173
<xsl:attribute name="border-end-style">none</xsl:attribute>
174
<xsl:attribute name="border-top-style">none</xsl:attribute>
175
<xsl:attribute name="border-bottom-style">
176
<xsl:value-of select="$table.frame.border.style"/>
178
<xsl:attribute name="border-bottom-width">
179
<xsl:value-of select="$table.frame.border.thickness"/>
181
<xsl:attribute name="border-bottom-color">
182
<xsl:value-of select="$table.frame.border.color"/>
186
<xsl:when test="$rules = 'all'">
187
<xsl:attribute name="border-start-style">none</xsl:attribute>
188
<xsl:attribute name="border-top-style">none</xsl:attribute>
190
<xsl:variable name="rowborder">
192
<!-- If in thead and tbody has rows, add border -->
193
<xsl:when test="parent::tr/parent::thead/
194
following-sibling::tbody/tr">1</xsl:when>
195
<!-- If in tbody and tfoot has rows, add border -->
196
<xsl:when test="parent::tr/parent::tbody/
197
following-sibling::tfoot/tr">1</xsl:when>
198
<xsl:when test="parent::tr/parent::tbody/
199
preceding-sibling::tfoot/tr">1</xsl:when>
200
<!-- If following rows, but not rowspan reaches last row -->
201
<xsl:when test="parent::tr/following-sibling::tr and
202
not(@rowspan = count(parent::tr/following-sibling::tr) + 1)">1</xsl:when>
203
<xsl:otherwise>0</xsl:otherwise>
207
<xsl:if test="$rowborder = 1">
208
<xsl:attribute name="border-bottom-style">
209
<xsl:value-of select="$table.frame.border.style"/>
211
<xsl:attribute name="border-bottom-width">
212
<xsl:value-of select="$table.frame.border.thickness"/>
214
<xsl:attribute name="border-bottom-color">
215
<xsl:value-of select="$table.frame.border.color"/>
219
<xsl:if test="following-sibling::*">
220
<!-- If not the last column, add border after -->
221
<xsl:attribute name="border-end-style">
222
<xsl:value-of select="$table.frame.border.style"/>
224
<xsl:attribute name="border-end-width">
225
<xsl:value-of select="$table.frame.border.thickness"/>
227
<xsl:attribute name="border-end-color">
228
<xsl:value-of select="$table.frame.border.color"/>
232
<xsl:when test="$rules = 'groups' and ancestor::thead
233
and not(parent::tr/following-sibling::tr)">
234
<xsl:attribute name="border-start-style">none</xsl:attribute>
235
<xsl:attribute name="border-end-style">none</xsl:attribute>
236
<xsl:attribute name="border-top-style">none</xsl:attribute>
237
<xsl:attribute name="border-bottom-style">
238
<xsl:value-of select="$table.frame.border.style"/>
240
<xsl:attribute name="border-bottom-width">
241
<xsl:value-of select="$table.frame.border.thickness"/>
243
<xsl:attribute name="border-bottom-color">
244
<xsl:value-of select="$table.frame.border.color"/>
247
<xsl:when test="$rules = 'groups' and ancestor::tfoot
248
and not(parent::tr/preceding-sibling::tr)">
249
<xsl:attribute name="border-start-style">none</xsl:attribute>
250
<xsl:attribute name="border-end-style">none</xsl:attribute>
251
<xsl:attribute name="border-top-style">none</xsl:attribute>
252
<xsl:attribute name="border-top-style">
253
<xsl:value-of select="$table.frame.border.style"/>
255
<xsl:attribute name="border-top-width">
256
<xsl:value-of select="$table.frame.border.thickness"/>
258
<xsl:attribute name="border-top-color">
259
<xsl:value-of select="$table.frame.border.color"/>
265
<xsl:template match="caption" mode="htmlTable">
266
<!-- Handled by formal.object.heading -->
269
<xsl:template name="widest-html-row">
270
<xsl:param name="rows" select="''"/>
271
<xsl:param name="count" select="0"/>
273
<xsl:when test="count($rows) = 0">
274
<xsl:value-of select="$count"/>
278
<xsl:when test="$count > count($rows[1]/*)">
279
<xsl:call-template name="widest-html-row">
280
<xsl:with-param name="rows" select="$rows[position() > 1]"/>
281
<xsl:with-param name="count" select="$count"/>
285
<xsl:call-template name="widest-html-row">
286
<xsl:with-param name="rows" select="$rows[position() > 1]"/>
287
<xsl:with-param name="count" select="count($rows[1]/*)"/>
295
<xsl:template name="make-html-table-columns">
296
<xsl:param name="count" select="0"/>
297
<xsl:param name="number" select="1"/>
300
<xsl:when test="col|colgroup/col">
301
<xsl:for-each select="col|colgroup/col">
303
<xsl:attribute name="column-number">
304
<xsl:number from="table|informaltable" level="any" format="1"/>
306
<xsl:if test="@width">
307
<xsl:attribute name="column-width">
309
<xsl:when test="$fop.extensions != 0 and
310
contains(@width, '%')">
311
<xsl:value-of select="concat('proportional-column-width(',
312
substring-before(@width, '%'),
316
<xsl:value-of select="@width"/>
324
<xsl:when test="$fop.extensions != 0">
325
<xsl:if test="$number <= $count">
326
<fo:table-column column-number="{$number}"
327
column-width="{6.5 div $count}in"/>
328
<xsl:call-template name="make-html-table-columns">
329
<xsl:with-param name="count" select="$count"/>
330
<xsl:with-param name="number" select="$number + 1"/>
337
<xsl:template match="tbody" mode="htmlTable">
338
<fo:table-body start-indent="0pt"
340
<xsl:apply-templates mode="htmlTable"/>
344
<xsl:template match="tfoot" mode="htmlTable">
345
<fo:table-footer start-indent="0pt"
347
<xsl:apply-templates mode="htmlTable"/>
351
<xsl:template match="th|td" mode="htmlTable">
352
<xsl:variable name="bgcolor.pi">
353
<xsl:call-template name="pi.dbfo_bgcolor"/>
356
<xsl:variable name="bgcolor">
358
<xsl:when test="$bgcolor.pi != ''">
359
<xsl:value-of select="$bgcolor.pi"/>
361
<xsl:when test="string-length(@bgcolor) != 0">
362
<xsl:value-of select="@bgcolor"/>
367
<xsl:variable name="align">
368
<xsl:call-template name="inherited.table.attribute">
369
<xsl:with-param name="entry" select="."/>
370
<xsl:with-param name="row" select="parent::tr"/>
371
<xsl:with-param name="attribute" select="'align'"/>
375
<xsl:variable name="valign">
376
<xsl:call-template name="inherited.table.attribute">
377
<xsl:with-param name="entry" select="."/>
378
<xsl:with-param name="row" select="parent::tr"/>
379
<xsl:with-param name="attribute" select="'valign'"/>
383
<fo:table-cell xsl:use-attribute-sets="table.cell.padding">
384
<xsl:call-template name="table.cell.properties">
385
<xsl:with-param name="bgcolor.pi" select="$bgcolor"/>
386
<xsl:with-param name="rowsep.inherit" select="0"/>
387
<xsl:with-param name="align.inherit" select="$align"/>
388
<xsl:with-param name="valign.inherit" select="$valign"/>
389
<xsl:with-param name="colsep.inherit" select="0"/>
392
<xsl:if test="@colspan > 1">
393
<xsl:attribute name="number-columns-spanned">
394
<xsl:value-of select="@colspan"/>
398
<xsl:if test="@rowspan > 1">
399
<xsl:attribute name="number-rows-spanned">
400
<xsl:value-of select="@rowspan"/>
405
<xsl:call-template name="table.cell.block.properties"/>
406
<xsl:apply-templates/>
411
<xsl:template match="thead" mode="htmlTable">
412
<fo:table-header start-indent="0pt"
414
<xsl:apply-templates mode="htmlTable"/>
418
<xsl:template match="tr" mode="htmlTable">
420
<xsl:call-template name="table.row.properties"/>
421
<xsl:apply-templates mode="htmlTable"/>