source: stylesheets/lfs-xsl/docbook-xsl-1.78.1/common/common.xsl@ 15c7d39

10.0 10.0-rc1 10.1 10.1-rc1 11.0 11.0-rc1 11.0-rc2 11.0-rc3 11.1 11.1-rc1 11.2 11.2-rc1 11.3 11.3-rc1 12.0 12.0-rc1 12.1 12.1-rc1 7.5 7.6 7.7 7.8 7.9 8.0 8.1 8.2 8.3 8.4 9.0 9.1 arm bdubbs/gcc13 ml-11.0 multilib renodr/libudev-from-systemd s6-init trunk xry111/arm64 xry111/arm64-12.0 xry111/clfs-ng xry111/lfs-next xry111/loongarch xry111/loongarch-12.0 xry111/loongarch-12.1 xry111/mips64el xry111/pip3 xry111/rust-wip-20221008 xry111/update-glibc
Last change on this file since 15c7d39 was 15c7d39, checked in by Matthew Burgess <matthew@…>, 11 years ago

Update stylesheets to docbook-xsl-1.78.1.

git-svn-id: http://svn.linuxfromscratch.org/LFS/trunk/BOOK@10355 4aa44e1e-78dd-0310-a6d2-fbcd4c07a689

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