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"/>