source: clfs-embedded/BOOK/stylesheets/lfs-xsl/docbook-xsl-snapshot/common/common.xsl @ 9882b55

Last change on this file since 9882b55 was 9882b55, checked in by Manuel Canales Esparcia <manuel@…>, 17 years ago

Added the new lfs-xsl stylesheets.

  • Property mode set to 100644
File size: 71.2 KB
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:dyn="http://exslt.org/dynamic"
5                xmlns:saxon="http://icl.com/saxon"
6                exclude-result-prefixes="doc dyn saxon"
7                version='1.0'>
8
9<!-- ********************************************************************
10     $Id$
11     ********************************************************************
12
13     This file is part of the XSL DocBook Stylesheet distribution.
14     See ../README or http://docbook.sf.net/release/xsl/current/ for
15     copyright and other information.
16
17     This file contains general templates common to both the HTML and FO
18     versions of the DocBook stylesheets.
19     ******************************************************************** -->
20
21<doc:reference xmlns="">
22<referenceinfo>
23<releaseinfo role="meta">
24$Id$
25</releaseinfo>
26<author><surname>Walsh</surname>
27<firstname>Norman</firstname></author>
28<copyright><year>1999-2007</year>
29<holder>Norman Walsh</holder>
30</copyright>
31</referenceinfo>
32<title>Common Template Reference</title>
33
34<partintro id="partintro">
35<title>Introduction</title>
36
37<para>This is technical reference documentation for the “common”
38templates in the DocBook XSL Stylesheets. The common templates are
39“common” because they are shared across output formats (that is,
40they’re not output-format-dependent).</para>
41
42<para>This documentation is not intended to be <quote>user</quote>
43documentation.  It is provided for developers writing
44customization layers for the stylesheets, and for anyone who's
45interested in <quote>how it works</quote>.</para>
46
47</partintro>
48
49</doc:reference>
50
51<!-- ==================================================================== -->
52<!-- Establish strip/preserve whitespace rules -->
53
54<xsl:preserve-space elements="*"/>
55
56<xsl:strip-space elements="
57abstract affiliation anchor answer appendix area areaset areaspec
58artheader article audiodata audioobject author authorblurb authorgroup
59beginpage bibliodiv biblioentry bibliography biblioset blockquote book
60bookbiblio bookinfo callout calloutlist caption caution chapter
61citerefentry cmdsynopsis co collab colophon colspec confgroup
62copyright dedication docinfo editor entrytbl epigraph equation
63example figure footnote footnoteref formalpara funcprototype
64funcsynopsis glossary glossdef glossdiv glossentry glosslist graphicco
65group highlights imagedata imageobject imageobjectco important index
66indexdiv indexentry indexterm info informalequation informalexample
67informalfigure informaltable inlineequation inlinemediaobject
68itemizedlist itermset keycombo keywordset legalnotice listitem lot
69mediaobject mediaobjectco menuchoice msg msgentry msgexplan msginfo
70msgmain msgrel msgset msgsub msgtext note objectinfo
71orderedlist othercredit part partintro preface printhistory procedure
72programlistingco publisher qandadiv qandaentry qandaset question
73refentry reference refmeta refnamediv refsection refsect1 refsect1info refsect2
74refsect2info refsect3 refsect3info refsynopsisdiv refsynopsisdivinfo
75revhistory revision row sbr screenco screenshot sect1 sect1info sect2
76sect2info sect3 sect3info sect4 sect4info sect5 sect5info section
77sectioninfo seglistitem segmentedlist seriesinfo set setindex setinfo
78shortcut sidebar simplelist simplesect spanspec step subject
79subjectset substeps synopfragment table tbody textobject tfoot tgroup
80thead tip toc tocchap toclevel1 toclevel2 toclevel3 toclevel4
81toclevel5 tocpart varargs variablelist varlistentry videodata
82videoobject void warning subjectset
83
84classsynopsis
85constructorsynopsis
86destructorsynopsis
87fieldsynopsis
88methodparam
89methodsynopsis
90ooclass
91ooexception
92oointerface
93simplemsgentry
94manvolnum
95"/>
96<!-- ====================================================================== -->
97
98<doc:template name="is.component" xmlns="">
99<refpurpose>Tests if a given node is a component-level element</refpurpose>
100
101<refdescription id="is.component-desc">
102<para>This template returns '1' if the specified node is a component
103(Chapter, Appendix, etc.), and '0' otherwise.</para>
104</refdescription>
105
106<refparameter id="is.component-params">
107<variablelist>
108<varlistentry><term>node</term>
109<listitem>
110<para>The node which is to be tested.</para>
111</listitem>
112</varlistentry>
113</variablelist>
114</refparameter>
115
116<refreturn id="is.component-returns">
117<para>This template returns '1' if the specified node is a component
118(Chapter, Appendix, etc.), and '0' otherwise.</para>
119</refreturn>
120</doc:template>
121
122<xsl:template name="is.component">
123  <xsl:param name="node" select="."/>
124  <xsl:choose>
125    <xsl:when test="local-name($node) = 'appendix'
126                    or local-name($node) = 'article'
127                    or local-name($node) = 'chapter'
128                    or local-name($node) = 'preface'
129                    or local-name($node) = 'bibliography'
130                    or local-name($node) = 'glossary'
131                    or local-name($node) = 'index'">1</xsl:when>
132    <xsl:otherwise>0</xsl:otherwise>
133  </xsl:choose>
134</xsl:template>
135
136<!-- ====================================================================== -->
137
138<doc:template name="is.section" xmlns="">
139<refpurpose>Tests if a given node is a section-level element</refpurpose>
140
141<refdescription id="is.section-desc">
142<para>This template returns '1' if the specified node is a section
143(Section, Sect1, Sect2, etc.), and '0' otherwise.</para>
144</refdescription>
145
146<refparameter id="is.section-params">
147<variablelist>
148<varlistentry><term>node</term>
149<listitem>
150<para>The node which is to be tested.</para>
151</listitem>
152</varlistentry>
153</variablelist>
154</refparameter>
155
156<refreturn id="is.section-returns">
157<para>This template returns '1' if the specified node is a section
158(Section, Sect1, Sect2, etc.), and '0' otherwise.</para>
159</refreturn>
160</doc:template>
161
162<xsl:template name="is.section">
163  <xsl:param name="node" select="."/>
164  <xsl:choose>
165    <xsl:when test="local-name($node) = 'section'
166                    or local-name($node) = 'sect1'
167                    or local-name($node) = 'sect2'
168                    or local-name($node) = 'sect3'
169                    or local-name($node) = 'sect4'
170                    or local-name($node) = 'sect5'
171                    or local-name($node) = 'refsect1'
172                    or local-name($node) = 'refsect2'
173                    or local-name($node) = 'refsect3'
174                    or local-name($node) = 'simplesect'">1</xsl:when>
175    <xsl:otherwise>0</xsl:otherwise>
176  </xsl:choose>
177</xsl:template>
178
179<!-- ====================================================================== -->
180
181<doc:template name="section.level" xmlns="">
182<refpurpose>Returns the hierarchical level of a section</refpurpose>
183
184<refdescription id="section.level-desc">
185<para>This template calculates the hierarchical level of a section.
186The element <sgmltag>sect1</sgmltag> is at level 1, <sgmltag>sect2</sgmltag> is
187at level 2, etc.</para>
188
189<para>Recursive sections are calculated down to the fifth level.</para>
190</refdescription>
191
192<refparameter id="section.level-params">
193<variablelist>
194<varlistentry><term>node</term>
195<listitem>
196<para>The section node for which the level should be calculated.
197Defaults to the context node.</para>
198</listitem>
199</varlistentry>
200</variablelist>
201</refparameter>
202
203<refreturn id="section.level-returns">
204<para>The section level, <quote>1</quote>, <quote>2</quote>, etc.
205</para>
206</refreturn>
207</doc:template>
208
209<xsl:template name="section.level">
210  <xsl:param name="node" select="."/>
211  <xsl:choose>
212    <xsl:when test="local-name($node)='sect1'">1</xsl:when>
213    <xsl:when test="local-name($node)='sect2'">2</xsl:when>
214    <xsl:when test="local-name($node)='sect3'">3</xsl:when>
215    <xsl:when test="local-name($node)='sect4'">4</xsl:when>
216    <xsl:when test="local-name($node)='sect5'">5</xsl:when>
217    <xsl:when test="local-name($node)='section'">
218      <xsl:choose>
219        <xsl:when test="$node/../../../../../../section">6</xsl:when>
220        <xsl:when test="$node/../../../../../section">5</xsl:when>
221        <xsl:when test="$node/../../../../section">4</xsl:when>
222        <xsl:when test="$node/../../../section">3</xsl:when>
223        <xsl:when test="$node/../../section">2</xsl:when>
224        <xsl:otherwise>1</xsl:otherwise>
225      </xsl:choose>
226    </xsl:when>
227    <xsl:when test="local-name($node)='refsect1' or
228                    local-name($node)='refsect2' or
229                    local-name($node)='refsect3' or
230                    local-name($node)='refsection' or
231                    local-name($node)='refsynopsisdiv'">
232      <xsl:call-template name="refentry.section.level">
233        <xsl:with-param name="node" select="$node"/>
234      </xsl:call-template>
235    </xsl:when>
236    <xsl:when test="local-name($node)='simplesect'">
237      <xsl:choose>
238        <xsl:when test="$node/../../sect1">2</xsl:when>
239        <xsl:when test="$node/../../sect2">3</xsl:when>
240        <xsl:when test="$node/../../sect3">4</xsl:when>
241        <xsl:when test="$node/../../sect4">5</xsl:when>
242        <xsl:when test="$node/../../sect5">5</xsl:when>
243        <xsl:when test="$node/../../section">
244          <xsl:choose>
245            <xsl:when test="$node/../../../../../section">5</xsl:when>
246            <xsl:when test="$node/../../../../section">4</xsl:when>
247            <xsl:when test="$node/../../../section">3</xsl:when>
248            <xsl:otherwise>2</xsl:otherwise>
249          </xsl:choose>
250        </xsl:when>
251        <xsl:otherwise>1</xsl:otherwise>
252      </xsl:choose>
253    </xsl:when>
254    <xsl:otherwise>1</xsl:otherwise>
255  </xsl:choose>
256</xsl:template><!-- section.level -->
257
258<doc:template name="qanda.section.level" xmlns="">
259<refpurpose>Returns the hierarchical level of a QandASet</refpurpose>
260
261<refdescription id="qanda.section.level-desc">
262<para>This template calculates the hierarchical level of a QandASet.
263</para>
264</refdescription>
265
266<refreturn id="qanda.section.level-returns">
267<para>The level, <quote>1</quote>, <quote>2</quote>, etc.
268</para>
269</refreturn>
270</doc:template>
271
272<xsl:template name="qanda.section.level">
273  <xsl:variable name="section"
274                select="(ancestor::section
275                         |ancestor::simplesect
276                         |ancestor::sect5
277                         |ancestor::sect4
278                         |ancestor::sect3
279                         |ancestor::sect2
280                         |ancestor::sect1
281                         |ancestor::refsect3
282                         |ancestor::refsect2
283                         |ancestor::refsect1)[last()]"/>
284
285  <xsl:choose>
286    <xsl:when test="count($section) = '0'">1</xsl:when>
287    <xsl:otherwise>
288      <xsl:variable name="slevel">
289        <xsl:call-template name="section.level">
290          <xsl:with-param name="node" select="$section"/>
291        </xsl:call-template>
292      </xsl:variable>
293      <xsl:value-of select="$slevel + 1"/>
294    </xsl:otherwise>
295  </xsl:choose>
296</xsl:template>
297
298<!-- Finds the total section depth of a section in a refentry -->
299<xsl:template name="refentry.section.level">
300  <xsl:param name="node" select="."/>
301
302  <xsl:variable name="RElevel">
303    <xsl:call-template name="refentry.level">
304      <xsl:with-param name="node" select="$node/ancestor::refentry[1]"/>
305    </xsl:call-template>
306  </xsl:variable>
307
308  <xsl:variable name="levelinRE">
309    <xsl:choose>
310      <xsl:when test="local-name($node)='refsynopsisdiv'">1</xsl:when>
311      <xsl:when test="local-name($node)='refsect1'">1</xsl:when>
312      <xsl:when test="local-name($node)='refsect2'">2</xsl:when>
313      <xsl:when test="local-name($node)='refsect3'">3</xsl:when>
314      <xsl:when test="local-name($node)='refsection'">
315        <xsl:choose>
316          <xsl:when test="$node/../../../../../refsection">5</xsl:when>
317          <xsl:when test="$node/../../../../refsection">4</xsl:when>
318          <xsl:when test="$node/../../../refsection">3</xsl:when>
319          <xsl:when test="$node/../../refsection">2</xsl:when>
320          <xsl:otherwise>1</xsl:otherwise>
321        </xsl:choose>
322      </xsl:when>
323    </xsl:choose>
324  </xsl:variable>
325
326  <xsl:value-of select="$levelinRE + $RElevel"/>
327</xsl:template>
328
329<!-- Finds the section depth of a refentry -->
330<xsl:template name="refentry.level">
331  <xsl:param name="node" select="."/>
332  <xsl:variable name="container"
333                select="($node/ancestor::section |
334                        $node/ancestor::sect1 |
335                        $node/ancestor::sect2 |
336                        $node/ancestor::sect3 |
337                        $node/ancestor::sect4 |
338                        $node/ancestor::sect5)[last()]"/>
339
340  <xsl:choose>
341    <xsl:when test="$container">
342      <xsl:variable name="slevel">
343        <xsl:call-template name="section.level">
344          <xsl:with-param name="node" select="$container"/>
345        </xsl:call-template>
346      </xsl:variable>
347      <xsl:value-of select="$slevel + 1"/>
348    </xsl:when>
349    <xsl:otherwise>1</xsl:otherwise>
350  </xsl:choose>
351</xsl:template>
352
353<xsl:template name="qandadiv.section.level">
354  <xsl:variable name="section.level">
355    <xsl:call-template name="qanda.section.level"/>
356  </xsl:variable>
357  <xsl:variable name="anc.divs" select="ancestor::qandadiv"/>
358
359  <xsl:value-of select="count($anc.divs) + number($section.level)"/>
360</xsl:template>
361
362<xsl:template name="question.answer.label">
363  <xsl:variable name="deflabel">
364    <xsl:choose>
365      <xsl:when test="ancestor-or-self::*[@defaultlabel]">
366        <xsl:value-of select="(ancestor-or-self::*[@defaultlabel])[last()]
367                              /@defaultlabel"/>
368      </xsl:when>
369      <xsl:otherwise>
370        <xsl:value-of select="$qanda.defaultlabel"/>
371      </xsl:otherwise>
372    </xsl:choose>
373  </xsl:variable>
374
375  <xsl:variable name="label" select="@label"/>
376
377<!--
378 (hnr      (hierarchical-number-recursive (normalize "qandadiv") node))
379
380         (parsect  (ancestor-member node (section-element-list)))
381
382         (defnum   (if (and %qanda-inherit-numeration%
383                            %section-autolabel%)
384                       (if (node-list-empty? parsect)
385                           (section-autolabel-prefix node)
386                           (section-autolabel parsect))
387                       ""))
388
389         (hnumber  (let loop ((numlist hnr) (number defnum)
390                              (sep (if (equal? defnum "") "" ".")))
391                     (if (null? numlist)
392                         number
393                         (loop (cdr numlist)
394                               (string-append number
395                                              sep
396                                              (number->string (car numlist)))
397                               "."))))
398         (cnumber  (child-number (parent node)))
399         (number   (string-append hnumber
400                                  (if (equal? hnumber "")
401                                      ""
402                                      ".")
403                                  (number->string cnumber))))
404-->
405
406  <xsl:choose>
407    <xsl:when test="$deflabel = 'qanda'">
408      <xsl:call-template name="gentext">
409        <xsl:with-param name="key">
410          <xsl:choose>
411            <xsl:when test="local-name(.) = 'question'">question</xsl:when>
412            <xsl:when test="local-name(.) = 'answer'">answer</xsl:when>
413            <xsl:when test="local-name(.) = 'qandadiv'">qandadiv</xsl:when>
414            <xsl:otherwise>qandaset</xsl:otherwise>
415          </xsl:choose>
416        </xsl:with-param>
417      </xsl:call-template>
418    </xsl:when>
419    <xsl:when test="$deflabel = 'label'">
420      <xsl:value-of select="$label"/>
421    </xsl:when>
422    <xsl:when test="$deflabel = 'number'
423                    and local-name(.) = 'question'">
424      <xsl:apply-templates select="ancestor::qandaset[1]"
425                           mode="number"/>
426      <xsl:choose>
427        <xsl:when test="ancestor::qandadiv">
428          <xsl:apply-templates select="ancestor::qandadiv[1]"
429                               mode="number"/>
430          <xsl:apply-templates select="ancestor::qandaentry"
431                               mode="number"/>
432        </xsl:when>
433        <xsl:otherwise>
434          <xsl:apply-templates select="ancestor::qandaentry"
435                               mode="number"/>
436        </xsl:otherwise>
437      </xsl:choose>
438    </xsl:when>
439    <xsl:otherwise>
440      <!-- nothing -->
441    </xsl:otherwise>
442  </xsl:choose>
443</xsl:template>
444
445<xsl:template match="qandaset" mode="number">
446  <!-- FIXME: -->
447</xsl:template>
448
449<xsl:template match="qandadiv" mode="number">
450  <xsl:number level="multiple" from="qandaset" format="1."/>
451</xsl:template>
452
453<xsl:template match="qandaentry" mode="number">
454  <xsl:choose>
455    <xsl:when test="ancestor::qandadiv">
456      <xsl:number level="single" from="qandadiv" format="1."/>
457    </xsl:when>
458    <xsl:otherwise>
459      <xsl:number level="single" from="qandaset" format="1."/>
460    </xsl:otherwise>
461  </xsl:choose>
462</xsl:template>
463
464<!-- ====================================================================== -->
465
466<xsl:template name="object.id">
467  <xsl:param name="object" select="."/>
468  <xsl:choose>
469    <xsl:when test="$object/@id">
470      <xsl:value-of select="$object/@id"/>
471    </xsl:when>
472    <xsl:when test="$object/@xml:id">
473      <xsl:value-of select="$object/@xml:id"/>
474    </xsl:when>
475    <xsl:otherwise>
476      <xsl:value-of select="generate-id($object)"/>
477    </xsl:otherwise>
478  </xsl:choose>
479</xsl:template>
480
481<xsl:template name="person.name">
482  <!-- Formats a personal name. Handles corpauthor as a special case. -->
483  <xsl:param name="node" select="."/>
484
485  <xsl:variable name="style">
486    <xsl:choose>
487      <xsl:when test="$node/@role">
488        <xsl:value-of select="$node/@role"/>
489      </xsl:when>
490      <xsl:otherwise>
491        <xsl:call-template name="gentext.template">
492          <xsl:with-param name="context" select="'styles'"/>
493          <xsl:with-param name="name" select="'person-name'"/>
494        </xsl:call-template>
495      </xsl:otherwise>
496    </xsl:choose>
497  </xsl:variable>
498
499  <xsl:choose>
500    <!-- the personname element is a specialcase -->
501    <xsl:when test="$node/personname">
502      <xsl:call-template name="person.name">
503        <xsl:with-param name="node" select="$node/personname"/>
504      </xsl:call-template>
505    </xsl:when>
506
507    <!-- handle corpauthor as a special case...-->
508    <!-- * MikeSmith 2007-06: I'm wondering if the person.name template -->
509    <!-- * actually ever gets called to handle corpauthor.. maybe -->
510    <!-- * we don't actually need to check for corpauthor here. -->
511    <xsl:when test="local-name($node)='corpauthor'">
512      <xsl:apply-templates select="$node"/>
513    </xsl:when>
514
515    <xsl:otherwise>
516      <xsl:choose>
517        <!-- Handle case when personname contains only general markup (DocBook 5.0) -->
518        <xsl:when test="$node/self::personname and not($node/firstname or $node/honorific or $node/lineage or $node/othername or $node/surname)">
519          <xsl:apply-templates select="$node/node()"/>
520        </xsl:when>
521        <xsl:when test="$style = 'family-given'">
522          <xsl:call-template name="person.name.family-given">
523            <xsl:with-param name="node" select="$node"/>
524          </xsl:call-template>
525        </xsl:when>
526        <xsl:when test="$style = 'last-first'">
527          <xsl:call-template name="person.name.last-first">
528            <xsl:with-param name="node" select="$node"/>
529          </xsl:call-template>
530        </xsl:when>
531        <xsl:otherwise>
532          <xsl:call-template name="person.name.first-last">
533            <xsl:with-param name="node" select="$node"/>
534          </xsl:call-template>
535        </xsl:otherwise>
536      </xsl:choose>
537    </xsl:otherwise>
538  </xsl:choose>
539</xsl:template>
540
541<xsl:template name="person.name.family-given">
542  <xsl:param name="node" select="."/>
543
544  <!-- The family-given style applies a convention for identifying given -->
545  <!-- and family names in locales where it may be ambiguous -->
546  <xsl:apply-templates select="$node//surname[1]"/>
547
548  <xsl:if test="$node//surname and $node//firstname">
549    <xsl:text> </xsl:text>
550  </xsl:if>
551
552  <xsl:apply-templates select="$node//firstname[1]"/>
553
554  <xsl:text> [FAMILY Given]</xsl:text>
555</xsl:template>
556
557<xsl:template name="person.name.last-first">
558  <xsl:param name="node" select="."/>
559
560  <xsl:apply-templates select="$node//surname[1]"/>
561
562  <xsl:if test="$node//surname and $node//firstname">
563    <xsl:text>, </xsl:text>
564  </xsl:if>
565
566  <xsl:apply-templates select="$node//firstname[1]"/>
567</xsl:template>
568
569<xsl:template name="person.name.first-last">
570  <xsl:param name="node" select="."/>
571
572  <xsl:if test="$node//honorific">
573    <xsl:apply-templates select="$node//honorific[1]"/>
574    <xsl:value-of select="$punct.honorific"/>
575  </xsl:if>
576
577  <xsl:if test="$node//firstname">
578    <xsl:if test="$node//honorific">
579      <xsl:text> </xsl:text>
580    </xsl:if>
581    <xsl:apply-templates select="$node//firstname[1]"/>
582  </xsl:if>
583
584  <xsl:if test="$node//othername and $author.othername.in.middle != 0">
585    <xsl:if test="$node//honorific or $node//firstname">
586      <xsl:text> </xsl:text>
587    </xsl:if>
588    <xsl:apply-templates select="$node//othername[1]"/>
589  </xsl:if>
590
591  <xsl:if test="$node//surname">
592    <xsl:if test="$node//honorific or $node//firstname
593                  or ($node//othername and $author.othername.in.middle != 0)">
594      <xsl:text> </xsl:text>
595    </xsl:if>
596    <xsl:apply-templates select="$node//surname[1]"/>
597  </xsl:if>
598
599  <xsl:if test="$node//lineage">
600    <xsl:text>, </xsl:text>
601    <xsl:apply-templates select="$node//lineage[1]"/>
602  </xsl:if>
603</xsl:template>
604
605<xsl:template name="person.name.list">
606  <!-- Return a formatted string representation of the contents of
607       the current element. The current element must contain one or
608       more AUTHORs, CORPAUTHORs, OTHERCREDITs, and/or EDITORs.
609
610       John Doe
611     or
612       John Doe and Jane Doe
613     or
614       John Doe, Jane Doe, and A. Nonymous
615  -->
616  <xsl:param name="person.list"
617             select="author|corpauthor|othercredit|editor"/>
618  <xsl:param name="person.count" select="count($person.list)"/>
619  <xsl:param name="count" select="1"/>
620
621  <xsl:choose>
622    <xsl:when test="$count &gt; $person.count"></xsl:when>
623    <xsl:otherwise>
624      <xsl:call-template name="person.name">
625        <xsl:with-param name="node" select="$person.list[position()=$count]"/>
626      </xsl:call-template>
627
628      <xsl:choose>
629        <xsl:when test="$person.count = 2 and $count = 1">
630          <xsl:call-template name="gentext.template">
631            <xsl:with-param name="context" select="'authorgroup'"/>
632            <xsl:with-param name="name" select="'sep2'"/>
633          </xsl:call-template>
634        </xsl:when>
635        <xsl:when test="$person.count &gt; 2 and $count+1 = $person.count">
636          <xsl:call-template name="gentext.template">
637            <xsl:with-param name="context" select="'authorgroup'"/>
638            <xsl:with-param name="name" select="'seplast'"/>
639          </xsl:call-template>
640        </xsl:when>
641        <xsl:when test="$count &lt; $person.count">
642          <xsl:call-template name="gentext.template">
643            <xsl:with-param name="context" select="'authorgroup'"/>
644            <xsl:with-param name="name" select="'sep'"/>
645          </xsl:call-template>
646        </xsl:when>
647      </xsl:choose>
648
649      <xsl:call-template name="person.name.list">
650        <xsl:with-param name="person.list" select="$person.list"/>
651        <xsl:with-param name="person.count" select="$person.count"/>
652        <xsl:with-param name="count" select="$count+1"/>
653      </xsl:call-template>
654    </xsl:otherwise>
655  </xsl:choose>
656</xsl:template><!-- person.name.list -->
657
658<!-- === synopsis ======================================================= -->
659<!-- The following definitions match those given in the reference
660     documentation for DocBook V3.0
661-->
662
663<xsl:variable name="arg.choice.opt.open.str">[</xsl:variable>
664<xsl:variable name="arg.choice.opt.close.str">]</xsl:variable>
665<xsl:variable name="arg.choice.req.open.str">{</xsl:variable>
666<xsl:variable name="arg.choice.req.close.str">}</xsl:variable>
667<xsl:variable name="arg.choice.plain.open.str"><xsl:text> </xsl:text></xsl:variable>
668<xsl:variable name="arg.choice.plain.close.str"><xsl:text> </xsl:text></xsl:variable>
669<xsl:variable name="arg.choice.def.open.str">[</xsl:variable>
670<xsl:variable name="arg.choice.def.close.str">]</xsl:variable>
671<xsl:variable name="arg.rep.repeat.str">...</xsl:variable>
672<xsl:variable name="arg.rep.norepeat.str"></xsl:variable>
673<xsl:variable name="arg.rep.def.str"></xsl:variable>
674<xsl:variable name="arg.or.sep"> | </xsl:variable>
675<xsl:variable name="cmdsynopsis.hanging.indent">4pi</xsl:variable>
676
677<!-- ====================================================================== -->
678
679<!--
680<xsl:template name="xref.g.subst">
681  <xsl:param name="string"></xsl:param>
682  <xsl:param name="target" select="."/>
683  <xsl:variable name="subst">%g</xsl:variable>
684
685  <xsl:choose>
686    <xsl:when test="contains($string, $subst)">
687      <xsl:value-of select="substring-before($string, $subst)"/>
688      <xsl:call-template name="gentext.element.name">
689        <xsl:with-param name="element.name" select="local-name($target)"/>
690      </xsl:call-template>
691      <xsl:call-template name="xref.g.subst">
692        <xsl:with-param name="string"
693                        select="substring-after($string, $subst)"/>
694        <xsl:with-param name="target" select="$target"/>
695      </xsl:call-template>
696    </xsl:when>
697    <xsl:otherwise>
698      <xsl:value-of select="$string"/>
699    </xsl:otherwise>
700  </xsl:choose>
701</xsl:template>
702
703<xsl:template name="xref.t.subst">
704  <xsl:param name="string"></xsl:param>
705  <xsl:param name="target" select="."/>
706  <xsl:variable name="subst">%t</xsl:variable>
707
708  <xsl:choose>
709    <xsl:when test="contains($string, $subst)">
710      <xsl:call-template name="xref.g.subst">
711        <xsl:with-param name="string"
712                        select="substring-before($string, $subst)"/>
713        <xsl:with-param name="target" select="$target"/>
714      </xsl:call-template>
715      <xsl:call-template name="title.xref">
716        <xsl:with-param name="target" select="$target"/>
717      </xsl:call-template>
718      <xsl:call-template name="xref.t.subst">
719        <xsl:with-param name="string"
720                        select="substring-after($string, $subst)"/>
721        <xsl:with-param name="target" select="$target"/>
722      </xsl:call-template>
723    </xsl:when>
724    <xsl:otherwise>
725      <xsl:call-template name="xref.g.subst">
726        <xsl:with-param name="string" select="$string"/>
727        <xsl:with-param name="target" select="$target"/>
728      </xsl:call-template>
729    </xsl:otherwise>
730  </xsl:choose>
731</xsl:template>
732
733<xsl:template name="xref.n.subst">
734  <xsl:param name="string"></xsl:param>
735  <xsl:param name="target" select="."/>
736  <xsl:variable name="subst">%n</xsl:variable>
737
738  <xsl:choose>
739    <xsl:when test="contains($string, $subst)">
740      <xsl:call-template name="xref.t.subst">
741        <xsl:with-param name="string"
742                        select="substring-before($string, $subst)"/>
743        <xsl:with-param name="target" select="$target"/>
744      </xsl:call-template>
745      <xsl:call-template name="number.xref">
746        <xsl:with-param name="target" select="$target"/>
747      </xsl:call-template>
748      <xsl:call-template name="xref.t.subst">
749        <xsl:with-param name="string"
750                        select="substring-after($string, $subst)"/>
751        <xsl:with-param name="target" select="$target"/>
752      </xsl:call-template>
753    </xsl:when>
754    <xsl:otherwise>
755      <xsl:call-template name="xref.t.subst">
756        <xsl:with-param name="string" select="$string"/>
757        <xsl:with-param name="target" select="$target"/>
758      </xsl:call-template>
759    </xsl:otherwise>
760  </xsl:choose>
761</xsl:template>
762
763<xsl:template name="subst.xref.text">
764  <xsl:param name="xref.text"></xsl:param>
765  <xsl:param name="target" select="."/>
766
767  <xsl:call-template name="xref.n.subst">
768    <xsl:with-param name="string" select="$xref.text"/>
769    <xsl:with-param name="target" select="$target"/>
770  </xsl:call-template>
771</xsl:template>
772-->
773
774<!-- ====================================================================== -->
775
776<xsl:template name="filename-basename">
777  <!-- We assume all filenames are really URIs and use "/" -->
778  <xsl:param name="filename"></xsl:param>
779  <xsl:param name="recurse" select="false()"/>
780
781  <xsl:choose>
782    <xsl:when test="substring-after($filename, '/') != ''">
783      <xsl:call-template name="filename-basename">
784        <xsl:with-param name="filename"
785                        select="substring-after($filename, '/')"/>
786        <xsl:with-param name="recurse" select="true()"/>
787      </xsl:call-template>
788    </xsl:when>
789    <xsl:otherwise>
790      <xsl:value-of select="$filename"/>
791    </xsl:otherwise>
792  </xsl:choose>
793</xsl:template>
794
795<xsl:template name="filename-extension">
796  <xsl:param name="filename"></xsl:param>
797  <xsl:param name="recurse" select="false()"/>
798
799  <!-- Make sure we only look at the base name... -->
800  <xsl:variable name="basefn">
801    <xsl:choose>
802      <xsl:when test="$recurse">
803        <xsl:value-of select="$filename"/>
804      </xsl:when>
805      <xsl:otherwise>
806        <xsl:call-template name="filename-basename">
807          <xsl:with-param name="filename" select="$filename"/>
808        </xsl:call-template>
809      </xsl:otherwise>
810    </xsl:choose>
811  </xsl:variable>
812
813  <xsl:choose>
814    <xsl:when test="substring-after($basefn, '.') != ''">
815      <xsl:call-template name="filename-extension">
816        <xsl:with-param name="filename"
817                        select="substring-after($basefn, '.')"/>
818        <xsl:with-param name="recurse" select="true()"/>
819      </xsl:call-template>
820    </xsl:when>
821    <xsl:when test="$recurse">
822      <xsl:value-of select="$basefn"/>
823    </xsl:when>
824    <xsl:otherwise></xsl:otherwise>
825  </xsl:choose>
826</xsl:template>
827
828<!-- ====================================================================== -->
829
830<doc:template name="select.mediaobject" xmlns="">
831<refpurpose>Selects and processes an appropriate media object from a list</refpurpose>
832
833<refdescription id="select.mediaobject-desc">
834<para>This template takes a list of media objects (usually the
835children of a mediaobject or inlinemediaobject) and processes
836the "right" object.</para>
837
838<para>This template relies on a template named
839"select.mediaobject.index" to determine which object
840in the list is appropriate.</para>
841
842<para>If no acceptable object is located, nothing happens.</para>
843</refdescription>
844
845<refparameter id="select.mediaobject-params">
846<variablelist>
847<varlistentry><term>olist</term>
848<listitem>
849<para>The node list of potential objects to examine.</para>
850</listitem>
851</varlistentry>
852</variablelist>
853</refparameter>
854
855<refreturn id="select.mediaobject-returns">
856<para>Calls &lt;xsl:apply-templates&gt; on the selected object.</para>
857</refreturn>
858</doc:template>
859
860<xsl:template name="select.mediaobject">
861  <xsl:param name="olist"
862             select="imageobject|imageobjectco
863                     |videoobject|audioobject|textobject"/>
864 
865  <xsl:variable name="mediaobject.index">
866    <xsl:call-template name="select.mediaobject.index">
867      <xsl:with-param name="olist" select="$olist"/>
868      <xsl:with-param name="count" select="1"/>
869    </xsl:call-template>
870  </xsl:variable>
871
872  <xsl:if test="$mediaobject.index != ''">
873    <xsl:apply-templates select="$olist[position() = $mediaobject.index]"/>
874  </xsl:if>
875</xsl:template>
876
877<!-- ====================================================================== -->
878
879<doc:template name="select.mediaobject.index" xmlns="">
880<refpurpose>Selects the position of the appropriate media object from a list</refpurpose>
881
882<refdescription id="select.mediaobject.index-desc">
883<para>This template takes a list of media objects (usually the
884children of a mediaobject or inlinemediaobject) and determines
885the "right" object. It returns the position of that object
886to be used by the calling template.</para>
887
888<para>If the parameter <parameter>use.role.for.mediaobject</parameter>
889is nonzero, then it first checks for an object with
890a role attribute of the appropriate value.  It takes the first
891of those.  Otherwise, it takes the first acceptable object
892through a recursive pass through the list.</para>
893
894<para>This template relies on a template named "is.acceptable.mediaobject"
895to determine if a given object is an acceptable graphic. The semantics
896of media objects is that the first acceptable graphic should be used.
897</para>
898
899<para>If no acceptable object is located, no index is returned.</para>
900</refdescription>
901
902<refparameter id="select.mediaobject.index-params">
903<variablelist>
904<varlistentry><term>olist</term>
905<listitem>
906<para>The node list of potential objects to examine.</para>
907</listitem>
908</varlistentry>
909<varlistentry><term>count</term>
910<listitem>
911<para>The position in the list currently being considered by the
912recursive process.</para>
913</listitem>
914</varlistentry>
915</variablelist>
916</refparameter>
917
918<refreturn id="select.mediaobject.index-returns">
919<para>Returns the position in the original list of the selected object.</para>
920</refreturn>
921</doc:template>
922
923<xsl:template name="select.mediaobject.index">
924  <xsl:param name="olist"
925             select="imageobject|imageobjectco
926                     |videoobject|audioobject|textobject"/>
927  <xsl:param name="count">1</xsl:param>
928
929  <xsl:choose>
930    <!-- Test for objects preferred by role -->
931    <xsl:when test="$use.role.for.mediaobject != 0
932               and $preferred.mediaobject.role != ''
933               and $olist[@role = $preferred.mediaobject.role]"> 
934     
935      <!-- Get the first hit's position index -->
936      <xsl:for-each select="$olist">
937        <xsl:if test="@role = $preferred.mediaobject.role and
938             not(preceding-sibling::*[@role = $preferred.mediaobject.role])"> 
939          <xsl:value-of select="position()"/> 
940        </xsl:if>
941      </xsl:for-each>
942    </xsl:when>
943
944    <xsl:when test="$use.role.for.mediaobject != 0
945               and $olist[@role = $stylesheet.result.type]">
946      <!-- Get the first hit's position index -->
947      <xsl:for-each select="$olist">
948        <xsl:if test="@role = $stylesheet.result.type and
949              not(preceding-sibling::*[@role = $stylesheet.result.type])"> 
950          <xsl:value-of select="position()"/> 
951        </xsl:if>
952      </xsl:for-each>
953    </xsl:when>
954    <!-- Accept 'html' for $stylesheet.result.type = 'xhtml' -->
955    <xsl:when test="$use.role.for.mediaobject != 0
956               and $stylesheet.result.type = 'xhtml'
957               and $olist[@role = 'html']">
958      <!-- Get the first hit's position index -->
959      <xsl:for-each select="$olist">
960        <xsl:if test="@role = 'html' and
961              not(preceding-sibling::*[@role = 'html'])"> 
962          <xsl:value-of select="position()"/> 
963        </xsl:if>
964      </xsl:for-each>
965    </xsl:when>
966
967    <!-- If no selection by role, and there is only one object, use it -->
968    <xsl:when test="count($olist) = 1 and $count = 1">
969      <xsl:value-of select="$count"/> 
970    </xsl:when>
971
972    <xsl:otherwise>
973      <!-- Otherwise select first acceptable object -->
974      <xsl:if test="$count &lt;= count($olist)">
975        <xsl:variable name="object" select="$olist[position()=$count]"/>
976   
977        <xsl:variable name="useobject">
978          <xsl:choose>
979            <!-- The phrase is used only when contains TeX Math and output is FO -->
980            <xsl:when test="local-name($object)='textobject' and $object/phrase
981                            and $object/@role='tex' and $stylesheet.result.type = 'fo'
982                            and $tex.math.in.alt != ''">
983              <xsl:text>1</xsl:text> 
984            </xsl:when>
985            <!-- The phrase is never used -->
986            <xsl:when test="local-name($object)='textobject' and $object/phrase">
987              <xsl:text>0</xsl:text>
988            </xsl:when>
989            <xsl:when test="local-name($object)='textobject'
990                            and $object/ancestor::equation ">
991            <!-- The first textobject is not a reasonable fallback
992                 for equation image -->
993              <xsl:text>0</xsl:text>
994            </xsl:when>
995            <!-- The first textobject is a reasonable fallback -->
996            <xsl:when test="local-name($object)='textobject'
997                            and $object[not(@role) or @role!='tex']">
998              <xsl:text>1</xsl:text>
999            </xsl:when>
1000            <!-- don't use graphic when output is FO, TeX Math is used
1001                 and there is math in alt element -->
1002            <xsl:when test="$object/ancestor::equation and
1003                            $object/ancestor::equation/alt[@role='tex']
1004                            and $stylesheet.result.type = 'fo'
1005                            and $tex.math.in.alt != ''">
1006              <xsl:text>0</xsl:text>
1007            </xsl:when>
1008            <!-- If there's only one object, use it -->
1009            <xsl:when test="$count = 1 and count($olist) = 1">
1010               <xsl:text>1</xsl:text>
1011            </xsl:when>
1012            <!-- Otherwise, see if this one is a useable graphic -->
1013            <xsl:otherwise>
1014              <xsl:choose>
1015                <!-- peek inside imageobjectco to simplify the test -->
1016                <xsl:when test="local-name($object) = 'imageobjectco'">
1017                  <xsl:call-template name="is.acceptable.mediaobject">
1018                    <xsl:with-param name="object" select="$object/imageobject"/>
1019                  </xsl:call-template>
1020                </xsl:when>
1021                <xsl:otherwise>
1022                  <xsl:call-template name="is.acceptable.mediaobject">
1023                    <xsl:with-param name="object" select="$object"/>
1024                  </xsl:call-template>
1025                </xsl:otherwise>
1026              </xsl:choose>
1027            </xsl:otherwise>
1028          </xsl:choose>
1029        </xsl:variable>
1030   
1031        <xsl:choose>
1032          <xsl:when test="$useobject='1'">
1033            <xsl:value-of select="$count"/>
1034          </xsl:when>
1035          <xsl:otherwise>
1036            <xsl:call-template name="select.mediaobject.index">
1037              <xsl:with-param name="olist" select="$olist"/>
1038              <xsl:with-param name="count" select="$count + 1"/>
1039            </xsl:call-template>
1040          </xsl:otherwise>
1041        </xsl:choose>
1042      </xsl:if>
1043    </xsl:otherwise>
1044  </xsl:choose>
1045</xsl:template>
1046
1047<doc:template name="is.acceptable.mediaobject" xmlns="">
1048<refpurpose>Returns '1' if the specified media object is recognized</refpurpose>
1049
1050<refdescription id="is.acceptable.mediaobject-desc">
1051<para>This template examines a media object and returns '1' if the
1052object is recognized as a graphic.</para>
1053</refdescription>
1054
1055<refparameter id="is.acceptable.mediaobject-params">
1056<variablelist>
1057<varlistentry><term>object</term>
1058<listitem>
1059<para>The media object to consider.</para>
1060</listitem>
1061</varlistentry>
1062</variablelist>
1063</refparameter>
1064
1065<refreturn id="is.acceptable.mediaobject-returns">
1066<para>0 or 1</para>
1067</refreturn>
1068</doc:template>
1069
1070<xsl:template name="is.acceptable.mediaobject">
1071  <xsl:param name="object"></xsl:param>
1072
1073  <xsl:variable name="filename">
1074    <xsl:call-template name="mediaobject.filename">
1075      <xsl:with-param name="object" select="$object"/>
1076    </xsl:call-template>
1077  </xsl:variable>
1078
1079  <xsl:variable name="ext">
1080    <xsl:call-template name="filename-extension">
1081      <xsl:with-param name="filename" select="$filename"/>
1082    </xsl:call-template>
1083  </xsl:variable>
1084
1085  <!-- there will only be one -->
1086  <xsl:variable name="data" select="$object/videodata
1087                                    |$object/imagedata
1088                                    |$object/audiodata"/>
1089
1090  <xsl:variable name="format" select="$data/@format"/>
1091
1092  <xsl:variable name="graphic.format">
1093    <xsl:if test="$format">
1094      <xsl:call-template name="is.graphic.format">
1095        <xsl:with-param name="format" select="$format"/>
1096      </xsl:call-template>
1097    </xsl:if>
1098  </xsl:variable>
1099
1100  <xsl:variable name="graphic.ext">
1101    <xsl:if test="$ext">
1102      <xsl:call-template name="is.graphic.extension">
1103        <xsl:with-param name="ext" select="$ext"/>
1104      </xsl:call-template>
1105    </xsl:if>
1106  </xsl:variable>
1107
1108  <xsl:choose>
1109    <xsl:when test="$use.svg = 0 and $format = 'SVG'">0</xsl:when>
1110    <xsl:when xmlns:svg="http://www.w3.org/2000/svg"
1111              test="$use.svg != 0 and $object/svg:*">1</xsl:when>
1112    <xsl:when test="$graphic.format = '1'">1</xsl:when>
1113    <xsl:when test="$graphic.ext = '1'">1</xsl:when>
1114    <xsl:otherwise>0</xsl:otherwise>
1115  </xsl:choose>
1116</xsl:template>
1117
1118<xsl:template name="mediaobject.filename">
1119  <xsl:param name="object"></xsl:param>
1120
1121  <xsl:variable name="data" select="$object/videodata
1122                                    |$object/imagedata
1123                                    |$object/audiodata
1124                                    |$object"/>
1125
1126  <xsl:variable name="filename">
1127    <xsl:choose>
1128      <xsl:when test="$data[@fileref]">
1129        <xsl:apply-templates select="$data/@fileref"/>
1130      </xsl:when>
1131      <xsl:when test="$data[@entityref]">
1132        <xsl:value-of select="unparsed-entity-uri($data/@entityref)"/>
1133      </xsl:when>
1134      <xsl:otherwise></xsl:otherwise>
1135    </xsl:choose>
1136  </xsl:variable>
1137
1138  <xsl:variable name="real.ext">
1139    <xsl:call-template name="filename-extension">
1140      <xsl:with-param name="filename" select="$filename"/>
1141    </xsl:call-template>
1142  </xsl:variable>
1143
1144  <xsl:variable name="ext">
1145    <xsl:choose>
1146      <xsl:when test="$real.ext != ''">
1147        <xsl:value-of select="$real.ext"/>
1148      </xsl:when>
1149      <xsl:otherwise>
1150        <xsl:value-of select="$graphic.default.extension"/>
1151      </xsl:otherwise>
1152    </xsl:choose>
1153  </xsl:variable>
1154
1155  <xsl:variable name="graphic.ext">
1156    <xsl:call-template name="is.graphic.extension">
1157      <xsl:with-param name="ext" select="$ext"/>
1158    </xsl:call-template>
1159  </xsl:variable>
1160
1161  <xsl:choose>
1162    <xsl:when test="$real.ext = ''">
1163      <xsl:choose>
1164        <xsl:when test="$ext != ''">
1165          <xsl:value-of select="$filename"/>
1166          <xsl:text>.</xsl:text>
1167          <xsl:value-of select="$ext"/>
1168        </xsl:when>
1169        <xsl:otherwise>
1170          <xsl:value-of select="$filename"/>
1171        </xsl:otherwise>
1172      </xsl:choose>
1173    </xsl:when>
1174    <xsl:when test="not($graphic.ext)">
1175      <xsl:choose>
1176        <xsl:when test="$graphic.default.extension != ''">
1177          <xsl:value-of select="$filename"/>
1178          <xsl:text>.</xsl:text>
1179          <xsl:value-of select="$graphic.default.extension"/>
1180        </xsl:when>
1181        <xsl:otherwise>
1182          <xsl:value-of select="$filename"/>
1183        </xsl:otherwise>
1184      </xsl:choose>
1185    </xsl:when>
1186    <xsl:otherwise>
1187      <xsl:value-of select="$filename"/>
1188    </xsl:otherwise>
1189  </xsl:choose>
1190</xsl:template>
1191
1192<!-- ====================================================================== -->
1193
1194<doc:template name="check.id.unique" xmlns="">
1195<refpurpose>Warn users about references to non-unique IDs</refpurpose>
1196<refdescription id="check.id.unique-desc">
1197<para>If passed an ID in <varname>linkend</varname>,
1198<function>check.id.unique</function> prints
1199a warning message to the user if either the ID does not exist or
1200the ID is not unique.</para>
1201</refdescription>
1202</doc:template>
1203
1204<xsl:template name="check.id.unique">
1205  <xsl:param name="linkend"></xsl:param>
1206  <xsl:if test="$linkend != ''">
1207    <xsl:variable name="targets" select="key('id',$linkend)"/>
1208    <xsl:variable name="target" select="$targets[1]"/>
1209
1210    <xsl:if test="count($targets)=0">
1211      <xsl:message>
1212        <xsl:text>Error: no ID for constraint linkend: </xsl:text>
1213        <xsl:value-of select="$linkend"/>
1214        <xsl:text>.</xsl:text>
1215      </xsl:message>
1216      <!--
1217      <xsl:message>
1218        <xsl:text>If the ID exists in your document, did your </xsl:text>
1219        <xsl:text>XSLT Processor load the DTD?</xsl:text>
1220      </xsl:message>
1221      -->
1222    </xsl:if>
1223
1224    <xsl:if test="count($targets)>1">
1225      <xsl:message>
1226        <xsl:text>Warning: multiple "IDs" for constraint linkend: </xsl:text>
1227        <xsl:value-of select="$linkend"/>
1228        <xsl:text>.</xsl:text>
1229      </xsl:message>
1230    </xsl:if>
1231  </xsl:if>
1232</xsl:template>
1233
1234<doc:template name="check.idref.targets" xmlns="">
1235<refpurpose>Warn users about incorrectly typed references</refpurpose>
1236<refdescription id="check.idref.targets-desc">
1237<para>If passed an ID in <varname>linkend</varname>,
1238<function>check.idref.targets</function> makes sure that the element
1239pointed to by the link is one of the elements listed in
1240<varname>element-list</varname> and warns the user otherwise.</para>
1241</refdescription>
1242</doc:template>
1243
1244<xsl:template name="check.idref.targets">
1245  <xsl:param name="linkend"></xsl:param>
1246  <xsl:param name="element-list"></xsl:param>
1247  <xsl:if test="$linkend != ''">
1248    <xsl:variable name="targets" select="key('id',$linkend)"/>
1249    <xsl:variable name="target" select="$targets[1]"/>
1250
1251    <xsl:if test="count($target) &gt; 0">
1252      <xsl:if test="not(contains(concat(' ', $element-list, ' '), local-name($target)))">
1253        <xsl:message>
1254          <xsl:text>Error: linkend (</xsl:text>
1255          <xsl:value-of select="$linkend"/>
1256          <xsl:text>) points to "</xsl:text>
1257          <xsl:value-of select="local-name($target)"/>
1258          <xsl:text>" not (one of): </xsl:text>
1259          <xsl:value-of select="$element-list"/>
1260        </xsl:message>
1261      </xsl:if>
1262    </xsl:if>
1263  </xsl:if>
1264</xsl:template>
1265
1266<!-- ====================================================================== -->
1267<!-- Procedure Step Numeration -->
1268
1269<xsl:param name="procedure.step.numeration.formats" select="'1aiAI'"/>
1270
1271<xsl:template name="procedure.step.numeration">
1272  <xsl:param name="context" select="."/>
1273  <xsl:variable name="format.length"
1274                select="string-length($procedure.step.numeration.formats)"/>
1275  <xsl:choose>
1276    <xsl:when test="local-name($context) = 'substeps'">
1277      <xsl:variable name="ssdepth"
1278                    select="count($context/ancestor::substeps)"/>
1279      <xsl:variable name="sstype" select="($ssdepth mod $format.length)+2"/>
1280      <xsl:choose>
1281        <xsl:when test="$sstype &gt; $format.length">
1282          <xsl:value-of select="substring($procedure.step.numeration.formats,1,1)"/>
1283        </xsl:when>
1284        <xsl:otherwise>
1285          <xsl:value-of select="substring($procedure.step.numeration.formats,$sstype,1)"/>
1286        </xsl:otherwise>
1287      </xsl:choose>
1288    </xsl:when>
1289    <xsl:when test="local-name($context) = 'step'">
1290      <xsl:variable name="sdepth"
1291                    select="count($context/ancestor::substeps)"/>
1292      <xsl:variable name="stype" select="($sdepth mod $format.length)+1"/>
1293      <xsl:value-of select="substring($procedure.step.numeration.formats,$stype,1)"/>
1294    </xsl:when>
1295    <xsl:otherwise>
1296      <xsl:message>
1297        <xsl:text>Unexpected context in procedure.step.numeration: </xsl:text>
1298        <xsl:value-of select="local-name($context)"/>
1299      </xsl:message>
1300    </xsl:otherwise>
1301  </xsl:choose>
1302</xsl:template>
1303
1304<xsl:template match="step" mode="number">
1305  <xsl:param name="rest" select="''"/>
1306  <xsl:param name="recursive" select="1"/>
1307  <xsl:variable name="format">
1308    <xsl:call-template name="procedure.step.numeration"/>
1309  </xsl:variable>
1310  <xsl:variable name="num">
1311    <xsl:number count="step" format="{$format}"/>
1312  </xsl:variable>
1313  <xsl:choose>
1314    <xsl:when test="$recursive != 0 and ancestor::step">
1315      <xsl:apply-templates select="ancestor::step[1]" mode="number">
1316        <xsl:with-param name="rest" select="concat('.', $num, $rest)"/>
1317      </xsl:apply-templates>
1318    </xsl:when>
1319    <xsl:otherwise>
1320      <xsl:value-of select="concat($num, $rest)"/>
1321    </xsl:otherwise>
1322  </xsl:choose>
1323</xsl:template>
1324
1325<!-- ====================================================================== -->
1326<!-- OrderedList Numeration -->
1327
1328<xsl:template name="orderedlist-starting-number">
1329  <xsl:param name="list" select="."/>
1330
1331  <!-- Need a neutral dbxxx -->
1332  <xsl:variable name="pi-html-start">
1333    <xsl:call-template name="pi-attribute">
1334      <xsl:with-param name="pis"
1335                      select="$list/processing-instruction('dbhtml')"/>
1336      <xsl:with-param name="attribute" select="'start'"/>
1337    </xsl:call-template>
1338  </xsl:variable>
1339
1340  <xsl:variable name="pi-fo-start">
1341    <xsl:call-template name="pi-attribute">
1342      <xsl:with-param name="pis"
1343                      select="$list/processing-instruction('dbfo')"/>
1344      <xsl:with-param name="attribute" select="'start'"/>
1345    </xsl:call-template>
1346  </xsl:variable>
1347
1348  <xsl:choose>
1349    <xsl:when test="not($list/@continuation = 'continues')">
1350      <xsl:choose>
1351        <xsl:when test="@startingnumber">
1352          <xsl:value-of select="@startingnumber"/>
1353        </xsl:when>
1354        <xsl:when test="$pi-html-start != ''">
1355          <xsl:value-of select="$pi-html-start"/>
1356        </xsl:when>
1357        <xsl:when test="$pi-fo-start != ''">
1358          <xsl:value-of select="$pi-fo-start"/>
1359        </xsl:when>
1360        <xsl:otherwise>1</xsl:otherwise>
1361      </xsl:choose>
1362    </xsl:when>
1363    <xsl:otherwise>
1364      <xsl:variable name="prevlist"
1365                    select="$list/preceding::orderedlist[1]"/>
1366      <xsl:choose>
1367        <xsl:when test="count($prevlist) = 0">2</xsl:when>
1368        <xsl:otherwise>
1369          <xsl:variable name="prevlength" select="count($prevlist/listitem)"/>
1370          <xsl:variable name="prevstart">
1371            <xsl:call-template name="orderedlist-starting-number">
1372              <xsl:with-param name="list" select="$prevlist"/>
1373            </xsl:call-template>
1374          </xsl:variable>
1375          <xsl:value-of select="$prevstart + $prevlength"/>
1376        </xsl:otherwise>
1377      </xsl:choose>
1378    </xsl:otherwise>
1379  </xsl:choose>
1380</xsl:template>
1381
1382<xsl:template name="orderedlist-item-number">
1383  <!-- context node must be a listitem in an orderedlist -->
1384  <xsl:param name="node" select="."/>
1385
1386  <xsl:choose>
1387    <xsl:when test="$node/@override">
1388      <xsl:value-of select="$node/@override"/>
1389    </xsl:when>
1390    <xsl:when test="$node/preceding-sibling::listitem">
1391      <xsl:variable name="pnum">
1392        <xsl:call-template name="orderedlist-item-number">
1393          <xsl:with-param name="node" select="$node/preceding-sibling::listitem[1]"/>
1394        </xsl:call-template>
1395      </xsl:variable>
1396      <xsl:value-of select="$pnum + 1"/>
1397    </xsl:when>
1398    <xsl:otherwise>
1399      <xsl:call-template name="orderedlist-starting-number">
1400        <xsl:with-param name="list" select="parent::*"/>
1401      </xsl:call-template>
1402    </xsl:otherwise>
1403  </xsl:choose>
1404</xsl:template>
1405
1406<xsl:template name="next.numeration">
1407  <xsl:param name="numeration" select="'default'"/>
1408  <xsl:choose>
1409    <!-- Change this list if you want to change the order of numerations -->
1410    <xsl:when test="$numeration = 'arabic'">loweralpha</xsl:when>
1411    <xsl:when test="$numeration = 'loweralpha'">lowerroman</xsl:when>
1412    <xsl:when test="$numeration = 'lowerroman'">upperalpha</xsl:when>
1413    <xsl:when test="$numeration = 'upperalpha'">upperroman</xsl:when>
1414    <xsl:when test="$numeration = 'upperroman'">arabic</xsl:when>
1415    <xsl:otherwise>arabic</xsl:otherwise>
1416  </xsl:choose>
1417</xsl:template>
1418
1419<xsl:template name="list.numeration">
1420  <xsl:param name="node" select="."/>
1421
1422  <xsl:choose>
1423    <xsl:when test="$node/@numeration">
1424      <xsl:value-of select="$node/@numeration"/>
1425    </xsl:when>
1426    <xsl:otherwise>
1427      <xsl:choose>
1428        <xsl:when test="$node/ancestor::orderedlist">
1429          <xsl:call-template name="next.numeration">
1430            <xsl:with-param name="numeration">
1431              <xsl:call-template name="list.numeration">
1432                <xsl:with-param name="node" select="$node/ancestor::orderedlist[1]"/>
1433              </xsl:call-template>
1434            </xsl:with-param>
1435          </xsl:call-template>
1436        </xsl:when>
1437        <xsl:otherwise>
1438          <xsl:call-template name="next.numeration"/>
1439        </xsl:otherwise>
1440      </xsl:choose>
1441    </xsl:otherwise>
1442  </xsl:choose>
1443</xsl:template>
1444
1445<!-- ====================================================================== -->
1446<!-- ItemizedList "Numeration" -->
1447
1448<xsl:template name="next.itemsymbol">
1449  <xsl:param name="itemsymbol" select="'default'"/>
1450  <xsl:choose>
1451    <!-- Change this list if you want to change the order of symbols -->
1452    <xsl:when test="$itemsymbol = 'disc'">circle</xsl:when>
1453    <xsl:when test="$itemsymbol = 'circle'">square</xsl:when>
1454    <xsl:otherwise>disc</xsl:otherwise>
1455  </xsl:choose>
1456</xsl:template>
1457
1458<xsl:template name="list.itemsymbol">
1459  <xsl:param name="node" select="."/>
1460
1461  <xsl:choose>
1462    <xsl:when test="@override">
1463      <xsl:value-of select="@override"/>
1464    </xsl:when>
1465    <xsl:when test="$node/@mark">
1466      <xsl:value-of select="$node/@mark"/>
1467    </xsl:when>
1468    <xsl:otherwise>
1469      <xsl:choose>
1470        <xsl:when test="$node/ancestor::itemizedlist">
1471          <xsl:call-template name="next.itemsymbol">
1472            <xsl:with-param name="itemsymbol">
1473              <xsl:call-template name="list.itemsymbol">
1474                <xsl:with-param name="node" select="$node/ancestor::itemizedlist[1]"/>
1475              </xsl:call-template>
1476            </xsl:with-param>
1477          </xsl:call-template>
1478        </xsl:when>
1479        <xsl:otherwise>
1480          <xsl:call-template name="next.itemsymbol"/>
1481        </xsl:otherwise>
1482      </xsl:choose>
1483    </xsl:otherwise>
1484  </xsl:choose>
1485</xsl:template>
1486
1487<!-- ====================================================================== -->
1488
1489<doc:template name="copyright.years" xmlns="">
1490<refpurpose>Print a set of years with collapsed ranges</refpurpose>
1491
1492<refdescription id="copyright.years-desc">
1493<para>This template prints a list of year elements with consecutive
1494years printed as a range. In other words:</para>
1495
1496<screen><![CDATA[<year>1992</year>
1497<year>1993</year>
1498<year>1994</year>]]></screen>
1499
1500<para>is printed <quote>1992-1994</quote>, whereas:</para>
1501
1502<screen><![CDATA[<year>1992</year>
1503<year>1994</year>]]></screen>
1504
1505<para>is printed <quote>1992, 1994</quote>.</para>
1506
1507<para>This template assumes that all the year elements contain only
1508decimal year numbers, that the elements are sorted in increasing
1509numerical order, that there are no duplicates, and that all the years
1510are expressed in full <quote>century+year</quote>
1511(<quote>1999</quote> not <quote>99</quote>) notation.</para>
1512</refdescription>
1513
1514<refparameter id="copyright.years-params">
1515<variablelist>
1516<varlistentry><term>years</term>
1517<listitem>
1518<para>The initial set of year elements.</para>
1519</listitem>
1520</varlistentry>
1521<varlistentry><term>print.ranges</term>
1522<listitem>
1523<para>If non-zero, multi-year ranges are collapsed. If zero, all years
1524are printed discretely.</para>
1525</listitem>
1526</varlistentry>
1527<varlistentry><term>single.year.ranges</term>
1528<listitem>
1529<para>If non-zero, two consecutive years will be printed as a range,
1530otherwise, they will be printed discretely. In other words, a single
1531year range is <quote>1991-1992</quote> but discretely it's
1532<quote>1991, 1992</quote>.</para>
1533</listitem>
1534</varlistentry>
1535</variablelist>
1536</refparameter>
1537
1538<refreturn id="copyright.years-returns">
1539<para>This template returns the formatted list of years.</para>
1540</refreturn>
1541</doc:template>
1542
1543<xsl:template name="copyright.years">
1544  <xsl:param name="years"/>
1545  <xsl:param name="print.ranges" select="1"/>
1546  <xsl:param name="single.year.ranges" select="0"/>
1547  <xsl:param name="firstyear" select="0"/>
1548  <xsl:param name="nextyear" select="0"/>
1549
1550  <!--
1551  <xsl:message terminate="no">
1552    <xsl:text>CY: </xsl:text>
1553    <xsl:value-of select="count($years)"/>
1554    <xsl:text>, </xsl:text>
1555    <xsl:value-of select="$firstyear"/>
1556    <xsl:text>, </xsl:text>
1557    <xsl:value-of select="$nextyear"/>
1558    <xsl:text>, </xsl:text>
1559    <xsl:value-of select="$print.ranges"/>
1560    <xsl:text>, </xsl:text>
1561    <xsl:value-of select="$single.year.ranges"/>
1562    <xsl:text> (</xsl:text>
1563    <xsl:value-of select="$years[1]"/>
1564    <xsl:text>)</xsl:text>
1565  </xsl:message>
1566  -->
1567
1568  <xsl:choose>
1569    <xsl:when test="$print.ranges = 0 and count($years) &gt; 0">
1570      <xsl:choose>
1571        <xsl:when test="count($years) = 1">
1572          <xsl:apply-templates select="$years[1]" mode="titlepage.mode"/>
1573        </xsl:when>
1574        <xsl:otherwise>
1575          <xsl:apply-templates select="$years[1]" mode="titlepage.mode"/>
1576          <xsl:text>, </xsl:text>
1577          <xsl:call-template name="copyright.years">
1578            <xsl:with-param name="years"
1579                            select="$years[position() &gt; 1]"/>
1580            <xsl:with-param name="print.ranges" select="$print.ranges"/>
1581            <xsl:with-param name="single.year.ranges"
1582                            select="$single.year.ranges"/>
1583          </xsl:call-template>
1584        </xsl:otherwise>
1585      </xsl:choose>
1586    </xsl:when>
1587    <xsl:when test="count($years) = 0">
1588      <xsl:variable name="lastyear" select="$nextyear - 1"/>
1589      <xsl:choose>
1590        <xsl:when test="$firstyear = 0">
1591          <!-- there weren't any years at all -->
1592        </xsl:when>
1593        <xsl:when test="$firstyear = $lastyear">
1594          <xsl:value-of select="$firstyear"/>
1595        </xsl:when>
1596        <xsl:when test="$single.year.ranges = 0
1597                        and $lastyear = $firstyear + 1">
1598          <xsl:value-of select="$firstyear"/>
1599          <xsl:text>, </xsl:text>
1600          <xsl:value-of select="$lastyear"/>
1601        </xsl:when>
1602        <xsl:otherwise>
1603          <xsl:value-of select="$firstyear"/>
1604          <xsl:text>-</xsl:text>
1605          <xsl:value-of select="$lastyear"/>
1606        </xsl:otherwise>
1607      </xsl:choose>
1608    </xsl:when>
1609    <xsl:when test="$firstyear = 0">
1610      <xsl:call-template name="copyright.years">
1611        <xsl:with-param name="years"
1612                        select="$years[position() &gt; 1]"/>
1613        <xsl:with-param name="firstyear" select="$years[1]"/>
1614        <xsl:with-param name="nextyear" select="$years[1] + 1"/>
1615        <xsl:with-param name="print.ranges" select="$print.ranges"/>
1616        <xsl:with-param name="single.year.ranges"
1617                        select="$single.year.ranges"/>
1618      </xsl:call-template>
1619    </xsl:when>
1620    <xsl:when test="$nextyear = $years[1]">
1621      <xsl:call-template name="copyright.years">
1622        <xsl:with-param name="years"
1623                        select="$years[position() &gt; 1]"/>
1624        <xsl:with-param name="firstyear" select="$firstyear"/>
1625        <xsl:with-param name="nextyear" select="$nextyear + 1"/>
1626        <xsl:with-param name="print.ranges" select="$print.ranges"/>
1627        <xsl:with-param name="single.year.ranges"
1628                        select="$single.year.ranges"/>
1629      </xsl:call-template>
1630    </xsl:when>
1631    <xsl:otherwise>
1632      <!-- we have years left, but they aren't in the current range -->
1633      <xsl:choose>
1634        <xsl:when test="$nextyear = $firstyear + 1">
1635          <xsl:value-of select="$firstyear"/>
1636          <xsl:text>, </xsl:text>
1637        </xsl:when>
1638        <xsl:when test="$single.year.ranges = 0
1639                        and $nextyear = $firstyear + 2">
1640          <xsl:value-of select="$firstyear"/>
1641          <xsl:text>, </xsl:text>
1642          <xsl:value-of select="$nextyear - 1"/>
1643          <xsl:text>, </xsl:text>
1644        </xsl:when>
1645        <xsl:otherwise>
1646          <xsl:value-of select="$firstyear"/>
1647          <xsl:text>-</xsl:text>
1648          <xsl:value-of select="$nextyear - 1"/>
1649          <xsl:text>, </xsl:text>
1650        </xsl:otherwise>
1651      </xsl:choose>
1652      <xsl:call-template name="copyright.years">
1653        <xsl:with-param name="years"
1654                        select="$years[position() &gt; 1]"/>
1655        <xsl:with-param name="firstyear" select="$years[1]"/>
1656        <xsl:with-param name="nextyear" select="$years[1] + 1"/>
1657        <xsl:with-param name="print.ranges" select="$print.ranges"/>
1658        <xsl:with-param name="single.year.ranges"
1659                        select="$single.year.ranges"/>
1660      </xsl:call-template>
1661    </xsl:otherwise>
1662  </xsl:choose>
1663</xsl:template>
1664
1665<!-- ====================================================================== -->
1666
1667<doc:template name="find.path.params" xmlns="">
1668<refpurpose>Search in a table for the "best" match for the node</refpurpose>
1669
1670<refdescription id="find.path.params-desc">
1671<para>This template searches in a table for the value that most-closely
1672(in the typical best-match sense of XSLT) matches the current (element)
1673node location.</para>
1674</refdescription>
1675</doc:template>
1676
1677<xsl:template name="find.path.params">
1678  <xsl:param name="node" select="."/>
1679  <xsl:param name="table" select="''"/>
1680  <xsl:param name="location">
1681    <xsl:call-template name="xpath.location">
1682      <xsl:with-param name="node" select="$node"/>
1683    </xsl:call-template>
1684  </xsl:param>
1685
1686  <xsl:variable name="value">
1687    <xsl:call-template name="lookup.key">
1688      <xsl:with-param name="key" select="$location"/>
1689      <xsl:with-param name="table" select="$table"/>
1690    </xsl:call-template>
1691  </xsl:variable>
1692
1693  <xsl:choose>
1694    <xsl:when test="$value != ''">
1695      <xsl:value-of select="$value"/>
1696    </xsl:when>
1697    <xsl:when test="contains($location, '/')">
1698      <xsl:call-template name="find.path.params">
1699        <xsl:with-param name="node" select="$node"/>
1700        <xsl:with-param name="table" select="$table"/>
1701        <xsl:with-param name="location" select="substring-after($location, '/')"/>
1702      </xsl:call-template>
1703    </xsl:when>
1704  </xsl:choose>
1705</xsl:template>
1706
1707<xsl:template name="relative-uri">
1708  <xsl:param name="filename" select="."/>
1709  <xsl:param name="destdir" select="''"/>
1710 
1711  <xsl:variable name="srcurl">
1712    <xsl:call-template name="strippath">
1713      <xsl:with-param name="filename">
1714        <xsl:call-template name="xml.base.dirs">
1715          <xsl:with-param name="base.elem" 
1716                          select="$filename/ancestor-or-self::*
1717                                   [@xml:base != ''][1]"/>
1718        </xsl:call-template>
1719        <xsl:value-of select="$filename"/>
1720      </xsl:with-param>
1721    </xsl:call-template>
1722  </xsl:variable>
1723
1724  <xsl:variable name="srcurl.trimmed">
1725    <xsl:call-template name="trim.common.uri.paths">
1726      <xsl:with-param name="uriA" select="$srcurl"/>
1727      <xsl:with-param name="uriB" select="$destdir"/>
1728      <xsl:with-param name="return" select="'A'"/>
1729    </xsl:call-template>
1730  </xsl:variable>
1731
1732  <xsl:variable name="destdir.trimmed">
1733    <xsl:call-template name="trim.common.uri.paths">
1734      <xsl:with-param name="uriA" select="$srcurl"/>
1735      <xsl:with-param name="uriB" select="$destdir"/>
1736      <xsl:with-param name="return" select="'B'"/>
1737    </xsl:call-template>
1738  </xsl:variable>
1739
1740  <xsl:variable name="depth">
1741    <xsl:call-template name="count.uri.path.depth">
1742      <xsl:with-param name="filename" select="$destdir.trimmed"/>
1743    </xsl:call-template>
1744  </xsl:variable>
1745
1746  <xsl:call-template name="copy-string">
1747    <xsl:with-param name="string" select="'../'"/>
1748    <xsl:with-param name="count" select="$depth"/>
1749  </xsl:call-template>
1750  <xsl:value-of select="$srcurl.trimmed"/>
1751
1752</xsl:template>
1753
1754<!-- ===================================== -->
1755
1756<xsl:template name="xml.base.dirs">
1757  <xsl:param name="base.elem" select="NONODE"/>
1758
1759  <!-- Recursively resolve xml:base attributes, up to a
1760       full path with : in uri -->
1761  <xsl:if test="$base.elem/ancestor::*[@xml:base != ''] and
1762                not(contains($base.elem/@xml:base, ':'))">
1763    <xsl:call-template name="xml.base.dirs">
1764      <xsl:with-param name="base.elem" 
1765                      select="$base.elem/ancestor::*[@xml:base != ''][1]"/>
1766    </xsl:call-template>
1767  </xsl:if>
1768  <xsl:call-template name="getdir">
1769    <xsl:with-param name="filename" select="$base.elem/@xml:base"/>
1770  </xsl:call-template>
1771
1772</xsl:template>
1773
1774<!-- ===================================== -->
1775
1776<xsl:template name="strippath">
1777  <xsl:param name="filename" select="''"/>
1778  <xsl:choose>
1779    <!-- Leading .. are not eliminated -->
1780    <xsl:when test="starts-with($filename, '../')">
1781      <xsl:value-of select="'../'"/>
1782      <xsl:call-template name="strippath">
1783        <xsl:with-param name="filename" select="substring-after($filename, '../')"/>
1784      </xsl:call-template>
1785    </xsl:when>
1786    <xsl:when test="contains($filename, '/../')">
1787      <xsl:call-template name="strippath">
1788        <xsl:with-param name="filename">
1789          <xsl:call-template name="getdir">
1790            <xsl:with-param name="filename" select="substring-before($filename, '/../')"/>
1791          </xsl:call-template>
1792          <xsl:value-of select="substring-after($filename, '/../')"/>
1793        </xsl:with-param>
1794      </xsl:call-template>
1795    </xsl:when>
1796    <xsl:otherwise>
1797      <xsl:value-of select="$filename"/>
1798    </xsl:otherwise>
1799  </xsl:choose>
1800</xsl:template>
1801
1802<!-- ===================================== -->
1803
1804<xsl:template name="getdir">
1805  <xsl:param name="filename" select="''"/>
1806  <xsl:if test="contains($filename, '/')">
1807    <xsl:value-of select="substring-before($filename, '/')"/>
1808    <xsl:text>/</xsl:text>
1809    <xsl:call-template name="getdir">
1810      <xsl:with-param name="filename" select="substring-after($filename, '/')"/>
1811    </xsl:call-template>
1812  </xsl:if>
1813</xsl:template>
1814
1815<!-- ===================================== -->
1816
1817<doc:template name="string.upper" xmlns="">
1818<refpurpose>Converts a string to all uppercase letters</refpurpose>
1819
1820<refdescription id="string.upper-desc">
1821<para>Given a string, this template does a language-aware conversion
1822of that string to all uppercase letters, based on the values of the
1823<literal>lowercase.alpha</literal> and
1824<literal>uppercase.alpha</literal> gentext keys for the current
1825locale. It affects only those characters found in the values of
1826<literal>lowercase.alpha</literal> and
1827<literal>uppercase.alpha</literal>. All other characters are left
1828unchanged.</para>
1829</refdescription>
1830
1831<refparameter id="string.upper-params">
1832<variablelist>
1833<varlistentry><term>string</term>
1834<listitem>
1835<para>The string to convert to uppercase.</para>
1836</listitem>
1837</varlistentry>
1838</variablelist>
1839</refparameter>
1840</doc:template>
1841<xsl:template name="string.upper">
1842  <xsl:param name="string" select="''"/>
1843  <xsl:variable name="lowercase.alpha">
1844    <xsl:call-template name="gentext">
1845      <xsl:with-param name="key" select="'lowercase.alpha'"/>
1846    </xsl:call-template>
1847  </xsl:variable>
1848  <xsl:variable name="uppercase.alpha">
1849    <xsl:call-template name="gentext">
1850      <xsl:with-param name="key" select="'uppercase.alpha'"/>
1851    </xsl:call-template>
1852  </xsl:variable>
1853  <xsl:value-of select="translate($string,$lowercase.alpha,$uppercase.alpha)"/>
1854</xsl:template>
1855
1856<!-- ===================================== -->
1857
1858<doc:template name="string.lower" xmlns="">
1859<refpurpose>Converts a string to all lowercase letters</refpurpose>
1860
1861<refdescription id="string.lower-desc">
1862<para>Given a string, this template does a language-aware conversion
1863of that string to all lowercase letters, based on the values of the
1864<literal>uppercase.alpha</literal> and
1865<literal>lowercase.alpha</literal> gentext keys for the current
1866locale. It affects only those characters found in the values of
1867<literal>uppercase.alpha</literal> and
1868<literal>lowercase.alpha</literal>. All other characters are left
1869unchanged.</para>
1870</refdescription>
1871
1872<refparameter id="string.lower-params">
1873<variablelist>
1874<varlistentry><term>string</term>
1875<listitem>
1876<para>The string to convert to lowercase.</para>
1877</listitem>
1878</varlistentry>
1879</variablelist>
1880</refparameter>
1881</doc:template>
1882<xsl:template name="string.lower">
1883  <xsl:param name="string" select="''"/>
1884  <xsl:variable name="uppercase.alpha">
1885    <xsl:call-template name="gentext">
1886      <xsl:with-param name="key" select="'uppercase.alpha'"/>
1887    </xsl:call-template>
1888  </xsl:variable>
1889  <xsl:variable name="lowercase.alpha">
1890    <xsl:call-template name="gentext">
1891      <xsl:with-param name="key" select="'lowercase.alpha'"/>
1892    </xsl:call-template>
1893  </xsl:variable>
1894  <xsl:value-of select="translate($string,$uppercase.alpha,$lowercase.alpha)"/>
1895</xsl:template>
1896
1897<!-- ===================================== -->
1898
1899<doc:template name="select.choice.separator" xmlns="">
1900  <refpurpose>Returns localized choice separator</refpurpose>
1901  <refdescription id="select.choice.separator-desc">
1902    <para>This template enables auto-generation of an appropriate
1903    localized "choice" separator (for example, "and" or "or") before
1904    the final item in an inline list (though it could also be useful
1905    for generating choice separators for non-inline lists).</para>
1906
1907    <para>It currently works by evaluating a processing instruction
1908    (PI) of the form &lt;?dbchoice&#xa0;choice="foo"?> :
1909
1910    <itemizedlist>
1911      <listitem>
1912        <simpara>if the value of the <sgmltag>choice</sgmltag>
1913        pseudo-attribute is "and" or "or", returns a localized "and"
1914        or "or"</simpara>
1915      </listitem>
1916      <listitem>
1917        <simpara>otherwise returns the literal value of the
1918        <sgmltag>choice</sgmltag> pseudo-attribute</simpara>
1919      </listitem>
1920    </itemizedlist>
1921
1922    The latter is provided only as a temporary workaround because the
1923    locale files do not currently have translations for the word
1924    <wordasword>or</wordasword>. So if you want to generate a a
1925    logical "or" separator in French (for example), you currently need
1926    to do this:
1927
1928    <literallayout>&lt;?dbchoice choice="ou"?></literallayout>
1929    </para>
1930
1931    <warning>
1932      <para>The <sgmltag>dbchoice</sgmltag> processing instruction is
1933      an unfortunate hack; support for it may disappear in the future
1934      (particularly if and when a more appropriate means for marking
1935      up "choice" lists becomes available in DocBook).</para>
1936    </warning>
1937  </refdescription>
1938</doc:template>
1939<xsl:template name="select.choice.separator">
1940 
1941  <xsl:variable name="choice">
1942    <xsl:call-template name="pi-attribute">
1943      <xsl:with-param name="pis" select="processing-instruction('dbchoice')"/>
1944      <xsl:with-param name="attribute">choice</xsl:with-param>
1945    </xsl:call-template>
1946  </xsl:variable>
1947 
1948  <xsl:choose>
1949    <!-- if value of $choice is "and" or "or", translate to equivalent in -->
1950    <!-- current locale -->
1951    <xsl:when test="$choice = 'and' or $choice = 'or'">
1952      <xsl:call-template name="gentext">
1953        <xsl:with-param name="key" select="$choice"/>
1954      </xsl:call-template>
1955    </xsl:when>
1956    <!--  otherwise, just output value of $choice, whatever it is -->
1957    <xsl:otherwise>
1958      <xsl:value-of select="$choice"/>
1959    </xsl:otherwise>
1960  </xsl:choose>
1961</xsl:template>
1962
1963<!-- ===================================== -->
1964
1965<doc:template name="evaluate.info.profile" xmlns="">
1966  <refpurpose>Evaluates an info profile</refpurpose>
1967  <refdescription id="evaluate.info.profile-desc">
1968    <para>This template evaluates an "info profile" matching the XPath
1969    expression given by the <parameter>profile</parameter>
1970    parameter. It relies on the XSLT <function>evaluate()</function>
1971    extension function.</para>
1972
1973    <para>The value of the <parameter>profile</parameter> parameter
1974    can include the literal string <literal>$info</literal>. If found
1975    in the value of the <parameter>profile</parameter> parameter, the
1976    literal string <literal>$info</literal> string is replaced with
1977    the value of the <parameter>info</parameter> parameter, which
1978    should be a set of <replaceable>*info</replaceable> nodes; the
1979    expression is then evaluated using the XSLT
1980    <function>evaluate()</function> extension function.</para>
1981  </refdescription>
1982  <refparameter id="evaluate.info.profile-params">
1983    <variablelist>
1984       <varlistentry>
1985        <term>profile</term>
1986        <listitem>
1987          <para>A string representing an XPath expression </para>
1988        </listitem>
1989      </varlistentry>
1990       <varlistentry>
1991        <term>info</term>
1992        <listitem>
1993          <para>A set of *info nodes</para>
1994        </listitem>
1995      </varlistentry>
1996    </variablelist>
1997  </refparameter>
1998
1999  <refreturn id="evaluate.info.profile-returns">
2000    <para>Returns a node (the result of evaluating the
2001    <parameter>profile</parameter> parameter)</para>
2002  </refreturn>
2003</doc:template>
2004  <xsl:template name="evaluate.info.profile">
2005    <xsl:param name="profile"/>
2006    <xsl:param name="info"/>
2007    <xsl:choose>
2008      <!-- * xsltproc and Xalan both support dyn:evaluate() -->
2009      <xsl:when test="function-available('dyn:evaluate')">
2010        <xsl:apply-templates
2011            select="dyn:evaluate($profile)" mode="get.refentry.metadata"/>
2012      </xsl:when>
2013      <!-- * Saxon has its own evaluate() & doesn't support dyn:evaluate() -->
2014      <xsl:when test="function-available('saxon:evaluate')">
2015        <xsl:apply-templates
2016            select="saxon:evaluate($profile)" mode="get.refentry.metadata"/>
2017      </xsl:when>
2018      <xsl:otherwise>
2019        <xsl:message terminate="yes">
2020Error: The "info profiling" mechanism currently requires an XSLT
2021engine that supports the evaluate() XSLT extension function. Your XSLT
2022engine does not support it.
2023</xsl:message>
2024      </xsl:otherwise>
2025    </xsl:choose>
2026  </xsl:template>
2027
2028</xsl:stylesheet>
Note: See TracBrowser for help on using the repository browser.