]> git.stg.codes - stg.git/blob - doc/xslt/html/lists.xsl
Added handy encoding functions.
[stg.git] / doc / xslt / html / lists.xsl
1 <?xml version='1.0'?>
2 <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
3                 version='1.0'>
4
5 <!-- ********************************************************************
6      $Id: lists.xsl 8524 2009-10-10 02:45:47Z abdelazer $
7      ********************************************************************
8
9      This file is part of the XSL DocBook Stylesheet distribution.
10      See ../README or http://docbook.sf.net/release/xsl/current/ for
11      copyright and other information.
12
13      ******************************************************************** -->
14
15 <!-- ==================================================================== -->
16
17 <xsl:template match="itemizedlist">
18   <div>
19     <xsl:call-template name="common.html.attributes"/>
20     <xsl:call-template name="anchor"/>
21     <xsl:if test="title">
22       <xsl:call-template name="formal.object.heading"/>
23     </xsl:if>
24
25     <!-- Preserve order of PIs and comments -->
26     <xsl:apply-templates 
27         select="*[not(self::listitem
28                   or self::title
29                   or self::titleabbrev)]
30                 |comment()[not(preceding-sibling::listitem)]
31                 |processing-instruction()[not(preceding-sibling::listitem)]"/>
32
33     <ul>
34       <xsl:call-template name="generate.class.attribute"/>
35       <xsl:if test="$css.decoration != 0">
36         <xsl:attribute name="type">
37           <xsl:call-template name="list.itemsymbol"/>
38         </xsl:attribute>
39       </xsl:if>
40
41       <xsl:if test="@spacing='compact'">
42         <xsl:attribute name="compact">
43           <xsl:value-of select="@spacing"/>
44         </xsl:attribute>
45       </xsl:if>
46       <xsl:apply-templates 
47             select="listitem
48                     |comment()[preceding-sibling::listitem]
49                     |processing-instruction()[preceding-sibling::listitem]"/>
50     </ul>
51   </div>
52 </xsl:template>
53
54 <xsl:template match="itemizedlist/title">
55   <!-- nop -->
56 </xsl:template>
57
58 <xsl:template match="itemizedlist/listitem">
59   <xsl:variable name="mark" select="../@mark"/>
60   <xsl:variable name="override" select="@override"/>
61
62   <xsl:variable name="usemark">
63     <xsl:choose>
64       <xsl:when test="$override != ''">
65         <xsl:value-of select="$override"/>
66       </xsl:when>
67       <xsl:otherwise>
68         <xsl:value-of select="$mark"/>
69       </xsl:otherwise>
70     </xsl:choose>
71   </xsl:variable>
72
73   <xsl:variable name="cssmark">
74     <xsl:choose>
75       <xsl:when test="$usemark = 'opencircle'">circle</xsl:when>
76       <xsl:when test="$usemark = 'bullet'">disc</xsl:when>
77       <xsl:when test="$usemark = 'box'">square</xsl:when>
78       <xsl:otherwise>
79         <xsl:value-of select="$usemark"/>
80       </xsl:otherwise>
81     </xsl:choose>
82   </xsl:variable>
83
84   <li>
85     <xsl:call-template name="common.html.attributes"/>
86     <xsl:if test="$css.decoration = '1' and $cssmark != ''">
87       <xsl:attribute name="style">
88         <xsl:text>list-style-type: </xsl:text>
89         <xsl:value-of select="$cssmark"/>
90       </xsl:attribute>
91     </xsl:if>
92
93     <!-- we can't just drop the anchor in since some browsers (Opera)
94          get confused about line breaks if we do. So if the first child
95          is a para, assume the para will put in the anchor. Otherwise,
96          put the anchor in anyway. -->
97     <xsl:if test="local-name(child::*[1]) != 'para'">
98       <xsl:call-template name="anchor"/>
99     </xsl:if>
100
101     <xsl:choose>
102       <xsl:when test="$show.revisionflag != 0 and @revisionflag">
103         <div class="{@revisionflag}">
104           <xsl:apply-templates/>
105         </div>
106       </xsl:when>
107       <xsl:otherwise>
108         <xsl:apply-templates/>
109       </xsl:otherwise>
110     </xsl:choose>
111   </li>
112 </xsl:template>
113
114 <xsl:template match="orderedlist">
115   <xsl:variable name="start">
116     <xsl:call-template name="orderedlist-starting-number"/>
117   </xsl:variable>
118
119   <xsl:variable name="numeration">
120     <xsl:call-template name="list.numeration"/>
121   </xsl:variable>
122
123   <xsl:variable name="type">
124     <xsl:choose>
125       <xsl:when test="$numeration='arabic'">1</xsl:when>
126       <xsl:when test="$numeration='loweralpha'">a</xsl:when>
127       <xsl:when test="$numeration='lowerroman'">i</xsl:when>
128       <xsl:when test="$numeration='upperalpha'">A</xsl:when>
129       <xsl:when test="$numeration='upperroman'">I</xsl:when>
130       <!-- What!? This should never happen -->
131       <xsl:otherwise>
132         <xsl:message>
133           <xsl:text>Unexpected numeration: </xsl:text>
134           <xsl:value-of select="$numeration"/>
135         </xsl:message>
136         <xsl:value-of select="1"/>
137       </xsl:otherwise>
138     </xsl:choose>
139   </xsl:variable>
140
141   <div>
142     <xsl:call-template name="common.html.attributes"/>
143     <xsl:call-template name="anchor"/>
144
145     <xsl:if test="title">
146       <xsl:call-template name="formal.object.heading"/>
147     </xsl:if>
148
149     <!-- Preserve order of PIs and comments -->
150     <xsl:apply-templates 
151         select="*[not(self::listitem
152                   or self::title
153                   or self::titleabbrev)]
154                 |comment()[not(preceding-sibling::listitem)]
155                 |processing-instruction()[not(preceding-sibling::listitem)]"/>
156
157     <xsl:choose>
158       <xsl:when test="@inheritnum='inherit' and ancestor::listitem[parent::orderedlist]">
159         <table border="0">
160           <xsl:call-template name="generate.class.attribute"/>
161           <col align="{$direction.align.start}" valign="top"/>
162           <tbody>
163             <xsl:apply-templates 
164                 mode="orderedlist-table"
165                 select="listitem
166                         |comment()[preceding-sibling::listitem]
167                         |processing-instruction()[preceding-sibling::listitem]"/>
168           </tbody>
169         </table>
170       </xsl:when>
171       <xsl:otherwise>
172         <ol>
173           <xsl:call-template name="generate.class.attribute"/>
174           <xsl:if test="$start != '1'">
175             <xsl:attribute name="start">
176               <xsl:value-of select="$start"/>
177             </xsl:attribute>
178           </xsl:if>
179           <xsl:if test="$numeration != ''">
180             <xsl:attribute name="type">
181               <xsl:value-of select="$type"/>
182             </xsl:attribute>
183           </xsl:if>
184           <xsl:if test="@spacing='compact'">
185             <xsl:attribute name="compact">
186               <xsl:value-of select="@spacing"/>
187             </xsl:attribute>
188           </xsl:if>
189           <xsl:apply-templates 
190                 select="listitem
191                         |comment()[preceding-sibling::listitem]
192                         |processing-instruction()[preceding-sibling::listitem]"/>
193         </ol>
194       </xsl:otherwise>
195     </xsl:choose>
196   </div>
197 </xsl:template>
198
199 <xsl:template match="orderedlist/title">
200   <!-- nop -->
201 </xsl:template>
202
203 <xsl:template match="orderedlist/listitem">
204   <li>
205     <xsl:call-template name="common.html.attributes"/>
206     <xsl:if test="@override">
207       <xsl:attribute name="value">
208         <xsl:value-of select="@override"/>
209       </xsl:attribute>
210     </xsl:if>
211
212     <!-- we can't just drop the anchor in since some browsers (Opera)
213          get confused about line breaks if we do. So if the first child
214          is a para, assume the para will put in the anchor. Otherwise,
215          put the anchor in anyway. -->
216     <xsl:if test="local-name(child::*[1]) != 'para'">
217       <xsl:call-template name="anchor"/>
218     </xsl:if>
219
220     <xsl:choose>
221       <xsl:when test="$show.revisionflag != 0 and @revisionflag">
222         <div class="{@revisionflag}">
223           <xsl:apply-templates/>
224         </div>
225       </xsl:when>
226       <xsl:otherwise>
227         <xsl:apply-templates/>
228       </xsl:otherwise>
229     </xsl:choose>
230   </li>
231 </xsl:template>
232
233 <xsl:template match="orderedlist/listitem" mode="orderedlist-table">
234   <tr>
235     <td>
236       <xsl:apply-templates select="." mode="item-number"/>
237     </td>
238     <td>
239       <xsl:if test="local-name(child::*[1]) != 'para'">
240         <xsl:call-template name="anchor"/>
241       </xsl:if>
242
243       <xsl:choose>
244         <xsl:when test="$show.revisionflag != 0 and @revisionflag">
245           <div class="{@revisionflag}">
246             <xsl:apply-templates/>
247           </div>
248         </xsl:when>
249         <xsl:otherwise>
250           <xsl:apply-templates/>
251         </xsl:otherwise>
252       </xsl:choose>
253     </td>
254   </tr>
255 </xsl:template>
256
257 <xsl:template match="variablelist">
258   <xsl:variable name="pi-presentation">
259     <xsl:call-template name="pi.dbhtml_list-presentation"/>
260   </xsl:variable>
261
262   <xsl:variable name="presentation">
263     <xsl:choose>
264       <xsl:when test="$pi-presentation != ''">
265         <xsl:value-of select="$pi-presentation"/>
266       </xsl:when>
267       <xsl:when test="$variablelist.as.table != 0">
268         <xsl:value-of select="'table'"/>
269       </xsl:when>
270       <xsl:otherwise>
271         <xsl:value-of select="'list'"/>
272       </xsl:otherwise>
273     </xsl:choose>
274   </xsl:variable>
275
276   <xsl:variable name="list-width">
277     <xsl:call-template name="pi.dbhtml_list-width"/>
278   </xsl:variable>
279
280   <xsl:variable name="term-width">
281     <xsl:call-template name="pi.dbhtml_term-width"/>
282   </xsl:variable>
283
284   <xsl:variable name="table-summary">
285     <xsl:call-template name="pi.dbhtml_table-summary"/>
286   </xsl:variable>
287
288   <div>
289     <xsl:call-template name="common.html.attributes"/>
290     <xsl:call-template name="anchor"/>
291     <xsl:if test="title">
292       <xsl:call-template name="formal.object.heading"/>
293     </xsl:if>
294
295     <xsl:choose>
296       <xsl:when test="$presentation = 'table'">
297         <!-- Preserve order of PIs and comments -->
298         <xsl:apply-templates 
299           select="*[not(self::varlistentry
300                     or self::title
301                     or self::titleabbrev)]
302                   |comment()[not(preceding-sibling::varlistentry)]
303                   |processing-instruction()[not(preceding-sibling::varlistentry)]"/>
304         <table border="0">
305           <xsl:if test="$list-width != ''">
306             <xsl:attribute name="width">
307               <xsl:value-of select="$list-width"/>
308             </xsl:attribute>
309           </xsl:if>
310           <xsl:if test="$table-summary != ''">
311             <xsl:attribute name="summary">
312               <xsl:value-of select="$table-summary"/>
313             </xsl:attribute>
314           </xsl:if>
315           <col align="{$direction.align.start}" valign="top">
316             <xsl:if test="$term-width != ''">
317               <xsl:attribute name="width">
318                 <xsl:value-of select="$term-width"/>
319               </xsl:attribute>
320             </xsl:if>
321           </col>
322           <tbody>
323             <xsl:apply-templates mode="varlist-table"
324               select="varlistentry
325                       |comment()[preceding-sibling::varlistentry]
326                       |processing-instruction()[preceding-sibling::varlistentry]"/>
327           </tbody>
328         </table>
329       </xsl:when>
330       <xsl:otherwise>
331         <!-- Preserve order of PIs and comments -->
332         <xsl:apply-templates 
333           select="*[not(self::varlistentry
334                     or self::title
335                     or self::titleabbrev)]
336                   |comment()[not(preceding-sibling::varlistentry)]
337                   |processing-instruction()[not(preceding-sibling::varlistentry)]"/>
338         <dl>
339           <xsl:apply-templates 
340               select="varlistentry
341                       |comment()[preceding-sibling::varlistentry]
342                       |processing-instruction()[preceding-sibling::varlistentry]"/>
343         </dl>
344       </xsl:otherwise>
345     </xsl:choose>
346   </div>
347 </xsl:template>
348
349 <xsl:template match="variablelist/title">
350   <!-- nop -->
351 </xsl:template>
352
353 <xsl:template match="itemizedlist/titleabbrev|orderedlist/titleabbrev">
354   <!--nop-->
355 </xsl:template>
356
357 <xsl:template match="variablelist/titleabbrev">
358   <!--nop-->
359 </xsl:template>
360
361 <xsl:template match="listitem" mode="xref">
362   <xsl:number format="1"/>
363 </xsl:template>
364
365 <xsl:template match="listitem/simpara" priority="2">
366   <!-- If a listitem contains only a single simpara, don't output
367        the <p> wrapper; this has the effect of creating an li
368        with simple text content. -->
369   <xsl:choose>
370     <xsl:when test="not(preceding-sibling::*)
371                     and not (following-sibling::*)">
372       <xsl:call-template name="anchor"/>
373       <xsl:apply-templates/>
374     </xsl:when>
375     <xsl:otherwise>
376       <p>
377         <xsl:choose>
378           <xsl:when test="@role and $para.propagates.style != 0">
379             <xsl:call-template name="common.html.attributes">
380               <xsl:with-param name="class" select="@role"/>
381             </xsl:call-template>
382           </xsl:when>
383           <xsl:otherwise>
384             <xsl:call-template name="common.html.attributes"/>
385           </xsl:otherwise>
386         </xsl:choose>
387
388         <xsl:call-template name="anchor"/>
389         <xsl:apply-templates/>
390       </p>
391     </xsl:otherwise>
392   </xsl:choose>
393 </xsl:template>
394
395 <xsl:template match="varlistentry">
396   <dt>
397     <xsl:call-template name="anchor"/>
398     <xsl:apply-templates select="term"/>
399   </dt>
400   <dd>
401     <xsl:apply-templates select="listitem"/>
402   </dd>
403 </xsl:template>
404
405 <xsl:template match="varlistentry" mode="varlist-table">
406   <xsl:variable name="presentation">
407     <xsl:call-template name="pi.dbhtml_term-presentation">
408       <xsl:with-param name="node" select=".."/>
409     </xsl:call-template>
410   </xsl:variable>
411
412   <xsl:variable name="separator">
413     <xsl:call-template name="pi.dbhtml_term-separator">
414       <xsl:with-param name="node" select=".."/>
415     </xsl:call-template>
416   </xsl:variable>
417   <tr>
418     <xsl:call-template name="tr.attributes">
419       <xsl:with-param name="rownum">
420         <xsl:number from="variablelist" count="varlistentry"/>
421       </xsl:with-param>
422     </xsl:call-template>
423
424     <td>
425       <p>
426       <xsl:call-template name="anchor"/>
427       <xsl:choose>
428         <xsl:when test="$presentation = 'bold'">
429           <strong>
430             <xsl:apply-templates select="term"/>
431             <xsl:value-of select="$separator"/>
432           </strong>
433         </xsl:when>
434         <xsl:when test="$presentation = 'italic'">
435           <em>
436             <xsl:apply-templates select="term"/>
437             <xsl:value-of select="$separator"/>
438           </em>
439         </xsl:when>
440         <xsl:when test="$presentation = 'bold-italic'">
441           <strong>
442             <em>
443               <xsl:apply-templates select="term"/>
444               <xsl:value-of select="$separator"/>
445             </em>
446           </strong>
447         </xsl:when>
448         <xsl:otherwise>
449           <xsl:apply-templates select="term"/>
450           <xsl:value-of select="$separator"/>
451         </xsl:otherwise>
452       </xsl:choose>
453       </p>
454     </td>
455     <td>
456       <xsl:apply-templates select="listitem"/>
457     </td>
458   </tr>
459 </xsl:template>
460
461 <xsl:template match="varlistentry/term">
462   <span>
463     <xsl:call-template name="common.html.attributes"/>
464     <xsl:call-template name="anchor"/>
465     <xsl:call-template name="simple.xlink">
466       <xsl:with-param name="content">
467         <xsl:apply-templates/>
468       </xsl:with-param>
469     </xsl:call-template>
470     <xsl:choose>
471       <xsl:when test="position() = last()"/> <!-- do nothing -->
472       <xsl:otherwise>
473         <!-- * if we have multiple terms in the same varlistentry, generate -->
474         <!-- * a separator (", " by default) and/or an additional line -->
475         <!-- * break after each one except the last -->
476         <xsl:value-of select="$variablelist.term.separator"/>
477         <xsl:if test="not($variablelist.term.break.after = '0')">
478           <br/>
479         </xsl:if>
480       </xsl:otherwise>
481     </xsl:choose>
482   </span>
483 </xsl:template>
484
485 <xsl:template match="varlistentry/listitem">
486   <!-- we can't just drop the anchor in since some browsers (Opera)
487        get confused about line breaks if we do. So if the first child
488        is a para, assume the para will put in the anchor. Otherwise,
489        put the anchor in anyway. -->
490   <xsl:if test="local-name(child::*[1]) != 'para'">
491     <xsl:call-template name="anchor"/>
492   </xsl:if>
493
494   <xsl:choose>
495     <xsl:when test="$show.revisionflag != 0 and @revisionflag">
496       <div class="{@revisionflag}">
497         <xsl:apply-templates/>
498       </div>
499     </xsl:when>
500     <xsl:otherwise>
501       <xsl:apply-templates/>
502     </xsl:otherwise>
503   </xsl:choose>
504 </xsl:template>
505
506 <!-- ==================================================================== -->
507
508 <xsl:template match="simplelist">
509   <!-- with no type specified, the default is 'vert' -->
510   <xsl:call-template name="anchor"/>
511   <table border="0" summary="Simple list">
512     <xsl:call-template name="common.html.attributes"/>
513     <xsl:call-template name="simplelist.vert">
514       <xsl:with-param name="cols">
515         <xsl:choose>
516           <xsl:when test="@columns">
517             <xsl:value-of select="@columns"/>
518           </xsl:when>
519           <xsl:otherwise>1</xsl:otherwise>
520         </xsl:choose>
521       </xsl:with-param>
522     </xsl:call-template>
523   </table>
524 </xsl:template>
525
526 <xsl:template match="simplelist[@type='inline']">
527   <span>
528     <xsl:call-template name="common.html.attributes"/>
529     <!-- if dbchoice PI exists, use that to determine the choice separator -->
530     <!-- (that is, equivalent of "and" or "or" in current locale), or literal -->
531     <!-- value of "choice" otherwise -->
532     <xsl:variable name="localized-choice-separator">
533       <xsl:choose>
534         <xsl:when test="processing-instruction('dbchoice')">
535           <xsl:call-template name="select.choice.separator"/>
536         </xsl:when>
537         <xsl:otherwise>
538           <!-- empty -->
539         </xsl:otherwise>
540       </xsl:choose>
541     </xsl:variable>
542   
543     <xsl:for-each select="member">
544       <xsl:call-template name="simple.xlink">
545         <xsl:with-param name="content">
546           <xsl:apply-templates/>
547         </xsl:with-param>
548       </xsl:call-template>
549       <xsl:choose>
550         <xsl:when test="position() = last()"/> <!-- do nothing -->
551         <xsl:otherwise>
552           <xsl:text>, </xsl:text>
553           <xsl:if test="position() = last() - 1">
554             <xsl:if test="$localized-choice-separator != ''">
555               <xsl:value-of select="$localized-choice-separator"/>
556               <xsl:text> </xsl:text>
557             </xsl:if>
558           </xsl:if>
559         </xsl:otherwise>
560       </xsl:choose>
561     </xsl:for-each>
562   </span>
563 </xsl:template>
564
565 <xsl:template match="simplelist[@type='horiz']">
566   <xsl:call-template name="anchor"/>
567   <table border="0" summary="Simple list">
568     <xsl:call-template name="common.html.attributes"/>
569     <xsl:call-template name="simplelist.horiz">
570       <xsl:with-param name="cols">
571         <xsl:choose>
572           <xsl:when test="@columns">
573             <xsl:value-of select="@columns"/>
574           </xsl:when>
575           <xsl:otherwise>1</xsl:otherwise>
576         </xsl:choose>
577       </xsl:with-param>
578     </xsl:call-template>
579   </table>
580 </xsl:template>
581
582 <xsl:template match="simplelist[@type='vert']">
583   <xsl:call-template name="anchor"/>
584   <table border="0" summary="Simple list">
585     <xsl:call-template name="common.html.attributes"/>
586     <xsl:call-template name="simplelist.vert">
587       <xsl:with-param name="cols">
588         <xsl:choose>
589           <xsl:when test="@columns">
590             <xsl:value-of select="@columns"/>
591           </xsl:when>
592           <xsl:otherwise>1</xsl:otherwise>
593         </xsl:choose>
594       </xsl:with-param>
595     </xsl:call-template>
596   </table>
597 </xsl:template>
598
599 <xsl:template name="simplelist.horiz">
600   <xsl:param name="cols">1</xsl:param>
601   <xsl:param name="cell">1</xsl:param>
602   <xsl:param name="members" select="./member"/>
603
604   <xsl:if test="$cell &lt;= count($members)">
605     <tr>
606       <xsl:call-template name="tr.attributes">
607         <xsl:with-param name="row" select="$members[1]"/>
608         <xsl:with-param name="rownum" select="(($cell - 1) div $cols) + 1"/>
609       </xsl:call-template>
610
611       <xsl:call-template name="simplelist.horiz.row">
612         <xsl:with-param name="cols" select="$cols"/>
613         <xsl:with-param name="cell" select="$cell"/>
614         <xsl:with-param name="members" select="$members"/>
615       </xsl:call-template>
616    </tr>
617     <xsl:call-template name="simplelist.horiz">
618       <xsl:with-param name="cols" select="$cols"/>
619       <xsl:with-param name="cell" select="$cell + $cols"/>
620       <xsl:with-param name="members" select="$members"/>
621     </xsl:call-template>
622   </xsl:if>
623 </xsl:template>
624
625 <xsl:template name="simplelist.horiz.row">
626   <xsl:param name="cols">1</xsl:param>
627   <xsl:param name="cell">1</xsl:param>
628   <xsl:param name="members" select="./member"/>
629   <xsl:param name="curcol">1</xsl:param>
630
631   <xsl:if test="$curcol &lt;= $cols">
632     <td>
633       <xsl:choose>
634         <xsl:when test="$members[position()=$cell]">
635           <xsl:apply-templates select="$members[position()=$cell]"/>
636         </xsl:when>
637         <xsl:otherwise>
638           <xsl:text>&#160;</xsl:text>
639         </xsl:otherwise>
640       </xsl:choose>
641     </td>
642     <xsl:call-template name="simplelist.horiz.row">
643       <xsl:with-param name="cols" select="$cols"/>
644       <xsl:with-param name="cell" select="$cell+1"/>
645       <xsl:with-param name="members" select="$members"/>
646       <xsl:with-param name="curcol" select="$curcol+1"/>
647     </xsl:call-template>
648   </xsl:if>
649 </xsl:template>
650
651 <xsl:template name="simplelist.vert">
652   <xsl:param name="cols">1</xsl:param>
653   <xsl:param name="cell">1</xsl:param>
654   <xsl:param name="members" select="./member"/>
655   <xsl:param name="rows"
656              select="floor((count($members)+$cols - 1) div $cols)"/>
657
658   <xsl:if test="$cell &lt;= $rows">
659     <tr>
660       <xsl:call-template name="tr.attributes">
661         <xsl:with-param name="row" select="$members[1]"/>
662         <xsl:with-param name="rownum" select="$cell"/>
663       </xsl:call-template>
664
665       <xsl:call-template name="simplelist.vert.row">
666         <xsl:with-param name="cols" select="$cols"/>
667         <xsl:with-param name="rows" select="$rows"/>
668         <xsl:with-param name="cell" select="$cell"/>
669         <xsl:with-param name="members" select="$members"/>
670       </xsl:call-template>
671     </tr>
672     <xsl:call-template name="simplelist.vert">
673       <xsl:with-param name="cols" select="$cols"/>
674       <xsl:with-param name="cell" select="$cell+1"/>
675       <xsl:with-param name="members" select="$members"/>
676       <xsl:with-param name="rows" select="$rows"/>
677     </xsl:call-template>
678   </xsl:if>
679 </xsl:template>
680
681 <xsl:template name="simplelist.vert.row">
682   <xsl:param name="cols">1</xsl:param>
683   <xsl:param name="rows">1</xsl:param>
684   <xsl:param name="cell">1</xsl:param>
685   <xsl:param name="members" select="./member"/>
686   <xsl:param name="curcol">1</xsl:param>
687
688   <xsl:if test="$curcol &lt;= $cols">
689     <td>
690       <xsl:choose>
691         <xsl:when test="$members[position()=$cell]">
692           <xsl:apply-templates select="$members[position()=$cell]"/>
693         </xsl:when>
694         <xsl:otherwise>
695           <xsl:text>&#160;</xsl:text>
696         </xsl:otherwise>
697       </xsl:choose>
698     </td>
699     <xsl:call-template name="simplelist.vert.row">
700       <xsl:with-param name="cols" select="$cols"/>
701       <xsl:with-param name="rows" select="$rows"/>
702       <xsl:with-param name="cell" select="$cell+$rows"/>
703       <xsl:with-param name="members" select="$members"/>
704       <xsl:with-param name="curcol" select="$curcol+1"/>
705     </xsl:call-template>
706   </xsl:if>
707 </xsl:template>
708
709 <xsl:template match="member">
710   <xsl:call-template name="anchor"/>
711   <xsl:call-template name="simple.xlink">
712     <xsl:with-param name="content">
713       <xsl:apply-templates/>
714     </xsl:with-param>
715   </xsl:call-template>
716 </xsl:template>
717
718 <!-- ==================================================================== -->
719
720 <xsl:template match="procedure">
721   <xsl:variable name="param.placement"
722                 select="substring-after(normalize-space($formal.title.placement),
723                                         concat(local-name(.), ' '))"/>
724
725   <xsl:variable name="placement">
726     <xsl:choose>
727       <xsl:when test="contains($param.placement, ' ')">
728         <xsl:value-of select="substring-before($param.placement, ' ')"/>
729       </xsl:when>
730       <xsl:when test="$param.placement = ''">before</xsl:when>
731       <xsl:otherwise>
732         <xsl:value-of select="$param.placement"/>
733       </xsl:otherwise>
734     </xsl:choose>
735   </xsl:variable>
736
737   <!-- Preserve order of PIs and comments -->
738   <xsl:variable name="preamble"
739         select="*[not(self::step
740                   or self::title
741                   or self::titleabbrev)]
742                 |comment()[not(preceding-sibling::step)]
743                 |processing-instruction()[not(preceding-sibling::step)]"/>
744
745   <div>
746     <xsl:call-template name="common.html.attributes"/>
747     <xsl:call-template name="anchor">
748       <xsl:with-param name="conditional">
749         <xsl:choose>
750           <xsl:when test="title">0</xsl:when>
751           <xsl:otherwise>1</xsl:otherwise>
752         </xsl:choose>
753       </xsl:with-param>
754     </xsl:call-template>
755
756     <xsl:if test="title and $placement = 'before'">
757       <xsl:call-template name="formal.object.heading"/>
758     </xsl:if>
759
760     <xsl:apply-templates select="$preamble"/>
761
762     <xsl:choose>
763       <xsl:when test="count(step) = 1">
764         <ul>
765           <xsl:call-template name="generate.class.attribute"/>
766           <xsl:apply-templates 
767             select="step
768                     |comment()[preceding-sibling::step]
769                     |processing-instruction()[preceding-sibling::step]"/>
770         </ul>
771       </xsl:when>
772       <xsl:otherwise>
773         <ol>
774           <xsl:call-template name="generate.class.attribute"/>
775           <xsl:attribute name="type">
776             <xsl:value-of select="substring($procedure.step.numeration.formats,1,1)"/>
777           </xsl:attribute>
778           <xsl:apply-templates 
779             select="step
780                     |comment()[preceding-sibling::step]
781                     |processing-instruction()[preceding-sibling::step]"/>
782         </ol>
783       </xsl:otherwise>
784     </xsl:choose>
785
786     <xsl:if test="title and $placement != 'before'">
787       <xsl:call-template name="formal.object.heading"/>
788     </xsl:if>
789   </div>
790 </xsl:template>
791
792 <xsl:template match="procedure/title">
793   <!-- nop -->
794 </xsl:template>
795
796 <xsl:template match="substeps">
797   <xsl:variable name="numeration">
798     <xsl:call-template name="procedure.step.numeration"/>
799   </xsl:variable>
800
801   <xsl:call-template name="anchor"/>
802
803   <ol type="{$numeration}">
804     <xsl:call-template name="common.html.attributes"/>
805     <xsl:apply-templates/>
806   </ol>
807 </xsl:template>
808
809 <xsl:template match="step">
810   <li>
811     <xsl:call-template name="common.html.attributes"/>
812     <xsl:call-template name="anchor"/>
813     <xsl:apply-templates/>
814   </li>
815 </xsl:template>
816
817 <xsl:template match="stepalternatives">
818   <xsl:call-template name="anchor"/>
819   <ul>
820     <xsl:call-template name="common.html.attributes"/>
821     <xsl:apply-templates/>
822   </ul>
823 </xsl:template>
824
825 <xsl:template match="step/title">
826   <p>
827     <xsl:call-template name="common.html.attributes"/>
828     <b>
829       <xsl:apply-templates/>
830     </b>
831   </p>
832 </xsl:template>
833
834 <!-- ==================================================================== -->
835
836 <xsl:template match="segmentedlist">
837   <xsl:variable name="presentation">
838     <xsl:call-template name="pi.dbhtml_list-presentation"/>
839   </xsl:variable>
840
841   <div>
842     <xsl:call-template name="common.html.attributes"/>
843     <xsl:call-template name="anchor"/>
844
845     <xsl:choose>
846       <xsl:when test="$presentation = 'table'">
847         <xsl:apply-templates select="." mode="seglist-table"/>
848       </xsl:when>
849       <xsl:when test="$presentation = 'list'">
850         <xsl:apply-templates/>
851       </xsl:when>
852       <xsl:when test="$segmentedlist.as.table != 0">
853         <xsl:apply-templates select="." mode="seglist-table"/>
854       </xsl:when>
855       <xsl:otherwise>
856         <xsl:apply-templates/>
857       </xsl:otherwise>
858     </xsl:choose>
859   </div>
860 </xsl:template>
861
862 <xsl:template match="segmentedlist/title">
863   <div>
864     <xsl:call-template name="common.html.attributes"/>
865     <strong>
866       <span>
867         <xsl:call-template name="generate.class.attribute"/>
868         <xsl:apply-templates/>
869       </span>
870     </strong>
871   </div>
872 </xsl:template>
873
874 <xsl:template match="segtitle">
875 </xsl:template>
876
877 <xsl:template match="segtitle" mode="segtitle-in-seg">
878   <xsl:apply-templates/>
879 </xsl:template>
880
881 <xsl:template match="seglistitem">
882   <div>
883     <xsl:call-template name="common.html.attributes"/>
884     <xsl:call-template name="anchor"/>
885     <xsl:apply-templates/>
886   </div>
887 </xsl:template>
888
889 <xsl:template match="seg">
890   <xsl:variable name="segnum" select="count(preceding-sibling::seg)+1"/>
891   <xsl:variable name="seglist" select="ancestor::segmentedlist"/>
892   <xsl:variable name="segtitles" select="$seglist/segtitle"/>
893
894   <!--
895      Note: segtitle is only going to be the right thing in a well formed
896      SegmentedList.  If there are too many Segs or too few SegTitles,
897      you'll get something odd...maybe an error
898   -->
899
900   <div>
901     <xsl:call-template name="common.html.attributes"/>
902     <strong>
903       <span class="segtitle">
904         <xsl:apply-templates select="$segtitles[$segnum=position()]"
905                              mode="segtitle-in-seg"/>
906         <xsl:text>: </xsl:text>
907       </span>
908     </strong>
909     <xsl:apply-templates/>
910   </div>
911 </xsl:template>
912
913 <xsl:template match="segmentedlist" mode="seglist-table">
914   <xsl:variable name="table-summary">
915     <xsl:call-template name="pi.dbhtml_table-summary"/>
916   </xsl:variable>
917
918   <xsl:variable name="list-width">
919     <xsl:call-template name="pi.dbhtml_list-width"/>
920   </xsl:variable>
921
922   <xsl:apply-templates select="title"/>
923
924   <table border="0">
925     <xsl:if test="$list-width != ''">
926       <xsl:attribute name="width">
927         <xsl:value-of select="$list-width"/>
928       </xsl:attribute>
929     </xsl:if>
930     <xsl:if test="$table-summary != ''">
931       <xsl:attribute name="summary">
932         <xsl:value-of select="$table-summary"/>
933       </xsl:attribute>
934     </xsl:if>
935     <thead>
936       <tr class="segtitle">
937         <xsl:call-template name="tr.attributes">
938           <xsl:with-param name="row" select="segtitle[1]"/>
939           <xsl:with-param name="rownum" select="1"/>
940         </xsl:call-template>
941         <xsl:apply-templates select="segtitle" mode="seglist-table"/>
942       </tr>
943     </thead>
944     <tbody>
945       <xsl:apply-templates select="seglistitem" mode="seglist-table"/>
946     </tbody>
947   </table>
948 </xsl:template>
949
950 <xsl:template match="segtitle" mode="seglist-table">
951   <th><xsl:apply-templates/></th>
952 </xsl:template>
953
954 <xsl:template match="seglistitem" mode="seglist-table">
955   <xsl:variable name="seglinum">
956     <xsl:number from="segmentedlist" count="seglistitem"/>
957   </xsl:variable>
958
959   <tr>
960     <xsl:call-template name="common.html.attributes"/>
961     <xsl:call-template name="tr.attributes">
962       <xsl:with-param name="rownum" select="$seglinum + 1"/>
963     </xsl:call-template>
964     <xsl:apply-templates mode="seglist-table"/>
965   </tr>
966 </xsl:template>
967
968 <xsl:template match="seg" mode="seglist-table">
969   <td>
970     <xsl:call-template name="common.html.attributes"/>
971     <xsl:apply-templates/>
972   </td>
973 </xsl:template>
974
975 <xsl:template match="seg[1]" mode="seglist-table">
976   <td>
977     <xsl:call-template name="common.html.attributes"/>
978     <xsl:call-template name="anchor">
979       <xsl:with-param name="node" select="ancestor::seglistitem"/>
980     </xsl:call-template>
981     <xsl:apply-templates/>
982   </td>
983 </xsl:template>
984
985 <!-- ==================================================================== -->
986
987 <xsl:template match="calloutlist">
988   <div>
989     <xsl:call-template name="common.html.attributes"/>
990     <xsl:call-template name="anchor"/>
991     <xsl:if test="title|info/title">
992       <xsl:call-template name="formal.object.heading"/>
993     </xsl:if>
994
995     <!-- Preserve order of PIs and comments -->
996     <xsl:apply-templates 
997          select="*[not(self::callout or self::title or self::titleabbrev)]
998                    |comment()[not(preceding-sibling::callout)]
999                    |processing-instruction()[not(preceding-sibling::callout)]"/>
1000
1001     <xsl:choose>
1002       <xsl:when test="$callout.list.table != 0">
1003         <table border="0" summary="Callout list">
1004           <xsl:apply-templates select="callout
1005                                 |comment()[preceding-sibling::callout]
1006                                 |processing-instruction()[preceding-sibling::callout]"/>
1007         </table>
1008       </xsl:when>
1009       <xsl:otherwise>
1010         <dl compact="compact">
1011           <xsl:apply-templates select="callout
1012                                 |comment()[preceding-sibling::callout]
1013                                 |processing-instruction()[preceding-sibling::callout]"/>
1014         </dl>
1015       </xsl:otherwise>
1016     </xsl:choose>
1017   </div>
1018 </xsl:template>
1019
1020 <xsl:template match="calloutlist/title">
1021 </xsl:template>
1022
1023 <xsl:template match="callout">
1024   <xsl:choose>
1025     <xsl:when test="$callout.list.table != 0">
1026       <tr>
1027         <xsl:call-template name="tr.attributes">
1028           <xsl:with-param name="rownum">
1029             <xsl:number from="calloutlist" count="callout"/>
1030           </xsl:with-param>
1031         </xsl:call-template>
1032
1033         <td width="5%" valign="top" align="{$direction.align.start}">
1034           <p>
1035             <xsl:call-template name="anchor"/>
1036             <xsl:call-template name="callout.arearefs">
1037               <xsl:with-param name="arearefs" select="@arearefs"/>
1038             </xsl:call-template>
1039           </p>
1040         </td>
1041         <td valign="top" align="{$direction.align.start}">
1042           <xsl:apply-templates/>
1043         </td>
1044       </tr>
1045     </xsl:when>
1046     <xsl:otherwise>
1047       <dt>
1048         <xsl:call-template name="anchor"/>
1049         <xsl:call-template name="callout.arearefs">
1050           <xsl:with-param name="arearefs" select="@arearefs"/>
1051         </xsl:call-template>
1052       </dt>
1053       <dd><xsl:apply-templates/></dd>
1054     </xsl:otherwise>
1055   </xsl:choose>
1056 </xsl:template>
1057
1058 <xsl:template match="callout/simpara" priority="2">
1059   <!-- If a callout contains only a single simpara, don't output
1060        the <p> wrapper; this has the effect of creating an li
1061        with simple text content. -->
1062   <xsl:choose>
1063     <xsl:when test="not(preceding-sibling::*)
1064                     and not (following-sibling::*)">
1065       <xsl:call-template name="anchor"/>
1066       <xsl:apply-templates/>
1067     </xsl:when>
1068     <xsl:otherwise>
1069       <p>
1070         <xsl:if test="@role and $para.propagates.style != 0">
1071           <xsl:choose>
1072             <xsl:when test="@role and $para.propagates.style != 0">
1073               <xsl:call-template name="common.html.attributes">
1074                 <xsl:with-param name="class" select="@role"/>
1075               </xsl:call-template>
1076             </xsl:when>
1077             <xsl:otherwise>
1078               <xsl:call-template name="common.html.attributes"/>
1079             </xsl:otherwise>
1080           </xsl:choose>
1081         </xsl:if>
1082
1083         <xsl:call-template name="anchor"/>
1084         <xsl:apply-templates/>
1085       </p>
1086     </xsl:otherwise>
1087   </xsl:choose>
1088 </xsl:template>
1089
1090 <xsl:template name="callout.arearefs">
1091   <xsl:param name="arearefs"></xsl:param>
1092   <xsl:if test="$arearefs!=''">
1093     <xsl:choose>
1094       <xsl:when test="substring-before($arearefs,' ')=''">
1095         <xsl:call-template name="callout.arearef">
1096           <xsl:with-param name="arearef" select="$arearefs"/>
1097         </xsl:call-template>
1098       </xsl:when>
1099       <xsl:otherwise>
1100         <xsl:call-template name="callout.arearef">
1101           <xsl:with-param name="arearef"
1102                           select="substring-before($arearefs,' ')"/>
1103         </xsl:call-template>
1104       </xsl:otherwise>
1105     </xsl:choose>
1106     <xsl:call-template name="callout.arearefs">
1107       <xsl:with-param name="arearefs"
1108                       select="substring-after($arearefs,' ')"/>
1109     </xsl:call-template>
1110   </xsl:if>
1111 </xsl:template>
1112
1113 <xsl:template name="callout.arearef">
1114   <xsl:param name="arearef"></xsl:param>
1115   <xsl:variable name="targets" select="key('id',$arearef)"/>
1116   <xsl:variable name="target" select="$targets[1]"/>
1117
1118   <xsl:call-template name="check.id.unique">
1119     <xsl:with-param name="linkend" select="$arearef"/>
1120   </xsl:call-template>
1121
1122   <xsl:choose>
1123     <xsl:when test="count($target)=0">
1124       <xsl:text>???</xsl:text>
1125     </xsl:when>
1126     <xsl:when test="local-name($target)='co'">
1127       <a>
1128         <xsl:attribute name="href">
1129           <xsl:text>#</xsl:text>
1130           <xsl:value-of select="$arearef"/>
1131         </xsl:attribute>
1132         <xsl:apply-templates select="$target" mode="callout-bug"/>
1133       </a>
1134       <xsl:text> </xsl:text>
1135     </xsl:when>
1136     <xsl:when test="local-name($target)='areaset'">
1137       <xsl:call-template name="callout-bug">
1138         <xsl:with-param name="conum">
1139           <xsl:apply-templates select="$target" mode="conumber"/>
1140         </xsl:with-param>
1141       </xsl:call-template>
1142     </xsl:when>
1143     <xsl:when test="local-name($target)='area'">
1144       <xsl:choose>
1145         <xsl:when test="$target/parent::areaset">
1146           <xsl:call-template name="callout-bug">
1147             <xsl:with-param name="conum">
1148               <xsl:apply-templates select="$target/parent::areaset"
1149                                    mode="conumber"/>
1150             </xsl:with-param>
1151           </xsl:call-template>
1152         </xsl:when>
1153         <xsl:otherwise>
1154           <xsl:call-template name="callout-bug">
1155             <xsl:with-param name="conum">
1156               <xsl:apply-templates select="$target" mode="conumber"/>
1157             </xsl:with-param>
1158           </xsl:call-template>
1159         </xsl:otherwise>
1160       </xsl:choose>
1161     </xsl:when>
1162     <xsl:otherwise>
1163       <xsl:text>???</xsl:text>
1164     </xsl:otherwise>
1165   </xsl:choose>
1166 </xsl:template>
1167
1168 <!-- ==================================================================== -->
1169
1170 <xsl:template name="orderedlist-starting-number">
1171   <xsl:param name="list" select="."/>
1172   <xsl:variable name="pi-start">
1173     <xsl:call-template name="pi.dbhtml_start">
1174       <xsl:with-param name="node" select="$list"/>
1175     </xsl:call-template>
1176   </xsl:variable>
1177   <xsl:call-template name="output-orderedlist-starting-number">
1178     <xsl:with-param name="list" select="$list"/>
1179     <xsl:with-param name="pi-start" select="$pi-start"/>
1180   </xsl:call-template>
1181 </xsl:template>
1182
1183 </xsl:stylesheet>