root/docs/docbook-xsl/fo/table.xsl

Revision 23dea7e00df87480acb58bb3398283c2bb227949, 40.9 kB (checked in by Theo Schlossnagle <jesus@omniti.com>, 7 years ago)

pull docs into master

  • Property mode set to 100644
Line 
1 <?xml version='1.0'?>
2 <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
3                 xmlns:doc="http://nwalsh.com/xsl/documentation/1.0"
4                 xmlns:fo="http://www.w3.org/1999/XSL/Format"
5                 xmlns:stbl="http://nwalsh.com/xslt/ext/com.nwalsh.saxon.Table"
6                 xmlns:xtbl="com.nwalsh.xalan.Table"
7                 xmlns:lxslt="http://xml.apache.org/xslt"
8                 xmlns:ptbl="http://nwalsh.com/xslt/ext/xsltproc/python/Table"
9                 exclude-result-prefixes="doc stbl xtbl lxslt ptbl"
10                 version='1.0'>
11
12 <xsl:include href="../common/table.xsl"/>
13
14 <!-- ********************************************************************
15      $Id: table.xsl,v 1.44 2005/08/09 09:30:44 bobstayton Exp $
16      ********************************************************************
17
18      This file is part of the XSL DocBook Stylesheet distribution.
19      See ../README or http://nwalsh.com/docbook/xsl/ for copyright
20      and other information.
21
22      ******************************************************************** -->
23
24 <doc:reference xmlns="">
25 <referenceinfo>
26 <releaseinfo role="meta">
27 $Id: table.xsl,v 1.44 2005/08/09 09:30:44 bobstayton Exp $
28 </releaseinfo>
29 <author><surname>Walsh</surname>
30 <firstname>Norman</firstname></author>
31 <copyright><year>1999</year><year>2000</year>
32 <holder>Norman Walsh</holder>
33 </copyright>
34 </referenceinfo>
35 <title>Formatting Object Table Reference</title>
36
37 <partintro>
38 <section><title>Introduction</title>
39
40 <para>This is technical reference documentation for the DocBook XSL
41 Stylesheets; it documents (some of) the parameters, templates, and
42 other elements of the stylesheets.</para>
43
44 <para>This is not intended to be <quote>user</quote> documentation.
45 It is provided for developers writing customization layers for the
46 stylesheets, and for anyone who's interested in <quote>how it
47 works</quote>.</para>
48
49 <para>Although I am trying to be thorough, this documentation is known
50 to be incomplete. Don't forget to read the source, too :-)</para>
51 </section>
52 </partintro>
53 </doc:reference>
54
55 <!-- ==================================================================== -->
56
57 <lxslt:component prefix="xtbl"
58                  functions="adjustColumnWidths"/>
59
60 <!-- ==================================================================== -->
61
62 <xsl:template name="empty.table.cell">
63   <xsl:param name="colnum" select="0"/>
64
65   <xsl:variable name="rowsep">
66     <xsl:choose>
67       <!-- If this is the last row, rowsep never applies. -->
68       <xsl:when test="not(ancestor-or-self::row[1]/following-sibling::row
69                           or ancestor-or-self::thead/following-sibling::tbody
70                           or ancestor-or-self::tbody/preceding-sibling::tfoot)">
71         <xsl:value-of select="0"/>
72       </xsl:when>
73       <xsl:otherwise>
74         <xsl:call-template name="inherited.table.attribute">
75           <xsl:with-param name="entry" select="NOT-AN-ELEMENT-NAME"/>
76           <xsl:with-param name="row" select="ancestor-or-self::row[1]"/>
77           <xsl:with-param name="colnum" select="$colnum"/>
78           <xsl:with-param name="attribute" select="'rowsep'"/>
79         </xsl:call-template>
80       </xsl:otherwise>
81     </xsl:choose>
82   </xsl:variable>
83
84   <xsl:variable name="colsep">
85     <xsl:choose>
86       <!-- If this is the last column, colsep never applies. -->
87       <xsl:when test="$colnum &gt;= ancestor::tgroup/@cols">0</xsl:when>
88       <xsl:otherwise>
89         <xsl:call-template name="inherited.table.attribute">
90           <xsl:with-param name="entry" select="NOT-AN-ELEMENT-NAME"/>
91           <xsl:with-param name="row" select="ancestor-or-self::row[1]"/>
92           <xsl:with-param name="colnum" select="$colnum"/>
93           <xsl:with-param name="attribute" select="'colsep'"/>
94         </xsl:call-template>
95       </xsl:otherwise>
96     </xsl:choose>
97   </xsl:variable>
98
99   <fo:table-cell text-align="center"
100                  display-align="center"
101                  xsl:use-attribute-sets="table.cell.padding">
102     <xsl:if test="$xep.extensions != 0">
103       <!-- Suggested by RenderX to workaround a bug in their implementation -->
104       <xsl:attribute name="keep-together.within-column">always</xsl:attribute>
105     </xsl:if>
106     <xsl:if test="$rowsep &gt; 0">
107       <xsl:call-template name="border">
108         <xsl:with-param name="side" select="'bottom'"/>
109       </xsl:call-template>
110     </xsl:if>
111
112     <xsl:if test="$colsep &gt; 0 and $colnum &lt; ancestor::tgroup/@cols">
113       <xsl:call-template name="border">
114         <xsl:with-param name="side" select="'right'"/>
115       </xsl:call-template>
116     </xsl:if>
117
118     <!-- fo:table-cell should not be empty -->
119     <fo:block/>
120   </fo:table-cell>
121 </xsl:template>
122
123 <!-- ==================================================================== -->
124
125 <xsl:template name="border">
126   <xsl:param name="side" select="'left'"/>
127
128   <xsl:attribute name="border-{$side}-width">
129     <xsl:value-of select="$table.cell.border.thickness"/>
130   </xsl:attribute>
131   <xsl:attribute name="border-{$side}-style">
132     <xsl:value-of select="$table.cell.border.style"/>
133   </xsl:attribute>
134   <xsl:attribute name="border-{$side}-color">
135     <xsl:value-of select="$table.cell.border.color"/>
136   </xsl:attribute>
137 </xsl:template>
138
139 <!-- ==================================================================== -->
140
141 <xsl:template match="tgroup" name="tgroup">
142   <xsl:if test="not(@cols)">
143     <xsl:message terminate="yes">
144       <xsl:text>Error: CALS tables must specify the number of columns.</xsl:text>
145     </xsl:message>
146   </xsl:if>
147
148   <xsl:variable name="table.width">
149     <xsl:call-template name="table.width"/>
150   </xsl:variable>
151
152   <xsl:variable name="colspecs">
153     <xsl:choose>
154       <xsl:when test="$use.extensions != 0
155                       and $tablecolumns.extension != 0">
156         <xsl:call-template name="generate.colgroup.raw">
157           <xsl:with-param name="cols" select="@cols"/>
158         </xsl:call-template>
159       </xsl:when>
160       <xsl:otherwise>
161         <xsl:call-template name="generate.colgroup">
162           <xsl:with-param name="cols" select="@cols"/>
163         </xsl:call-template>
164       </xsl:otherwise>
165     </xsl:choose>
166   </xsl:variable>
167
168 <!-- GEORGE  <xsl:if test="position() = 1"> -->
169     <!-- If this is the first tgroup, output the width attribute for the -->
170     <!-- surrounding fo:table. (If this isn't the first tgroup, trying   -->
171     <!-- to output the attribute will cause an error.)                   -->
172     <xsl:attribute name="width">
173       <xsl:value-of select="$table.width"/>
174     </xsl:attribute>
175 <!--  </xsl:if> -->
176
177   <xsl:choose>
178     <xsl:when test="$use.extensions != 0
179                     and $tablecolumns.extension != 0">
180       <xsl:choose>
181         <xsl:when test="function-available('stbl:adjustColumnWidths')">
182           <xsl:copy-of select="stbl:adjustColumnWidths($colspecs)"/>
183         </xsl:when>
184         <xsl:when test="function-available('xtbl:adjustColumnWidths')">
185           <xsl:copy-of select="xtbl:adjustColumnWidths($colspecs)"/>
186         </xsl:when>
187         <xsl:when test="function-available('ptbl:adjustColumnWidths')">
188           <xsl:copy-of select="ptbl:adjustColumnWidths($colspecs)"/>
189         </xsl:when>
190         <xsl:otherwise>
191           <xsl:message terminate="yes">
192             <xsl:text>No adjustColumnWidths function available.</xsl:text>
193           </xsl:message>
194         </xsl:otherwise>
195       </xsl:choose>
196     </xsl:when>
197     <xsl:otherwise>
198       <xsl:copy-of select="$colspecs"/>
199     </xsl:otherwise>
200   </xsl:choose>
201
202   <xsl:apply-templates select="thead"/>
203   <xsl:apply-templates select="tfoot"/>
204   <xsl:apply-templates select="tbody"/>
205 </xsl:template>
206
207 <xsl:template match="colspec"></xsl:template>
208
209 <xsl:template name="table.width">
210
211   <xsl:variable name="numcols">
212     <xsl:call-template name="widest-html-row">
213       <xsl:with-param name="rows" select=".//tr"/>
214     </xsl:call-template>
215   </xsl:variable>
216
217   <xsl:variable name="explicit.table.width">
218     <xsl:choose>
219       <xsl:when test="self::entrytbl">
220         <xsl:call-template name="dbfo-attribute">
221           <xsl:with-param name="pis"
222                           select="processing-instruction('dbfo')"/>
223           <xsl:with-param name="attribute" select="'table-width'"/>
224         </xsl:call-template>
225       </xsl:when>
226       <xsl:when test="self::table or self::informaltable">
227         <xsl:call-template name="dbfo-attribute">
228           <xsl:with-param name="pis"
229                           select="processing-instruction('dbfo')"/>
230           <xsl:with-param name="attribute" select="'table-width'"/>
231         </xsl:call-template>
232       </xsl:when>
233       <xsl:otherwise>
234         <xsl:call-template name="dbfo-attribute">
235           <xsl:with-param name="pis"
236                           select="../processing-instruction('dbfo')"/>
237           <xsl:with-param name="attribute" select="'table-width'"/>
238         </xsl:call-template>
239       </xsl:otherwise>
240     </xsl:choose>
241   </xsl:variable>
242
243   <xsl:variable name="column.sum">
244     <xsl:choose>
245       <!-- CALS table -->
246       <xsl:when test="tgroup[1][@cols]">
247         <xsl:if test="count(tgroup[1]/colspec) = tgroup/@cols">
248           <xsl:for-each select="tgroup[1]/colspec">
249             <xsl:if test="position() != 1">
250               <xsl:text> + </xsl:text>
251             </xsl:if>
252             <xsl:choose>
253               <xsl:when test="not(@colwidth)">NOWIDTH</xsl:when>
254               <xsl:when test="contains(@colwidth, '*')">NOWIDTH</xsl:when>
255               <xsl:otherwise>
256                 <xsl:value-of select="@colwidth"/>
257               </xsl:otherwise>
258             </xsl:choose>
259           </xsl:for-each>
260         </xsl:if>
261       </xsl:when>
262       <xsl:otherwise>
263         <!-- HTML table -->
264         <xsl:if test="count(col|colgroup/col) = $numcols">
265           <xsl:for-each select="col|colgroup/col">
266             <xsl:if test="position() != 1">
267               <xsl:text> + </xsl:text>
268             </xsl:if>
269             <xsl:choose>
270               <xsl:when test="not(@width)">NOWIDTH</xsl:when>
271               <xsl:when test="contains(@width, '%')">NOWIDTH</xsl:when>
272               <xsl:otherwise>
273                 <xsl:value-of select="@width"/>
274               </xsl:otherwise>
275             </xsl:choose>
276           </xsl:for-each>
277         </xsl:if>
278       </xsl:otherwise>
279     </xsl:choose>
280   </xsl:variable>
281
282   <xsl:variable name="column.sum.width">
283     <xsl:if test="not(contains($column.sum, 'NOWIDTH'))">
284       <xsl:value-of select="$column.sum"/>
285     </xsl:if>
286   </xsl:variable>
287
288   <xsl:variable name="table.width">
289     <xsl:choose>
290       <xsl:when test="$explicit.table.width != ''">
291         <xsl:value-of select="$explicit.table.width"/>
292       </xsl:when>
293       <xsl:when test="$column.sum.width != ''">
294         <xsl:value-of select="$column.sum.width"/>
295       </xsl:when>
296       <xsl:when test="$default.table.width = ''">
297         <xsl:choose>
298           <!-- These processors don't support table-layout="auto" -->
299           <xsl:when test="$fop.extensions != 0 or
300                           $passivetex.extensions != 0">
301             <xsl:text>100%</xsl:text>
302           </xsl:when>
303           <xsl:otherwise>
304             <xsl:text>auto</xsl:text>
305           </xsl:otherwise>
306         </xsl:choose>
307       </xsl:when>
308       <xsl:otherwise>
309         <xsl:value-of select="$default.table.width"/>
310       </xsl:otherwise>
311     </xsl:choose>
312   </xsl:variable>
313   <xsl:value-of select="$table.width"/>
314
315 </xsl:template>
316
317 <xsl:template match="spanspec"></xsl:template>
318
319 <xsl:template match="thead">
320   <xsl:variable name="tgroup" select="parent::*"/>
321
322   <fo:table-header start-indent="0pt" end-indent="0pt">
323     <xsl:apply-templates select="row[1]">
324       <xsl:with-param name="spans">
325         <xsl:call-template name="blank.spans">
326           <xsl:with-param name="cols" select="../@cols"/>
327         </xsl:call-template>
328       </xsl:with-param>
329     </xsl:apply-templates>
330   </fo:table-header>
331 </xsl:template>
332
333 <xsl:template match="tfoot">
334   <xsl:variable name="tgroup" select="parent::*"/>
335
336   <fo:table-footer start-indent="0pt" end-indent="0pt">
337     <xsl:apply-templates select="row[1]">
338       <xsl:with-param name="spans">
339         <xsl:call-template name="blank.spans">
340           <xsl:with-param name="cols" select="../@cols"/>
341         </xsl:call-template>
342       </xsl:with-param>
343     </xsl:apply-templates>
344
345   </fo:table-footer>
346 </xsl:template>
347
348 <xsl:template match="tbody">
349   <xsl:variable name="tgroup" select="parent::*"/>
350
351   <fo:table-body start-indent="0pt" end-indent="0pt">
352     <xsl:apply-templates select="row[1]">
353       <xsl:with-param name="spans">
354         <xsl:call-template name="blank.spans">
355           <xsl:with-param name="cols" select="../@cols"/>
356         </xsl:call-template>
357       </xsl:with-param>
358     </xsl:apply-templates>
359   </fo:table-body>
360 </xsl:template>
361
362 <xsl:template match="row">
363   <xsl:param name="spans"/>
364
365   <xsl:variable name="bgcolor">
366     <xsl:call-template name="dbfo-attribute">
367       <xsl:with-param name="pis" select="processing-instruction('dbfo')"/>
368       <xsl:with-param name="attribute" select="'bgcolor'"/>
369     </xsl:call-template>
370   </xsl:variable>
371
372   <fo:table-row>
373     <xsl:call-template name="anchor"/>
374     <xsl:if test="$bgcolor != ''">
375       <xsl:attribute name="background-color">
376         <xsl:value-of select="$bgcolor"/>
377       </xsl:attribute>
378     </xsl:if>
379
380     <xsl:apply-templates select="(entry|entrytbl)[1]">
381       <xsl:with-param name="spans" select="$spans"/>
382     </xsl:apply-templates>
383   </fo:table-row>
384
385   <xsl:if test="following-sibling::row">
386     <xsl:variable name="nextspans">
387       <xsl:apply-templates select="(entry|entrytbl)[1]" mode="span">
388         <xsl:with-param name="spans" select="$spans"/>
389       </xsl:apply-templates>
390     </xsl:variable>
391
392     <xsl:apply-templates select="following-sibling::row[1]">
393       <xsl:with-param name="spans" select="$nextspans"/>
394     </xsl:apply-templates>
395   </xsl:if>
396 </xsl:template>
397
398 <xsl:template match="entry|entrytbl" name="entry">
399   <xsl:param name="col" select="1"/>
400   <xsl:param name="spans"/>
401
402   <xsl:variable name="row" select="parent::row"/>
403   <xsl:variable name="group" select="$row/parent::*[1]"/>
404   <xsl:variable name="frame" select="ancestor::tgroup/parent::*/@frame"/>
405
406   <xsl:variable name="empty.cell" select="count(node()) = 0"/>
407
408   <xsl:variable name="named.colnum">
409     <xsl:call-template name="entry.colnum"/>
410   </xsl:variable>
411
412   <xsl:variable name="entry.colnum">
413     <xsl:choose>
414       <xsl:when test="$named.colnum &gt; 0">
415         <xsl:value-of select="$named.colnum"/>
416       </xsl:when>
417       <xsl:otherwise>
418         <xsl:value-of select="$col"/>
419       </xsl:otherwise>
420     </xsl:choose>
421   </xsl:variable>
422
423   <xsl:variable name="entry.colspan">
424     <xsl:choose>
425       <xsl:when test="@spanname or @namest">
426         <xsl:call-template name="calculate.colspan"/>
427       </xsl:when>
428       <xsl:otherwise>1</xsl:otherwise>
429     </xsl:choose>
430   </xsl:variable>
431
432   <xsl:variable name="following.spans">
433     <xsl:call-template name="calculate.following.spans">
434       <xsl:with-param name="colspan" select="$entry.colspan"/>
435       <xsl:with-param name="spans" select="$spans"/>
436     </xsl:call-template>
437   </xsl:variable>
438
439   <xsl:variable name="rowsep">
440     <xsl:choose>
441       <!-- If this is the last row, rowsep never applies. -->
442       <xsl:when test="not(ancestor-or-self::row[1]/following-sibling::row
443                           or ancestor-or-self::thead/following-sibling::tbody
444                           or ancestor-or-self::tbody/preceding-sibling::tfoot)">
445         <xsl:value-of select="0"/>
446       </xsl:when>
447       <xsl:otherwise>
448         <xsl:call-template name="inherited.table.attribute">
449           <xsl:with-param name="entry" select="."/>
450           <xsl:with-param name="colnum" select="$entry.colnum"/>
451           <xsl:with-param name="attribute" select="'rowsep'"/>
452         </xsl:call-template>
453       </xsl:otherwise>
454     </xsl:choose>
455   </xsl:variable>
456
457 <!--
458   <xsl:message><xsl:value-of select="."/>: <xsl:value-of select="$rowsep"/></xsl:message>
459 -->
460
461   <xsl:variable name="colsep">
462     <xsl:choose>
463       <!-- If this is the last column, colsep never applies. -->
464       <xsl:when test="$following.spans = ''">0</xsl:when>
465       <xsl:otherwise>
466         <xsl:call-template name="inherited.table.attribute">
467           <xsl:with-param name="entry" select="."/>
468           <xsl:with-param name="colnum" select="$entry.colnum"/>
469           <xsl:with-param name="attribute" select="'colsep'"/>
470         </xsl:call-template>
471       </xsl:otherwise>
472     </xsl:choose>
473   </xsl:variable>
474
475   <xsl:variable name="valign">
476     <xsl:call-template name="inherited.table.attribute">
477       <xsl:with-param name="entry" select="."/>
478       <xsl:with-param name="colnum" select="$entry.colnum"/>
479       <xsl:with-param name="attribute" select="'valign'"/>
480     </xsl:call-template>
481   </xsl:variable>
482
483   <xsl:variable name="align">
484     <xsl:call-template name="inherited.table.attribute">
485       <xsl:with-param name="entry" select="."/>
486       <xsl:with-param name="colnum" select="$entry.colnum"/>
487       <xsl:with-param name="attribute" select="'align'"/>
488     </xsl:call-template>
489   </xsl:variable>
490
491   <xsl:variable name="char">
492     <xsl:call-template name="inherited.table.attribute">
493       <xsl:with-param name="entry" select="."/>
494       <xsl:with-param name="colnum" select="$entry.colnum"/>
495       <xsl:with-param name="attribute" select="'char'"/>
496     </xsl:call-template>
497   </xsl:variable>
498
499   <xsl:variable name="charoff">
500     <xsl:call-template name="inherited.table.attribute">
501       <xsl:with-param name="entry" select="."/>
502       <xsl:with-param name="colnum" select="$entry.colnum"/>
503       <xsl:with-param name="attribute" select="'charoff'"/>
504     </xsl:call-template>
505   </xsl:variable>
506
507   <xsl:choose>
508     <xsl:when test="$spans != '' and not(starts-with($spans,'0:'))">
509       <xsl:call-template name="entry">
510         <xsl:with-param name="col" select="$col+1"/>
511         <xsl:with-param name="spans" select="substring-after($spans,':')"/>
512       </xsl:call-template>
513     </xsl:when>
514
515     <xsl:when test="$entry.colnum &gt; $col">
516       <xsl:call-template name="empty.table.cell">
517         <xsl:with-param name="colnum" select="$col"/>
518       </xsl:call-template>
519       <xsl:call-template name="entry">
520         <xsl:with-param name="col" select="$col+1"/>
521         <xsl:with-param name="spans" select="substring-after($spans,':')"/>
522       </xsl:call-template>
523     </xsl:when>
524
525     <xsl:otherwise>
526       <xsl:variable name="cell.content">
527         <fo:block>
528           <xsl:call-template name="table.cell.block.properties"/>
529
530           <!-- are we missing any indexterms? -->
531           <xsl:if test="not(preceding-sibling::entry)
532                         and not(parent::row/preceding-sibling::row)">
533             <!-- this is the first entry of the first row -->
534             <xsl:if test="ancestor::thead or
535                           (ancestor::tbody
536                            and not(ancestor::tbody/preceding-sibling::thead
537                                    or ancestor::tbody/preceding-sibling::tbody))">
538               <!-- of the thead or the first tbody -->
539               <xsl:apply-templates select="ancestor::tgroup/preceding-sibling::indexterm"/>
540             </xsl:if>
541           </xsl:if>
542
543           <!--
544           <xsl:text>(</xsl:text>
545           <xsl:value-of select="$rowsep"/>
546           <xsl:text>,</xsl:text>
547           <xsl:value-of select="$colsep"/>
548           <xsl:text>)</xsl:text>
549           -->
550           <xsl:choose>
551             <xsl:when test="$empty.cell">
552               <xsl:text>&#160;</xsl:text>
553             </xsl:when>
554             <xsl:when test="self::entrytbl">
555               <xsl:variable name="prop-columns"
556                             select=".//colspec[contains(@colwidth, '*')]"/>
557               <fo:table xsl:use-attribute-sets="table.table.properties">
558                 <xsl:if test="count($prop-columns) != 0">
559                   <xsl:attribute name="table-layout">fixed</xsl:attribute>
560                 </xsl:if>
561                 <xsl:call-template name="tgroup"/>
562               </fo:table>
563             </xsl:when>
564             <xsl:otherwise>
565               <xsl:apply-templates/>
566             </xsl:otherwise>
567           </xsl:choose>
568         </fo:block>
569       </xsl:variable>
570
571       <xsl:variable name="cell-orientation">
572         <xsl:call-template name="dbfo-attribute">
573           <xsl:with-param name="pis"
574                           select="ancestor-or-self::entry/processing-instruction('dbfo')"/>
575           <xsl:with-param name="attribute" select="'orientation'"/>
576         </xsl:call-template>
577       </xsl:variable>
578
579       <xsl:variable name="row-orientation">
580         <xsl:call-template name="dbfo-attribute">
581           <xsl:with-param name="pis"
582                           select="ancestor-or-self::row/processing-instruction('dbfo')"/>
583           <xsl:with-param name="attribute" select="'orientation'"/>
584         </xsl:call-template>
585       </xsl:variable>
586
587       <xsl:variable name="cell-width">
588         <xsl:call-template name="dbfo-attribute">
589           <xsl:with-param name="pis"
590                           select="ancestor-or-self::entry/processing-instruction('dbfo')"/>
591           <xsl:with-param name="attribute" select="'rotated-width'"/>
592         </xsl:call-template>
593       </xsl:variable>
594
595       <xsl:variable name="row-width">
596         <xsl:call-template name="dbfo-attribute">
597           <xsl:with-param name="pis"
598                           select="ancestor-or-self::row/processing-instruction('dbfo')"/>
599           <xsl:with-param name="attribute" select="'rotated-width'"/>
600         </xsl:call-template>
601       </xsl:variable>
602
603       <xsl:variable name="orientation">
604         <xsl:choose>
605           <xsl:when test="$cell-orientation != ''">
606             <xsl:value-of select="$cell-orientation"/>
607           </xsl:when>
608           <xsl:otherwise>
609             <xsl:value-of select="$row-orientation"/>
610           </xsl:otherwise>
611         </xsl:choose>
612       </xsl:variable>
613
614       <xsl:variable name="rotated-width">
615         <xsl:choose>
616           <xsl:when test="$cell-width != ''">
617             <xsl:value-of select="$cell-width"/>
618           </xsl:when>
619           <xsl:otherwise>
620             <xsl:value-of select="$row-width"/>
621           </xsl:otherwise>
622         </xsl:choose>
623       </xsl:variable>
624
625       <xsl:variable name="bgcolor">
626         <xsl:call-template name="dbfo-attribute">
627           <xsl:with-param name="pis"
628                           select="ancestor-or-self::entry/processing-instruction('dbfo')"/>
629           <xsl:with-param name="attribute" select="'bgcolor'"/>
630         </xsl:call-template>
631       </xsl:variable>
632
633       <fo:table-cell xsl:use-attribute-sets="table.cell.padding">
634         <xsl:call-template name="table.cell.properties">
635           <xsl:with-param name="bgcolor.pi" select="$bgcolor"/>
636           <xsl:with-param name="rowsep.inherit" select="$rowsep"/>
637           <xsl:with-param name="colsep.inherit" select="$colsep"/>
638           <xsl:with-param name="col" select="$col"/>
639           <xsl:with-param name="valign.inherit" select="$valign"/>
640           <xsl:with-param name="align.inherit" select="$align"/>
641           <xsl:with-param name="char.inherit" select="$char"/>
642         </xsl:call-template>
643
644         <xsl:call-template name="anchor"/>
645
646         <xsl:if test="@morerows">
647           <xsl:attribute name="number-rows-spanned">
648             <xsl:value-of select="@morerows+1"/>
649           </xsl:attribute>
650         </xsl:if>
651
652         <xsl:if test="$entry.colspan &gt; 1">
653           <xsl:attribute name="number-columns-spanned">
654             <xsl:value-of select="$entry.colspan"/>
655           </xsl:attribute>
656         </xsl:if>
657
658 <!--
659         <xsl:if test="@charoff">
660           <xsl:attribute name="charoff">
661             <xsl:value-of select="@charoff"/>
662           </xsl:attribute>
663         </xsl:if>
664 -->
665
666         <xsl:choose>
667           <xsl:when test="$fop.extensions = 0 and $passivetex.extensions = 0
668                           and $orientation != ''">
669             <fo:block-container reference-orientation="{$orientation}">
670               <xsl:if test="$rotated-width != ''">
671                 <xsl:attribute name="width">
672                   <xsl:value-of select="$rotated-width"/>
673                 </xsl:attribute>
674               </xsl:if>
675               <xsl:copy-of select="$cell.content"/>
676             </fo:block-container>
677           </xsl:when>
678           <xsl:otherwise>
679             <xsl:copy-of select="$cell.content"/>
680           </xsl:otherwise>
681         </xsl:choose>
682       </fo:table-cell>
683
684       <xsl:choose>
685         <xsl:when test="following-sibling::entry|following-sibling::entrytbl">
686           <xsl:apply-templates select="(following-sibling::entry
687                                        |following-sibling::entrytbl)[1]">
688             <xsl:with-param name="col" select="$col+$entry.colspan"/>
689             <xsl:with-param name="spans" select="$following.spans"/>
690           </xsl:apply-templates>
691         </xsl:when>
692         <xsl:otherwise>
693           <xsl:call-template name="finaltd">
694             <xsl:with-param name="spans" select="$following.spans"/>
695             <xsl:with-param name="col" select="$col+$entry.colspan"/>
696           </xsl:call-template>
697         </xsl:otherwise>
698       </xsl:choose>
699     </xsl:otherwise>
700   </xsl:choose>
701 </xsl:template>
702
703 <!-- Expand this template to add properties to any fo:table-cell -->
704 <xsl:template name="table.cell.properties">
705   <xsl:param name="bgcolor.pi" select="''"/>
706   <xsl:param name="rowsep.inherit" select="1"/>
707   <xsl:param name="colsep.inherit" select="1"/>
708   <xsl:param name="col" select="1"/>
709   <xsl:param name="valign.inherit" select="''"/>
710   <xsl:param name="align.inherit" select="''"/>
711   <xsl:param name="char.inherit" select="''"/>
712
713   <xsl:choose>
714     <xsl:when test="ancestor::tgroup">
715       <xsl:if test="$bgcolor.pi != ''">
716         <xsl:attribute name="background-color">
717           <xsl:value-of select="$bgcolor.pi"/>
718         </xsl:attribute>
719       </xsl:if>
720
721       <xsl:if test="$rowsep.inherit &gt; 0">
722         <xsl:call-template name="border">
723           <xsl:with-param name="side" select="'bottom'"/>
724         </xsl:call-template>
725       </xsl:if>
726
727       <xsl:if test="$colsep.inherit &gt; 0 and
728                       $col &lt; ancestor::tgroup/@cols">
729         <xsl:call-template name="border">
730           <xsl:with-param name="side" select="'right'"/>
731         </xsl:call-template>
732       </xsl:if>
733
734       <xsl:if test="$valign.inherit != ''">
735         <xsl:attribute name="display-align">
736           <xsl:choose>
737             <xsl:when test="$valign.inherit='top'">before</xsl:when>
738             <xsl:when test="$valign.inherit='middle'">center</xsl:when>
739             <xsl:when test="$valign.inherit='bottom'">after</xsl:when>
740             <xsl:otherwise>
741               <xsl:message>
742                 <xsl:text>Unexpected valign value: </xsl:text>
743                 <xsl:value-of select="$valign.inherit"/>
744                 <xsl:text>, center used.</xsl:text>
745               </xsl:message>
746               <xsl:text>center</xsl:text>
747             </xsl:otherwise>
748           </xsl:choose>
749         </xsl:attribute>
750       </xsl:if>
751
752       <xsl:if test="$align.inherit != ''">
753         <xsl:attribute name="text-align">
754           <xsl:value-of select="$align.inherit"/>
755         </xsl:attribute>
756       </xsl:if>
757
758       <xsl:if test="$char.inherit != ''">
759         <xsl:attribute name="text-align">
760           <xsl:value-of select="$char.inherit"/>
761         </xsl:attribute>
762       </xsl:if>
763     </xsl:when>
764     <xsl:otherwise>
765       <!-- HTML table -->
766       <xsl:variable name="border"
767                     select="(ancestor::table |
768                              ancestor::informaltable)[last()]/@border"/>
769       <xsl:if test="$border != '' and $border != 0">
770         <xsl:attribute name="border">
771           <xsl:value-of select="$table.cell.border.thickness"/>
772           <xsl:text> </xsl:text>
773           <xsl:value-of select="$table.cell.border.style"/>
774           <xsl:text> </xsl:text>
775           <xsl:value-of select="$table.cell.border.color"/>
776         </xsl:attribute>
777       </xsl:if>
778     </xsl:otherwise>
779   </xsl:choose>
780
781 </xsl:template>
782
783 <!-- Expand this template to add properties to any cell's block -->
784 <xsl:template name="table.cell.block.properties">
785   <!-- highlight this entry? -->
786   <xsl:if test="ancestor::thead">
787     <xsl:attribute name="font-weight">bold</xsl:attribute>
788   </xsl:if>
789 </xsl:template>
790
791 <xsl:template match="entry|entrytbl" name="sentry" mode="span">
792   <xsl:param name="col" select="1"/>
793   <xsl:param name="spans"/>
794
795   <xsl:variable name="entry.colnum">
796     <xsl:call-template name="entry.colnum"/>
797   </xsl:variable>
798
799   <xsl:variable name="entry.colspan">
800     <xsl:choose>
801       <xsl:when test="@spanname or @namest">
802         <xsl:call-template name="calculate.colspan"/>
803       </xsl:when>
804       <xsl:otherwise>1</xsl:otherwise>
805     </xsl:choose>
806   </xsl:variable>
807
808   <xsl:variable name="following.spans">
809     <xsl:call-template name="calculate.following.spans">
810       <xsl:with-param name="colspan" select="$entry.colspan"/>
811       <xsl:with-param name="spans" select="$spans"/>
812     </xsl:call-template>
813   </xsl:variable>
814
815   <xsl:choose>
816     <xsl:when test="$spans != '' and not(starts-with($spans,'0:'))">
817       <xsl:value-of select="substring-before($spans,':')-1"/>
818       <xsl:text>:</xsl:text>
819       <xsl:call-template name="sentry">
820         <xsl:with-param name="col" select="$col+1"/>
821         <xsl:with-param name="spans" select="substring-after($spans,':')"/>
822       </xsl:call-template>
823     </xsl:when>
824
825     <xsl:when test="$entry.colnum &gt; $col">
826       <xsl:text>0:</xsl:text>
827       <xsl:call-template name="sentry">
828         <xsl:with-param name="col" select="$col+$entry.colspan"/>
829         <xsl:with-param name="spans" select="$following.spans"/>
830       </xsl:call-template>
831     </xsl:when>
832
833     <xsl:otherwise>
834       <xsl:call-template name="copy-string">
835         <xsl:with-param name="count" select="$entry.colspan"/>
836         <xsl:with-param name="string">
837           <xsl:choose>
838             <xsl:when test="@morerows">
839               <xsl:value-of select="@morerows"/>
840             </xsl:when>
841             <xsl:otherwise>0</xsl:otherwise>
842           </xsl:choose>
843           <xsl:text>:</xsl:text>
844         </xsl:with-param>
845       </xsl:call-template>
846
847       <xsl:choose>
848         <xsl:when test="following-sibling::entry|following-sibling::entrytbl">
849           <xsl:apply-templates select="(following-sibling::entry
850                                        |following-sibling::entrytbl)[1]"
851                                mode="span">
852             <xsl:with-param name="col" select="$col+$entry.colspan"/>
853             <xsl:with-param name="spans" select="$following.spans"/>
854           </xsl:apply-templates>
855         </xsl:when>
856         <xsl:otherwise>
857           <xsl:call-template name="sfinaltd">
858             <xsl:with-param name="spans" select="$following.spans"/>
859           </xsl:call-template>
860         </xsl:otherwise>
861       </xsl:choose>
862     </xsl:otherwise>
863   </xsl:choose>
864 </xsl:template>
865
866 <xsl:template name="generate.colgroup.raw">
867   <xsl:param name="cols" select="1"/>
868   <xsl:param name="count" select="1"/>
869
870   <xsl:choose>
871     <xsl:when test="$count>$cols"></xsl:when>
872     <xsl:otherwise>
873       <xsl:call-template name="generate.col.raw">
874         <xsl:with-param name="countcol" select="$count"/>
875       </xsl:call-template>
876       <xsl:call-template name="generate.colgroup.raw">
877         <xsl:with-param name="cols" select="$cols"/>
878         <xsl:with-param name="count" select="$count+1"/>
879       </xsl:call-template>
880     </xsl:otherwise>
881   </xsl:choose>
882 </xsl:template>
883
884 <xsl:template name="generate.colgroup">
885   <xsl:param name="cols" select="1"/>
886   <xsl:param name="count" select="1"/>
887
888   <xsl:choose>
889     <xsl:when test="$count>$cols"></xsl:when>
890     <xsl:otherwise>
891       <xsl:call-template name="generate.col">
892         <xsl:with-param name="countcol" select="$count"/>
893       </xsl:call-template>
894       <xsl:call-template name="generate.colgroup">
895         <xsl:with-param name="cols" select="$cols"/>
896         <xsl:with-param name="count" select="$count+1"/>
897       </xsl:call-template>
898     </xsl:otherwise>
899   </xsl:choose>
900 </xsl:template>
901
902 <xsl:template name="generate.col.raw">
903   <!-- generate the table-column for column countcol -->
904   <xsl:param name="countcol">1</xsl:param>
905   <xsl:param name="colspecs" select="./colspec"/>
906   <xsl:param name="count">1</xsl:param>
907   <xsl:param name="colnum">1</xsl:param>
908
909   <xsl:choose>
910     <xsl:when test="$count>count($colspecs)">
911       <fo:table-column column-number="{$countcol}"/>
912     </xsl:when>
913     <xsl:otherwise>
914       <xsl:variable name="colspec" select="$colspecs[$count=position()]"/>
915
916       <xsl:variable name="colspec.colnum">
917         <xsl:choose>
918           <xsl:when test="$colspec/@colnum">
919             <xsl:value-of select="$colspec/@colnum"/>
920           </xsl:when>
921           <xsl:otherwise>
922             <xsl:value-of select="$colnum"/>
923           </xsl:otherwise>
924         </xsl:choose>
925       </xsl:variable>
926
927       <xsl:variable name="colspec.colwidth">
928         <xsl:choose>
929           <xsl:when test="$colspec/@colwidth">
930             <xsl:value-of select="$colspec/@colwidth"/>
931           </xsl:when>
932           <xsl:otherwise>1*</xsl:otherwise>
933         </xsl:choose>
934       </xsl:variable>
935
936       <xsl:choose>
937         <xsl:when test="$colspec.colnum=$countcol">
938           <fo:table-column column-number="{$countcol}">
939             <xsl:attribute name="column-width">
940               <xsl:value-of select="$colspec.colwidth"/>
941             </xsl:attribute>
942           </fo:table-column>
943         </xsl:when>
944         <xsl:otherwise>
945           <xsl:call-template name="generate.col.raw">
946             <xsl:with-param name="countcol" select="$countcol"/>
947             <xsl:with-param name="colspecs" select="$colspecs"/>
948             <xsl:with-param name="count" select="$count+1"/>
949             <xsl:with-param name="colnum">
950               <xsl:choose>
951                 <xsl:when test="$colspec/@colnum">
952                   <xsl:value-of select="$colspec/@colnum + 1"/>
953                 </xsl:when>
954                 <xsl:otherwise>
955                   <xsl:value-of select="$colnum + 1"/>
956                 </xsl:otherwise>
957               </xsl:choose>
958             </xsl:with-param>
959            </xsl:call-template>
960         </xsl:otherwise>
961       </xsl:choose>
962     </xsl:otherwise>
963   </xsl:choose>
964 </xsl:template>
965
966 <xsl:template name="generate.col">
967   <!-- generate the table-column for column countcol -->
968   <xsl:param name="countcol">1</xsl:param>
969   <xsl:param name="colspecs" select="./colspec"/>
970   <xsl:param name="count">1</xsl:param>
971   <xsl:param name="colnum">1</xsl:param>
972
973   <xsl:choose>
974     <xsl:when test="$count>count($colspecs)">
975       <fo:table-column column-number="{$countcol}">
976         <xsl:variable name="colwidth">
977           <xsl:call-template name="calc.column.width"/>
978         </xsl:variable>
979         <xsl:if test="$colwidth != 'proportional-column-width(1)'">
980           <xsl:attribute name="column-width">
981             <xsl:value-of select="$colwidth"/>
982           </xsl:attribute>
983         </xsl:if>
984       </fo:table-column>
985     </xsl:when>
986     <xsl:otherwise>
987       <xsl:variable name="colspec" select="$colspecs[$count=position()]"/>
988
989       <xsl:variable name="colspec.colnum">
990         <xsl:choose>
991           <xsl:when test="$colspec/@colnum">
992             <xsl:value-of select="$colspec/@colnum"/>
993           </xsl:when>
994           <xsl:otherwise>
995             <xsl:value-of select="$colnum"/>
996           </xsl:otherwise>
997         </xsl:choose>
998       </xsl:variable>
999
1000       <xsl:variable name="colspec.colwidth">
1001         <xsl:choose>
1002           <xsl:when test="$colspec/@colwidth">
1003             <xsl:value-of select="$colspec/@colwidth"/>
1004           </xsl:when>
1005           <xsl:otherwise>1*</xsl:otherwise>
1006         </xsl:choose>
1007       </xsl:variable>
1008
1009       <xsl:choose>
1010         <xsl:when test="$colspec.colnum=$countcol">
1011           <fo:table-column column-number="{$countcol}">
1012             <xsl:variable name="colwidth">
1013               <xsl:call-template name="calc.column.width">
1014                 <xsl:with-param name="colwidth">
1015                   <xsl:value-of select="$colspec.colwidth"/>
1016                 </xsl:with-param>
1017               </xsl:call-template>
1018             </xsl:variable>
1019             <xsl:if test="$colwidth != 'proportional-column-width(1)'">
1020               <xsl:attribute name="column-width">
1021                 <xsl:value-of select="$colwidth"/>
1022               </xsl:attribute>
1023             </xsl:if>
1024           </fo:table-column>
1025         </xsl:when>
1026         <xsl:otherwise>
1027           <xsl:call-template name="generate.col">
1028             <xsl:with-param name="countcol" select="$countcol"/>
1029             <xsl:with-param name="colspecs" select="$colspecs"/>
1030             <xsl:with-param name="count" select="$count+1"/>
1031             <xsl:with-param name="colnum">
1032               <xsl:choose>
1033                 <xsl:when test="$colspec/@colnum">
1034                   <xsl:value-of select="$colspec/@colnum + 1"/>
1035                 </xsl:when>
1036                 <xsl:otherwise>
1037                   <xsl:value-of select="$colnum + 1"/>
1038                 </xsl:otherwise>
1039               </xsl:choose>
1040             </xsl:with-param>
1041            </xsl:call-template>
1042         </xsl:otherwise>
1043       </xsl:choose>
1044     </xsl:otherwise>
1045   </xsl:choose>
1046 </xsl:template>
1047
1048 <doc:template name="calc.column.width" xmlns="">
1049 <refpurpose>Calculate an XSL FO table column width specification from a
1050 CALS table column width specification.</refpurpose>
1051
1052 <refdescription>
1053 <para>CALS expresses table column widths in the following basic
1054 forms:</para>
1055
1056 <itemizedlist>
1057 <listitem>
1058 <para><emphasis>99.99units</emphasis>, a fixed length specifier.</para>
1059 </listitem>
1060 <listitem>
1061 <para><emphasis>99.99</emphasis>, a fixed length specifier without any units.</para>
1062 </listitem>
1063 <listitem>
1064 <para><emphasis>99.99*</emphasis>, a relative length specifier.</para>
1065 </listitem>
1066 <listitem>
1067 <para><emphasis>99.99*+99.99units</emphasis>, a combination of both.</para>
1068 </listitem>
1069 </itemizedlist>
1070
1071 <para>The CALS units are points (pt), picas (pi), centimeters (cm),
1072 millimeters (mm), and inches (in). These are the same units as XSL,
1073 except that XSL abbreviates picas "pc" instead of "pi". If a length
1074 specifier has no units, the CALS default unit (pt) is assumed.</para>
1075
1076 <para>Relative length specifiers are represented in XSL with the
1077 proportional-column-width() function.</para>
1078
1079 <para>Here are some examples:</para>
1080
1081 <itemizedlist>
1082 <listitem>
1083 <para>"36pt" becomes "36pt"</para>
1084 </listitem>
1085 <listitem>
1086 <para>"3pi" becomes "3pc"</para>
1087 </listitem>
1088 <listitem>
1089 <para>"36" becomes "36pt"</para>
1090 </listitem>
1091 <listitem>
1092 <para>"3*" becomes "proportional-column-width(3)"</para>
1093 </listitem>
1094 <listitem>
1095 <para>"3*+2pi" becomes "proportional-column-width(3)+2pc"</para>
1096 </listitem>
1097 <listitem>
1098 <para>"1*+2" becomes "proportional-column-width(1)+2pt"</para>
1099 </listitem>
1100 </itemizedlist>
1101 </refdescription>
1102
1103 <refparameter>
1104 <variablelist>
1105 <varlistentry><term>colwidth</term>
1106 <listitem>
1107 <para>The CALS column width specification.</para>
1108 </listitem>
1109 </varlistentry>
1110 </variablelist>
1111 </refparameter>
1112
1113 <refreturn>
1114 <para>The XSL column width specification.</para>
1115 </refreturn>
1116 </doc:template>
1117
1118 <xsl:template name="calc.column.width">
1119   <xsl:param name="colwidth">1*</xsl:param>
1120
1121   <!-- Ok, the colwidth could have any one of the following forms: -->
1122   <!--        1*       = proportional width -->
1123   <!--         *       = same as 1* -->
1124   <!--     1unit       = 1.0 units wide -->
1125   <!--         1       = 1pt wide -->
1126   <!--  1*+1unit       = proportional width + some fixed width -->
1127   <!--      1*+1       = proportional width + some fixed width -->
1128
1129   <!-- If it has a proportional width, translate it to XSL -->
1130   <xsl:if test="contains($colwidth, '*')">
1131     <xsl:text>proportional-column-width(</xsl:text>
1132     <xsl:choose>
1133       <xsl:when test="substring-before($colwidth, '*') != ''">
1134         <xsl:value-of select="substring-before($colwidth, '*')"/>
1135       </xsl:when>
1136       <xsl:otherwise>
1137          <xsl:text>1.00</xsl:text>
1138       </xsl:otherwise>
1139     </xsl:choose>
1140     <xsl:text>)</xsl:text>
1141   </xsl:if>
1142
1143   <!-- Now grab the non-proportional part of the specification -->
1144   <xsl:variable name="width-units">
1145     <xsl:choose>
1146       <xsl:when test="contains($colwidth, '*')">
1147         <xsl:value-of
1148              select="normalize-space(substring-after($colwidth, '*'))"/>
1149       </xsl:when>
1150       <xsl:otherwise>
1151         <xsl:value-of select="normalize-space($colwidth)"/>
1152       </xsl:otherwise>
1153     </xsl:choose>
1154   </xsl:variable>
1155
1156   <!-- Ok, now the width-units could have any one of the following forms: -->
1157   <!--                 = <empty string> -->
1158   <!--     1unit       = 1.0 units wide -->
1159   <!--         1       = 1pt wide -->
1160   <!-- with an optional leading sign -->
1161
1162   <!-- Grab the width part by blanking out the units part and discarding -->
1163   <!-- whitespace. It's not pretty, but it works. -->
1164   <xsl:variable name="width"
1165        select="normalize-space(translate($width-units,
1166                                          '+-0123456789.abcdefghijklmnopqrstuvwxyz',
1167                                          '+-0123456789.'))"/>
1168
1169   <!-- Grab the units part by blanking out the width part and discarding -->
1170   <!-- whitespace. It's not pretty, but it works. -->
1171   <xsl:variable name="units"
1172        select="normalize-space(translate($width-units,
1173                                          'abcdefghijklmnopqrstuvwxyz+-0123456789.',
1174                                          'abcdefghijklmnopqrstuvwxyz'))"/>
1175
1176   <!-- Output the width -->
1177   <xsl:value-of select="$width"/>
1178
1179   <!-- Output the units, translated appropriately -->
1180   <xsl:choose>
1181     <xsl:when test="$units = 'pi'">pc</xsl:when>
1182     <xsl:when test="$units = '' and $width != ''">pt</xsl:when>
1183     <xsl:otherwise><xsl:value-of select="$units"/></xsl:otherwise>
1184   </xsl:choose>
1185 </xsl:template>
1186
1187 <!-- ==================================================================== -->
1188
1189 </xsl:stylesheet>
Note: See TracBrowser for help on using the browser.