source: trunk/lib/docbook/docbook/xsl/html/chunk-common.xsl @ 3283

Last change on this file since 3283 was 3283, checked in by Jari Häkkinen, 14 years ago

Removing stray carriage returns. Setting proper eol-style.

  • Property svn:eol-style set to native
File size: 45.3 KB
Line 
1<?xml version="1.0"?>
2<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
3                version="1.0">
4
5<!-- ********************************************************************
6     $Id: chunk-common.xsl 6403 2006-11-12 08:23:54Z bobstayton $
7     ********************************************************************
8
9     This file is part of the XSL DocBook Stylesheet distribution.
10     See ../README or http://nwalsh.com/docbook/xsl/ for copyright
11     and other information.
12
13     ******************************************************************** -->
14
15<!-- ==================================================================== -->
16
17<xsl:template name="chunk">
18  <xsl:param name="node" select="."/>
19  <!-- returns 1 if $node is a chunk -->
20
21  <!-- ==================================================================== -->
22  <!-- What's a chunk?
23
24       The root element
25       appendix
26       article
27       bibliography  in article or part or book
28       book
29       chapter
30       colophon
31       glossary      in article or part or book
32       index         in article or part or book
33       part
34       preface
35       refentry
36       reference
37       sect{1,2,3,4,5}  if position()>1 && depth < chunk.section.depth
38       section          if position()>1 && depth < chunk.section.depth
39       set
40       setindex
41                                                                            -->
42  <!-- ==================================================================== -->
43
44<!--
45  <xsl:message>
46    <xsl:text>chunk: </xsl:text>
47    <xsl:value-of select="name($node)"/>
48    <xsl:text>(</xsl:text>
49    <xsl:value-of select="$node/@id"/>
50    <xsl:text>)</xsl:text>
51    <xsl:text> csd: </xsl:text>
52    <xsl:value-of select="$chunk.section.depth"/>
53    <xsl:text> cfs: </xsl:text>
54    <xsl:value-of select="$chunk.first.sections"/>
55    <xsl:text> ps: </xsl:text>
56    <xsl:value-of select="count($node/parent::section)"/>
57    <xsl:text> prs: </xsl:text>
58    <xsl:value-of select="count($node/preceding-sibling::section)"/>
59  </xsl:message>
60-->
61
62  <xsl:choose>
63    <xsl:when test="not($node/parent::*)">1</xsl:when>
64
65    <xsl:when test="local-name($node) = 'sect1'
66                    and $chunk.section.depth &gt;= 1
67                    and ($chunk.first.sections != 0
68                         or count($node/preceding-sibling::sect1) &gt; 0)">
69      <xsl:text>1</xsl:text>
70    </xsl:when>
71    <xsl:when test="local-name($node) = 'sect2'
72                    and $chunk.section.depth &gt;= 2
73                    and ($chunk.first.sections != 0
74                         or count($node/preceding-sibling::sect2) &gt; 0)">
75      <xsl:call-template name="chunk">
76        <xsl:with-param name="node" select="$node/parent::*"/>
77      </xsl:call-template>
78    </xsl:when>
79    <xsl:when test="local-name($node) = 'sect3'
80                    and $chunk.section.depth &gt;= 3
81                    and ($chunk.first.sections != 0
82                         or count($node/preceding-sibling::sect3) &gt; 0)">
83      <xsl:call-template name="chunk">
84        <xsl:with-param name="node" select="$node/parent::*"/>
85      </xsl:call-template>
86    </xsl:when>
87    <xsl:when test="local-name($node) = 'sect4'
88                    and $chunk.section.depth &gt;= 4
89                    and ($chunk.first.sections != 0
90                         or count($node/preceding-sibling::sect4) &gt; 0)">
91      <xsl:call-template name="chunk">
92        <xsl:with-param name="node" select="$node/parent::*"/>
93      </xsl:call-template>
94    </xsl:when>
95    <xsl:when test="local-name($node) = 'sect5'
96                    and $chunk.section.depth &gt;= 5
97                    and ($chunk.first.sections != 0
98                         or count($node/preceding-sibling::sect5) &gt; 0)">
99      <xsl:call-template name="chunk">
100        <xsl:with-param name="node" select="$node/parent::*"/>
101      </xsl:call-template>
102    </xsl:when>
103    <xsl:when test="local-name($node) = 'section'
104                    and $chunk.section.depth &gt;= count($node/ancestor::section)+1
105                    and ($chunk.first.sections != 0
106                         or count($node/preceding-sibling::section) &gt; 0)">
107      <xsl:call-template name="chunk">
108        <xsl:with-param name="node" select="$node/parent::*"/>
109      </xsl:call-template>
110    </xsl:when>
111
112    <xsl:when test="local-name($node)='preface'">1</xsl:when>
113    <xsl:when test="local-name($node)='chapter'">1</xsl:when>
114    <xsl:when test="local-name($node)='appendix'">1</xsl:when>
115    <xsl:when test="local-name($node)='article'">1</xsl:when>
116    <xsl:when test="local-name($node)='part'">1</xsl:when>
117    <xsl:when test="local-name($node)='reference'">1</xsl:when>
118    <xsl:when test="local-name($node)='refentry'">1</xsl:when>
119    <xsl:when test="local-name($node)='index' and ($generate.index != 0 or count($node/*) > 0)
120                    and (local-name($node/parent::*) = 'article'
121                    or local-name($node/parent::*) = 'book'
122                    or local-name($node/parent::*) = 'part'
123                    )">1</xsl:when>
124    <xsl:when test="local-name($node)='bibliography'
125                    and (local-name($node/parent::*) = 'article'
126                    or local-name($node/parent::*) = 'book'
127                    or local-name($node/parent::*) = 'part'
128                    )">1</xsl:when>
129    <xsl:when test="local-name($node)='glossary'
130                    and (local-name($node/parent::*) = 'article'
131                    or local-name($node/parent::*) = 'book'
132                    or local-name($node/parent::*) = 'part'
133                    )">1</xsl:when>
134    <xsl:when test="local-name($node)='colophon'">1</xsl:when>
135    <xsl:when test="local-name($node)='book'">1</xsl:when>
136    <xsl:when test="local-name($node)='set'">1</xsl:when>
137    <xsl:when test="local-name($node)='setindex'">1</xsl:when>
138    <xsl:when test="local-name($node)='legalnotice'
139                    and $generate.legalnotice.link != 0">1</xsl:when>
140    <xsl:otherwise>0</xsl:otherwise>
141  </xsl:choose>
142</xsl:template>
143
144<!-- ==================================================================== -->
145
146<xsl:template match="*" mode="chunk-filename">
147  <!-- returns the filename of a chunk -->
148  <xsl:variable name="ischunk">
149    <xsl:call-template name="chunk"/>
150  </xsl:variable>
151
152  <xsl:variable name="fn">
153    <xsl:apply-templates select="." mode="recursive-chunk-filename"/>
154  </xsl:variable>
155
156  <!--
157  <xsl:message>
158    <xsl:value-of select="$ischunk"/>
159    <xsl:text> (</xsl:text>
160    <xsl:value-of select="local-name(.)"/>
161    <xsl:text>) </xsl:text>
162    <xsl:value-of select="$fn"/>
163    <xsl:text>, </xsl:text>
164    <xsl:call-template name="dbhtml-dir"/>
165  </xsl:message>
166  -->
167
168  <!-- 2003-11-25 by ndw:
169       The following test used to read test="$ischunk != 0 and $fn != ''"
170       I've removed the ischunk part of the test so that href.to.uri and
171       href.from.uri will be fully qualified even if the source or target
172       isn't a chunk. I *think* that if $fn != '' then it's appropriate
173       to put the directory on the front, even if the element isn't a
174       chunk. I could be wrong. -->
175
176  <xsl:if test="$fn != ''">
177    <xsl:call-template name="dbhtml-dir"/>
178  </xsl:if>
179
180  <xsl:value-of select="$fn"/>
181  <!-- You can't add the html.ext here because dbhtml filename= may already -->
182  <!-- have added it. It really does have to be handled in the recursive template -->
183</xsl:template>
184
185<xsl:template match="*" mode="recursive-chunk-filename">
186  <xsl:param name="recursive" select="false()"/>
187
188  <!-- returns the filename of a chunk -->
189  <xsl:variable name="ischunk">
190    <xsl:call-template name="chunk"/>
191  </xsl:variable>
192
193  <xsl:variable name="dbhtml-filename">
194    <xsl:call-template name="dbhtml-filename"/>
195  </xsl:variable>
196
197  <xsl:variable name="filename">
198    <xsl:choose>
199      <xsl:when test="$dbhtml-filename != ''">
200        <xsl:value-of select="$dbhtml-filename"/>
201      </xsl:when>
202      <!-- if this is the root element, use the root.filename -->
203      <xsl:when test="not(parent::*) and $root.filename != ''">
204        <xsl:value-of select="$root.filename"/>
205        <xsl:value-of select="$html.ext"/>
206      </xsl:when>
207      <!-- Special case -->
208      <xsl:when test="self::legalnotice and $generate.legalnotice.link != 0">
209        <xsl:variable name="id">
210          <xsl:call-template name="object.id"/>
211        </xsl:variable>
212        <xsl:value-of select="concat('ln-',$id,$html.ext)"/>
213      </xsl:when>
214      <!-- if there's no dbhtml filename, and if we're to use IDs as -->
215      <!-- filenames, then use the ID to generate the filename. -->
216      <xsl:when test="(@id or @xml:id) and $use.id.as.filename != 0">
217        <xsl:value-of select="(@id|@xml:id)[1]"/>
218        <xsl:value-of select="$html.ext"/>
219      </xsl:when>
220      <xsl:otherwise></xsl:otherwise>
221    </xsl:choose>
222  </xsl:variable>
223
224  <xsl:choose>
225    <xsl:when test="$ischunk='0'">
226      <!-- if called on something that isn't a chunk, walk up... -->
227      <xsl:choose>
228        <xsl:when test="count(parent::*)>0">
229          <xsl:apply-templates mode="recursive-chunk-filename" select="parent::*">
230            <xsl:with-param name="recursive" select="$recursive"/>
231          </xsl:apply-templates>
232        </xsl:when>
233        <!-- unless there is no up, in which case return "" -->
234        <xsl:otherwise></xsl:otherwise>
235      </xsl:choose>
236    </xsl:when>
237
238    <xsl:when test="not($recursive) and $filename != ''">
239      <!-- if this chunk has an explicit name, use it -->
240      <xsl:value-of select="$filename"/>
241    </xsl:when>
242
243    <xsl:when test="self::set">
244      <xsl:value-of select="$root.filename"/>
245      <xsl:if test="not($recursive)">
246        <xsl:value-of select="$html.ext"/>
247      </xsl:if>
248    </xsl:when>
249
250    <xsl:when test="self::book">
251      <xsl:text>bk</xsl:text>
252      <xsl:number level="any" format="01"/>
253      <xsl:if test="not($recursive)">
254        <xsl:value-of select="$html.ext"/>
255      </xsl:if>
256    </xsl:when>
257
258    <xsl:when test="self::article">
259      <xsl:if test="/set">
260        <!-- in a set, make sure we inherit the right book info... -->
261        <xsl:apply-templates mode="recursive-chunk-filename" select="parent::*">
262          <xsl:with-param name="recursive" select="true()"/>
263        </xsl:apply-templates>
264      </xsl:if>
265
266      <xsl:text>ar</xsl:text>
267      <xsl:number level="any" format="01" from="book"/>
268      <xsl:if test="not($recursive)">
269        <xsl:value-of select="$html.ext"/>
270      </xsl:if>
271    </xsl:when>
272
273    <xsl:when test="self::preface">
274      <xsl:if test="/set">
275        <!-- in a set, make sure we inherit the right book info... -->
276        <xsl:apply-templates mode="recursive-chunk-filename" select="parent::*">
277          <xsl:with-param name="recursive" select="true()"/>
278        </xsl:apply-templates>
279      </xsl:if>
280
281      <xsl:text>pr</xsl:text>
282      <xsl:number level="any" format="01" from="book"/>
283      <xsl:if test="not($recursive)">
284        <xsl:value-of select="$html.ext"/>
285      </xsl:if>
286    </xsl:when>
287
288    <xsl:when test="self::chapter">
289      <xsl:if test="/set">
290        <!-- in a set, make sure we inherit the right book info... -->
291        <xsl:apply-templates mode="recursive-chunk-filename" select="parent::*">
292          <xsl:with-param name="recursive" select="true()"/>
293        </xsl:apply-templates>
294      </xsl:if>
295
296      <xsl:text>ch</xsl:text>
297      <xsl:number level="any" format="01" from="book"/>
298      <xsl:if test="not($recursive)">
299        <xsl:value-of select="$html.ext"/>
300      </xsl:if>
301    </xsl:when>
302
303    <xsl:when test="self::appendix">
304      <xsl:if test="/set">
305        <!-- in a set, make sure we inherit the right book info... -->
306        <xsl:apply-templates mode="recursive-chunk-filename" select="parent::*">
307          <xsl:with-param name="recursive" select="true()"/>
308        </xsl:apply-templates>
309      </xsl:if>
310
311      <xsl:text>ap</xsl:text>
312      <xsl:number level="any" format="a" from="book"/>
313      <xsl:if test="not($recursive)">
314        <xsl:value-of select="$html.ext"/>
315      </xsl:if>
316    </xsl:when>
317
318    <xsl:when test="self::part">
319      <xsl:choose>
320        <xsl:when test="/set">
321          <!-- in a set, make sure we inherit the right book info... -->
322          <xsl:apply-templates mode="recursive-chunk-filename" select="parent::*">
323            <xsl:with-param name="recursive" select="true()"/>
324          </xsl:apply-templates>
325        </xsl:when>
326        <xsl:otherwise>
327        </xsl:otherwise>
328      </xsl:choose>
329
330      <xsl:text>pt</xsl:text>
331      <xsl:number level="any" format="01" from="book"/>
332      <xsl:if test="not($recursive)">
333        <xsl:value-of select="$html.ext"/>
334      </xsl:if>
335    </xsl:when>
336
337    <xsl:when test="self::reference">
338      <xsl:choose>
339        <xsl:when test="/set">
340          <!-- in a set, make sure we inherit the right book info... -->
341          <xsl:apply-templates mode="recursive-chunk-filename" select="parent::*">
342            <xsl:with-param name="recursive" select="true()"/>
343          </xsl:apply-templates>
344        </xsl:when>
345        <xsl:otherwise>
346        </xsl:otherwise>
347      </xsl:choose>
348
349      <xsl:text>rn</xsl:text>
350      <xsl:number level="any" format="01" from="book"/>
351      <xsl:if test="not($recursive)">
352        <xsl:value-of select="$html.ext"/>
353      </xsl:if>
354    </xsl:when>
355
356    <xsl:when test="self::refentry">
357      <xsl:choose>
358        <xsl:when test="parent::reference">
359          <xsl:apply-templates mode="recursive-chunk-filename" select="parent::*">
360            <xsl:with-param name="recursive" select="true()"/>
361          </xsl:apply-templates>
362        </xsl:when>
363        <xsl:otherwise>
364        </xsl:otherwise>
365      </xsl:choose>
366
367      <xsl:text>re</xsl:text>
368      <xsl:number level="any" format="01" from="book"/>
369      <xsl:if test="not($recursive)">
370        <xsl:value-of select="$html.ext"/>
371      </xsl:if>
372    </xsl:when>
373
374    <xsl:when test="self::colophon">
375      <xsl:choose>
376        <xsl:when test="/set">
377          <!-- in a set, make sure we inherit the right book info... -->
378          <xsl:apply-templates mode="recursive-chunk-filename" select="parent::*">
379            <xsl:with-param name="recursive" select="true()"/>
380          </xsl:apply-templates>
381        </xsl:when>
382        <xsl:otherwise>
383        </xsl:otherwise>
384      </xsl:choose>
385
386      <xsl:text>co</xsl:text>
387      <xsl:number level="any" format="01" from="book"/>
388      <xsl:if test="not($recursive)">
389        <xsl:value-of select="$html.ext"/>
390      </xsl:if>
391    </xsl:when>
392
393    <xsl:when test="self::sect1
394                    or self::sect2
395                    or self::sect3
396                    or self::sect4
397                    or self::sect5
398                    or self::section">
399      <xsl:apply-templates mode="recursive-chunk-filename" select="parent::*">
400        <xsl:with-param name="recursive" select="true()"/>
401      </xsl:apply-templates>
402      <xsl:text>s</xsl:text>
403      <xsl:number format="01"/>
404      <xsl:if test="not($recursive)">
405        <xsl:value-of select="$html.ext"/>
406      </xsl:if>
407    </xsl:when>
408
409    <xsl:when test="self::bibliography">
410      <xsl:choose>
411        <xsl:when test="/set">
412          <!-- in a set, make sure we inherit the right book info... -->
413          <xsl:apply-templates mode="recursive-chunk-filename" select="parent::*">
414            <xsl:with-param name="recursive" select="true()"/>
415          </xsl:apply-templates>
416        </xsl:when>
417        <xsl:otherwise>
418        </xsl:otherwise>
419      </xsl:choose>
420
421      <xsl:text>bi</xsl:text>
422      <xsl:number level="any" format="01" from="book"/>
423      <xsl:if test="not($recursive)">
424        <xsl:value-of select="$html.ext"/>
425      </xsl:if>
426    </xsl:when>
427
428    <xsl:when test="self::glossary">
429      <xsl:choose>
430        <xsl:when test="/set">
431          <!-- in a set, make sure we inherit the right book info... -->
432          <xsl:apply-templates mode="recursive-chunk-filename" select="parent::*">
433            <xsl:with-param name="recursive" select="true()"/>
434          </xsl:apply-templates>
435        </xsl:when>
436        <xsl:otherwise>
437        </xsl:otherwise>
438      </xsl:choose>
439
440      <xsl:text>go</xsl:text>
441      <xsl:number level="any" format="01" from="book"/>
442      <xsl:if test="not($recursive)">
443        <xsl:value-of select="$html.ext"/>
444      </xsl:if>
445    </xsl:when>
446
447    <xsl:when test="self::index">
448      <xsl:choose>
449        <xsl:when test="/set">
450          <!-- in a set, make sure we inherit the right book info... -->
451          <xsl:apply-templates mode="recursive-chunk-filename" select="parent::*">
452            <xsl:with-param name="recursive" select="true()"/>
453          </xsl:apply-templates>
454        </xsl:when>
455        <xsl:otherwise>
456        </xsl:otherwise>
457      </xsl:choose>
458
459      <xsl:text>ix</xsl:text>
460      <xsl:number level="any" format="01" from="book"/>
461      <xsl:if test="not($recursive)">
462        <xsl:value-of select="$html.ext"/>
463      </xsl:if>
464    </xsl:when>
465
466    <xsl:when test="self::setindex">
467      <xsl:text>si</xsl:text>
468      <xsl:number level="any" format="01" from="set"/>
469      <xsl:if test="not($recursive)">
470        <xsl:value-of select="$html.ext"/>
471      </xsl:if>
472    </xsl:when>
473
474    <xsl:otherwise>
475      <xsl:text>chunk-filename-error-</xsl:text>
476      <xsl:value-of select="name(.)"/>
477      <xsl:number level="any" format="01" from="set"/>
478      <xsl:if test="not($recursive)">
479        <xsl:value-of select="$html.ext"/>
480      </xsl:if>
481    </xsl:otherwise>
482  </xsl:choose>
483</xsl:template>
484
485<!-- ==================================================================== -->
486
487<xsl:template name="href.target.uri">
488  <xsl:param name="object" select="."/>
489  <xsl:variable name="ischunk">
490    <xsl:call-template name="chunk">
491      <xsl:with-param name="node" select="$object"/>
492    </xsl:call-template>
493  </xsl:variable>
494
495  <xsl:apply-templates mode="chunk-filename" select="$object"/>
496
497  <xsl:if test="$ischunk='0'">
498    <xsl:text>#</xsl:text>
499    <xsl:call-template name="object.id">
500      <xsl:with-param name="object" select="$object"/>
501    </xsl:call-template>
502  </xsl:if>
503</xsl:template>
504
505<xsl:template name="href.target">
506  <xsl:param name="context" select="."/>
507  <xsl:param name="object" select="."/>
508
509  <xsl:variable name="href.to.uri">
510    <xsl:call-template name="href.target.uri">
511      <xsl:with-param name="object" select="$object"/>
512    </xsl:call-template>
513  </xsl:variable>
514
515  <xsl:variable name="href.from.uri">
516    <xsl:call-template name="href.target.uri">
517      <xsl:with-param name="object" select="$context"/>
518    </xsl:call-template>
519  </xsl:variable>
520 
521  <!--
522  <xsl:message>href.to.uri: <xsl:value-of select="$href.to.uri"/></xsl:message>
523  <xsl:message>href.from.uri: <xsl:value-of select="$href.from.uri"/></xsl:message>
524  -->
525
526  <xsl:variable name="href.to">
527    <xsl:call-template name="trim.common.uri.paths">
528      <xsl:with-param name="uriA" select="$href.to.uri"/>
529      <xsl:with-param name="uriB" select="$href.from.uri"/>
530      <xsl:with-param name="return" select="'A'"/>
531    </xsl:call-template>
532  </xsl:variable>
533
534  <xsl:variable name="href.from">
535    <xsl:call-template name="trim.common.uri.paths">
536      <xsl:with-param name="uriA" select="$href.to.uri"/>
537      <xsl:with-param name="uriB" select="$href.from.uri"/>
538      <xsl:with-param name="return" select="'B'"/>
539    </xsl:call-template>
540  </xsl:variable>
541
542  <xsl:variable name="depth">
543    <xsl:call-template name="count.uri.path.depth">
544      <xsl:with-param name="filename" select="$href.from"/>
545    </xsl:call-template>
546  </xsl:variable>
547
548  <xsl:variable name="href">
549    <xsl:call-template name="copy-string">
550      <xsl:with-param name="string" select="'../'"/>
551      <xsl:with-param name="count" select="$depth"/>
552    </xsl:call-template>
553    <xsl:value-of select="$href.to"/>
554  </xsl:variable>
555
556  <!--
557  <xsl:message>
558    <xsl:text>In </xsl:text>
559    <xsl:value-of select="name(.)"/>
560    <xsl:text> (</xsl:text>
561    <xsl:value-of select="$href.from"/>
562    <xsl:text>,</xsl:text>
563    <xsl:value-of select="$depth"/>
564    <xsl:text>) </xsl:text>
565    <xsl:value-of select="name($object)"/>
566    <xsl:text> href=</xsl:text>
567    <xsl:value-of select="$href"/>
568  </xsl:message>
569  -->
570
571  <xsl:value-of select="$href"/>
572</xsl:template>
573
574<!-- Returns the complete olink href value if found -->
575<!-- Must take into account any dbhtml dir of the chunk containing the olink -->
576<xsl:template name="make.olink.href">
577  <xsl:param name="olink.key" select="''"/>
578  <xsl:param name="target.database"/>
579
580  <xsl:if test="$olink.key != ''">
581    <xsl:variable name="target.href" >
582      <xsl:for-each select="$target.database" >
583        <xsl:value-of select="key('targetptr-key', $olink.key)/@href" />
584      </xsl:for-each>
585    </xsl:variable>
586 
587    <!-- an olink starting point may be in a subdirectory, so need
588         the "from" reference point to compute a relative path -->
589
590    <xsl:variable name="from.href">
591      <xsl:call-template name="olink.from.uri">
592        <xsl:with-param name="target.database" select="$target.database"/>
593        <xsl:with-param name="object" select="."/>
594        <xsl:with-param name="object.targetdoc" select="$current.docid"/>
595      </xsl:call-template>
596    </xsl:variable>
597
598    <!-- If the from.href has directory path, then must "../" upward
599         to document level -->
600    <xsl:variable name="upward.from.path">
601      <xsl:call-template name="upward.path">
602        <xsl:with-param name="path" select="$from.href"/>
603      </xsl:call-template>
604    </xsl:variable>
605
606    <xsl:variable name="targetdoc">
607      <xsl:value-of select="substring-before($olink.key, '/')"/>
608    </xsl:variable>
609 
610    <!-- Does the target database use a sitemap? -->
611    <xsl:variable name="use.sitemap">
612      <xsl:choose>
613        <xsl:when test="$target.database//sitemap">1</xsl:when>
614        <xsl:otherwise>0</xsl:otherwise>
615      </xsl:choose>
616    </xsl:variable>
617 
618 
619    <!-- Get the baseuri for this targetptr -->
620    <xsl:variable name="baseuri" >
621      <xsl:choose>
622        <!-- Does the database use a sitemap? -->
623        <xsl:when test="$use.sitemap != 0" >
624          <xsl:choose>
625            <!-- Was current.docid parameter set? -->
626            <xsl:when test="$current.docid != ''">
627              <!-- Was it found in the database? -->
628              <xsl:variable name="currentdoc.key" >
629                <xsl:for-each select="$target.database" >
630                  <xsl:value-of select="key('targetdoc-key',
631                                        $current.docid)/@targetdoc" />
632                </xsl:for-each>
633              </xsl:variable>
634              <xsl:choose>
635                <xsl:when test="$currentdoc.key != ''">
636                  <xsl:for-each select="$target.database" >
637                    <xsl:call-template name="targetpath" >
638                      <xsl:with-param name="dirnode" 
639                          select="key('targetdoc-key', $current.docid)/parent::dir"/>
640                      <xsl:with-param name="targetdoc" select="$targetdoc"/>
641                    </xsl:call-template>
642                  </xsl:for-each >
643                </xsl:when>
644                <xsl:otherwise>
645                  <xsl:message>
646                    <xsl:text>Olink error: cannot compute relative </xsl:text>
647                    <xsl:text>sitemap path because $current.docid '</xsl:text>
648                    <xsl:value-of select="$current.docid"/>
649                    <xsl:text>' not found in target database.</xsl:text>
650                  </xsl:message>
651                </xsl:otherwise>
652              </xsl:choose>
653            </xsl:when>
654            <xsl:otherwise>
655              <xsl:message>
656                <xsl:text>Olink warning: cannot compute relative </xsl:text>
657                <xsl:text>sitemap path without $current.docid parameter</xsl:text>
658              </xsl:message>
659            </xsl:otherwise>
660          </xsl:choose> 
661          <!-- In either case, add baseuri from its document entry-->
662          <xsl:variable name="docbaseuri">
663            <xsl:for-each select="$target.database" >
664              <xsl:value-of select="key('targetdoc-key', $targetdoc)/@baseuri" />
665            </xsl:for-each>
666          </xsl:variable>
667          <xsl:if test="$docbaseuri != ''" >
668            <xsl:value-of select="$docbaseuri"/>
669          </xsl:if>
670        </xsl:when>
671        <!-- No database sitemap in use -->
672        <xsl:otherwise>
673          <!-- Just use any baseuri from its document entry -->
674          <xsl:variable name="docbaseuri">
675            <xsl:for-each select="$target.database" >
676              <xsl:value-of select="key('targetdoc-key', $targetdoc)/@baseuri" />
677            </xsl:for-each>
678          </xsl:variable>
679          <xsl:if test="$docbaseuri != ''" >
680            <xsl:value-of select="$docbaseuri"/>
681          </xsl:if>
682        </xsl:otherwise>
683      </xsl:choose>
684    </xsl:variable>
685 
686    <!-- Form the href information -->
687    <xsl:if test="not(contains($baseuri, ':'))">
688      <!-- if not an absolute uri, add upward path from olink chunk -->
689      <xsl:value-of select="$upward.from.path"/>
690    </xsl:if>
691
692    <xsl:if test="$baseuri != ''">
693      <xsl:value-of select="$baseuri"/>
694      <xsl:if test="substring($target.href,1,1) != '#'">
695        <!--xsl:text>/</xsl:text-->
696      </xsl:if>
697    </xsl:if>
698    <!-- optionally turn off frag for PDF references -->
699    <xsl:if test="not($insert.olink.pdf.frag = 0 and
700          translate(substring($baseuri, string-length($baseuri) - 3),
701                    'PDF', 'pdf') = '.pdf'
702          and starts-with($target.href, '#') )">
703      <xsl:value-of select="$target.href"/>
704    </xsl:if>
705  </xsl:if>
706</xsl:template>
707
708<!-- Computes "../" to reach top -->
709<xsl:template name="upward.path">
710  <xsl:param name="path" select="''"/>
711  <xsl:choose> 
712    <!-- Don't bother with absolute uris -->
713    <xsl:when test="contains($path, ':')"/>
714    <xsl:when test="starts-with($path, '/')"/>
715    <xsl:when test="contains($path, '/')">
716      <xsl:text>../</xsl:text>
717      <xsl:call-template name="upward.path">
718        <xsl:with-param name="path" select="substring-after($path, '/')"/>
719      </xsl:call-template>
720    </xsl:when>
721  </xsl:choose>
722
723</xsl:template>
724
725<!-- ==================================================================== -->
726
727<xsl:template name="html.head">
728  <xsl:param name="prev" select="/foo"/>
729  <xsl:param name="next" select="/foo"/>
730  <xsl:variable name="this" select="."/>
731  <xsl:variable name="home" select="/*[1]"/>
732  <xsl:variable name="up" select="parent::*"/>
733
734  <head>
735    <xsl:call-template name="system.head.content"/>
736    <xsl:call-template name="head.content"/>
737
738    <xsl:if test="$home">
739      <link rel="start">
740        <xsl:attribute name="href">
741          <xsl:call-template name="href.target">
742            <xsl:with-param name="object" select="$home"/>
743          </xsl:call-template>
744        </xsl:attribute>
745        <xsl:attribute name="title">
746          <xsl:apply-templates select="$home"
747                               mode="object.title.markup.textonly"/>
748        </xsl:attribute>
749      </link>
750    </xsl:if>
751
752    <xsl:if test="$up">
753      <link rel="up">
754        <xsl:attribute name="href">
755          <xsl:call-template name="href.target">
756            <xsl:with-param name="object" select="$up"/>
757          </xsl:call-template>
758        </xsl:attribute>
759        <xsl:attribute name="title">
760          <xsl:apply-templates select="$up" mode="object.title.markup.textonly"/>
761        </xsl:attribute>
762      </link>
763    </xsl:if>
764
765    <xsl:if test="$prev">
766      <link rel="prev">
767        <xsl:attribute name="href">
768          <xsl:call-template name="href.target">
769            <xsl:with-param name="object" select="$prev"/>
770          </xsl:call-template>
771        </xsl:attribute>
772        <xsl:attribute name="title">
773          <xsl:apply-templates select="$prev" mode="object.title.markup.textonly"/>
774        </xsl:attribute>
775      </link>
776    </xsl:if>
777
778    <xsl:if test="$next">
779      <link rel="next">
780        <xsl:attribute name="href">
781          <xsl:call-template name="href.target">
782            <xsl:with-param name="object" select="$next"/>
783          </xsl:call-template>
784        </xsl:attribute>
785        <xsl:attribute name="title">
786          <xsl:apply-templates select="$next" mode="object.title.markup.textonly"/>
787        </xsl:attribute>
788      </link>
789    </xsl:if>
790
791    <xsl:if test="$html.extra.head.links != 0">
792      <xsl:for-each select="//part
793                            |//reference
794                            |//preface
795                            |//chapter
796                            |//article
797                            |//refentry
798                            |//appendix[not(parent::article)]|appendix
799                            |//glossary[not(parent::article)]|glossary
800                            |//index[not(parent::article)]|index">
801        <link rel="{local-name(.)}">
802          <xsl:attribute name="href">
803            <xsl:call-template name="href.target">
804              <xsl:with-param name="context" select="$this"/>
805              <xsl:with-param name="object" select="."/>
806            </xsl:call-template>
807          </xsl:attribute>
808          <xsl:attribute name="title">
809            <xsl:apply-templates select="." mode="object.title.markup.textonly"/>
810          </xsl:attribute>
811        </link>
812      </xsl:for-each>
813
814      <xsl:for-each select="section|sect1|refsection|refsect1">
815        <link>
816          <xsl:attribute name="rel">
817            <xsl:choose>
818              <xsl:when test="local-name($this) = 'section'
819                              or local-name($this) = 'refsection'">
820                <xsl:value-of select="'subsection'"/>
821              </xsl:when>
822              <xsl:otherwise>
823                <xsl:value-of select="'section'"/>
824              </xsl:otherwise>
825            </xsl:choose>
826          </xsl:attribute>
827          <xsl:attribute name="href">
828            <xsl:call-template name="href.target">
829              <xsl:with-param name="context" select="$this"/>
830              <xsl:with-param name="object" select="."/>
831            </xsl:call-template>
832          </xsl:attribute>
833          <xsl:attribute name="title">
834            <xsl:apply-templates select="." mode="object.title.markup.textonly"/>
835          </xsl:attribute>
836        </link>
837      </xsl:for-each>
838
839      <xsl:for-each select="sect2|sect3|sect4|sect5|refsect2|refsect3">
840        <link rel="subsection">
841          <xsl:attribute name="href">
842            <xsl:call-template name="href.target">
843              <xsl:with-param name="context" select="$this"/>
844              <xsl:with-param name="object" select="."/>
845            </xsl:call-template>
846          </xsl:attribute>
847          <xsl:attribute name="title">
848            <xsl:apply-templates select="." mode="object.title.markup.textonly"/>
849          </xsl:attribute>
850        </link>
851      </xsl:for-each>
852    </xsl:if>
853
854    <!-- * if we have a legalnotice and user wants it output as a -->
855    <!-- * separate page and $html.head.legalnotice.link.types is -->
856    <!-- * non-empty, we generate a link or links for each value in -->
857    <!-- * $html.head.legalnotice.link.types -->
858    <xsl:if test="//legalnotice
859                  and not($generate.legalnotice.link = 0)
860                  and not($html.head.legalnotice.link.types = '')">
861      <xsl:call-template name="make.legalnotice.head.links"/>
862    </xsl:if>
863
864    <xsl:call-template name="user.head.content"/>
865  </head>
866</xsl:template>
867
868<!-- ==================================================================== -->
869
870<xsl:template name="header.navigation">
871  <xsl:param name="prev" select="/foo"/>
872  <xsl:param name="next" select="/foo"/>
873  <xsl:param name="nav.context"/>
874
875  <xsl:variable name="home" select="/*[1]"/>
876  <xsl:variable name="up" select="parent::*"/>
877
878  <xsl:variable name="row1" select="$navig.showtitles != 0"/>
879  <xsl:variable name="row2" select="count($prev) &gt; 0
880                                    or (count($up) &gt; 0
881                                        and generate-id($up) != generate-id($home)
882                                        and $navig.showtitles != 0)
883                                    or count($next) &gt; 0"/>
884
885  <xsl:if test="$suppress.navigation = '0' and $suppress.header.navigation = '0'">
886    <div class="navheader">
887      <xsl:if test="$row1 or $row2">
888        <table width="100%" summary="Navigation header">
889          <xsl:if test="$row1">
890            <tr>
891              <th colspan="3" align="center">
892                <xsl:apply-templates select="." mode="object.title.markup"/>
893              </th>
894            </tr>
895          </xsl:if>
896
897          <xsl:if test="$row2">
898            <tr>
899              <td width="20%" align="left">
900                <xsl:if test="count($prev)>0">
901                  <a accesskey="p">
902                    <xsl:attribute name="href">
903                      <xsl:call-template name="href.target">
904                        <xsl:with-param name="object" select="$prev"/>
905                      </xsl:call-template>
906                    </xsl:attribute>
907                    <xsl:call-template name="navig.content">
908                      <xsl:with-param name="direction" select="'prev'"/>
909                    </xsl:call-template>
910                  </a>
911                </xsl:if>
912                <xsl:text>&#160;</xsl:text>
913              </td>
914              <th width="60%" align="center">
915                <xsl:choose>
916                  <xsl:when test="count($up) > 0
917                                  and generate-id($up) != generate-id($home)
918                                  and $navig.showtitles != 0">
919                    <xsl:apply-templates select="$up" mode="object.title.markup"/>
920                  </xsl:when>
921                  <xsl:otherwise>&#160;</xsl:otherwise>
922                </xsl:choose>
923              </th>
924              <td width="20%" align="right">
925                <xsl:text>&#160;</xsl:text>
926                <xsl:if test="count($next)>0">
927                  <a accesskey="n">
928                    <xsl:attribute name="href">
929                      <xsl:call-template name="href.target">
930                        <xsl:with-param name="object" select="$next"/>
931                      </xsl:call-template>
932                    </xsl:attribute>
933                    <xsl:call-template name="navig.content">
934                      <xsl:with-param name="direction" select="'next'"/>
935                    </xsl:call-template>
936                  </a>
937                </xsl:if>
938              </td>
939            </tr>
940          </xsl:if>
941        </table>
942      </xsl:if>
943      <xsl:if test="$header.rule != 0">
944        <hr/>
945      </xsl:if>
946    </div>
947  </xsl:if>
948</xsl:template>
949
950<!-- ==================================================================== -->
951
952<xsl:template name="footer.navigation">
953  <xsl:param name="prev" select="/foo"/>
954  <xsl:param name="next" select="/foo"/>
955  <xsl:param name="nav.context"/>
956
957  <xsl:variable name="home" select="/*[1]"/>
958  <xsl:variable name="up" select="parent::*"/>
959
960  <xsl:variable name="row1" select="count($prev) &gt; 0
961                                    or count($up) &gt; 0
962                                    or count($next) &gt; 0"/>
963
964  <xsl:variable name="row2" select="($prev and $navig.showtitles != 0)
965                                    or (generate-id($home) != generate-id(.)
966                                        or $nav.context = 'toc')
967                                    or ($chunk.tocs.and.lots != 0
968                                        and $nav.context != 'toc')
969                                    or ($next and $navig.showtitles != 0)"/>
970
971  <xsl:if test="$suppress.navigation = '0' and $suppress.footer.navigation = '0'">
972    <div class="navfooter">
973      <xsl:if test="$footer.rule != 0">
974        <hr/>
975      </xsl:if>
976
977      <xsl:if test="$row1 or $row2">
978        <table width="100%" summary="Navigation footer">
979          <xsl:if test="$row1">
980            <tr>
981              <td width="40%" align="left">
982                <xsl:if test="count($prev)>0">
983                  <a accesskey="p">
984                    <xsl:attribute name="href">
985                      <xsl:call-template name="href.target">
986                        <xsl:with-param name="object" select="$prev"/>
987                      </xsl:call-template>
988                    </xsl:attribute>
989                    <xsl:call-template name="navig.content">
990                      <xsl:with-param name="direction" select="'prev'"/>
991                    </xsl:call-template>
992                  </a>
993                </xsl:if>
994                <xsl:text>&#160;</xsl:text>
995              </td>
996              <td width="20%" align="center">
997                <xsl:choose>
998                  <xsl:when test="count($up)&gt;0
999                                  and generate-id($up) != generate-id($home)">
1000                    <a accesskey="u">
1001                      <xsl:attribute name="href">
1002                        <xsl:call-template name="href.target">
1003                          <xsl:with-param name="object" select="$up"/>
1004                        </xsl:call-template>
1005                      </xsl:attribute>
1006                      <xsl:call-template name="navig.content">
1007                        <xsl:with-param name="direction" select="'up'"/>
1008                      </xsl:call-template>
1009                    </a>
1010                  </xsl:when>
1011                  <xsl:otherwise>&#160;</xsl:otherwise>
1012                </xsl:choose>
1013              </td>
1014              <td width="40%" align="right">
1015                <xsl:text>&#160;</xsl:text>
1016                <xsl:if test="count($next)>0">
1017                  <a accesskey="n">
1018                    <xsl:attribute name="href">
1019                      <xsl:call-template name="href.target">
1020                        <xsl:with-param name="object" select="$next"/>
1021                      </xsl:call-template>
1022                    </xsl:attribute>
1023                    <xsl:call-template name="navig.content">
1024                      <xsl:with-param name="direction" select="'next'"/>
1025                    </xsl:call-template>
1026                  </a>
1027                </xsl:if>
1028              </td>
1029            </tr>
1030          </xsl:if>
1031
1032          <xsl:if test="$row2">
1033            <tr>
1034              <td width="40%" align="left" valign="top">
1035                <xsl:if test="$navig.showtitles != 0">
1036                  <xsl:apply-templates select="$prev" mode="object.title.markup"/>
1037                </xsl:if>
1038                <xsl:text>&#160;</xsl:text>
1039              </td>
1040              <td width="20%" align="center">
1041                <xsl:choose>
1042                  <xsl:when test="$home != . or $nav.context = 'toc'">
1043                    <a accesskey="h">
1044                      <xsl:attribute name="href">
1045                        <xsl:call-template name="href.target">
1046                          <xsl:with-param name="object" select="$home"/>
1047                        </xsl:call-template>
1048                      </xsl:attribute>
1049                      <xsl:call-template name="navig.content">
1050                        <xsl:with-param name="direction" select="'home'"/>
1051                      </xsl:call-template>
1052                    </a>
1053                    <xsl:if test="$chunk.tocs.and.lots != 0 and $nav.context != 'toc'">
1054                      <xsl:text>&#160;|&#160;</xsl:text>
1055                    </xsl:if>
1056                  </xsl:when>
1057                  <xsl:otherwise>&#160;</xsl:otherwise>
1058                </xsl:choose>
1059
1060                <xsl:if test="$chunk.tocs.and.lots != 0 and $nav.context != 'toc'">
1061                  <a accesskey="t">
1062                    <xsl:attribute name="href">
1063                      <xsl:apply-templates select="/*[1]"
1064                                           mode="recursive-chunk-filename">
1065                        <xsl:with-param name="recursive" select="true()"/>
1066                      </xsl:apply-templates>
1067                      <xsl:text>-toc</xsl:text>
1068                      <xsl:value-of select="$html.ext"/>
1069                    </xsl:attribute>
1070                    <xsl:call-template name="gentext">
1071                      <xsl:with-param name="key" select="'nav-toc'"/>
1072                    </xsl:call-template>
1073                  </a>
1074                </xsl:if>
1075              </td>
1076              <td width="40%" align="right" valign="top">
1077                <xsl:text>&#160;</xsl:text>
1078                <xsl:if test="$navig.showtitles != 0">
1079                  <xsl:apply-templates select="$next" mode="object.title.markup"/>
1080                </xsl:if>
1081              </td>
1082            </tr>
1083          </xsl:if>
1084        </table>
1085      </xsl:if>
1086    </div>
1087  </xsl:if>
1088</xsl:template>
1089
1090<!-- ==================================================================== -->
1091
1092<xsl:template name="navig.content">
1093    <xsl:param name="direction" select="next"/>
1094    <xsl:variable name="navtext">
1095        <xsl:choose>
1096            <xsl:when test="$direction = 'prev'">
1097                <xsl:call-template name="gentext.nav.prev"/>
1098            </xsl:when>
1099            <xsl:when test="$direction = 'next'">
1100                <xsl:call-template name="gentext.nav.next"/>
1101            </xsl:when>
1102            <xsl:when test="$direction = 'up'">
1103                <xsl:call-template name="gentext.nav.up"/>
1104            </xsl:when>
1105            <xsl:when test="$direction = 'home'">
1106                <xsl:call-template name="gentext.nav.home"/>
1107            </xsl:when>
1108            <xsl:otherwise>
1109                <xsl:text>xxx</xsl:text>
1110            </xsl:otherwise>
1111        </xsl:choose>
1112    </xsl:variable>
1113
1114    <xsl:choose>
1115        <xsl:when test="$navig.graphics != 0">
1116            <img>
1117                <xsl:attribute name="src">
1118                    <xsl:value-of select="$navig.graphics.path"/>
1119                    <xsl:value-of select="$direction"/>
1120                    <xsl:value-of select="$navig.graphics.extension"/>
1121                </xsl:attribute>
1122                <xsl:attribute name="alt">
1123                    <xsl:value-of select="$navtext"/>
1124                </xsl:attribute>
1125            </img>
1126        </xsl:when>
1127        <xsl:otherwise>
1128            <xsl:value-of select="$navtext"/>
1129        </xsl:otherwise>
1130    </xsl:choose>
1131</xsl:template>
1132
1133<!-- ==================================================================== -->
1134
1135<!-- * The following template assumes that the first legalnotice -->
1136<!-- * instance found in a document applies to the contents of the -->
1137<!-- * entire document. It generates an HTML link in each chunk, back -->
1138<!-- * to the file containing the contents of the first legalnotice. -->
1139<!-- * -->
1140<!-- * Actually, it may generate multiple link instances in each chunk, -->
1141<!-- * because it walks through the space-separated list of link -->
1142<!-- * types specified in the $html.head.legalnotice.link.types param, -->
1143<!-- * popping off link types and generating links for them until it -->
1144<!-- * depletes the list. -->
1145 
1146<xsl:template name="make.legalnotice.head.links">
1147  <!-- * the following ID is used as part of the legalnotice filename; -->
1148  <!-- * we need it in order to construct the filename for use in the -->
1149  <!-- * value of the href attribute on the link -->
1150  <xsl:param name="id">
1151    <xsl:call-template name="object.id">
1152      <xsl:with-param name="object" select="(//legalnotice)[1]"/>
1153    </xsl:call-template>
1154  </xsl:param>
1155  <xsl:param name="linktype">
1156    <xsl:choose>
1157      <xsl:when test="contains($html.head.legalnotice.link.types, ' ')">
1158        <xsl:value-of
1159            select="normalize-space(
1160                    substring-before($html.head.legalnotice.link.types, ' '))"/>
1161      </xsl:when>
1162      <xsl:otherwise>
1163        <xsl:value-of select="$html.head.legalnotice.link.types"/>
1164      </xsl:otherwise>
1165    </xsl:choose>
1166  </xsl:param>
1167  <xsl:param
1168      name="remaining.linktypes"
1169      select="concat(
1170              normalize-space(
1171              substring-after($html.head.legalnotice.link.types, ' ')),' ')"/>
1172  <xsl:if test="not($linktype = '')">
1173    <link rel="{$linktype}">
1174      <xsl:attribute name="href">
1175        <xsl:value-of select="concat('ln-',$id,$html.ext)"/>
1176      </xsl:attribute>
1177      <xsl:attribute name="title">
1178        <xsl:apply-templates select="(//legalnotice)[1]"
1179                             mode="object.title.markup.textonly"/>
1180      </xsl:attribute>
1181    </link>
1182    <xsl:call-template name="make.legalnotice.head.links">
1183      <!-- * pop the next value off the list of link types -->
1184      <xsl:with-param
1185          name="linktype"
1186          select="substring-before($remaining.linktypes, ' ')"/>
1187      <!-- * remove the link type from the list of remaining link types -->
1188      <xsl:with-param
1189          name="remaining.linktypes"
1190          select="substring-after($remaining.linktypes, ' ')"/>
1191    </xsl:call-template>
1192  </xsl:if>
1193</xsl:template>
1194
1195<!-- ==================================================================== -->
1196
1197<xsl:template match="processing-instruction('dbhtml')">
1198  <!-- nop -->
1199</xsl:template>
1200
1201<!-- ==================================================================== -->
1202
1203<xsl:template name="chunk-element-content">
1204  <xsl:param name="prev"/>
1205  <xsl:param name="next"/>
1206  <xsl:param name="nav.context"/>
1207  <xsl:param name="content">
1208    <xsl:apply-imports/>
1209  </xsl:param>
1210
1211  <xsl:call-template name="user.preroot"/>
1212
1213  <html>
1214    <xsl:call-template name="html.head">
1215      <xsl:with-param name="prev" select="$prev"/>
1216      <xsl:with-param name="next" select="$next"/>
1217    </xsl:call-template>
1218
1219    <body>
1220      <xsl:call-template name="body.attributes"/>
1221      <xsl:call-template name="user.header.navigation"/>
1222
1223      <xsl:call-template name="header.navigation">
1224        <xsl:with-param name="prev" select="$prev"/>
1225        <xsl:with-param name="next" select="$next"/>
1226        <xsl:with-param name="nav.context" select="$nav.context"/>
1227      </xsl:call-template>
1228
1229      <xsl:call-template name="user.header.content"/>
1230
1231      <xsl:copy-of select="$content"/>
1232
1233      <xsl:call-template name="user.footer.content"/>
1234
1235      <xsl:call-template name="footer.navigation">
1236        <xsl:with-param name="prev" select="$prev"/>
1237        <xsl:with-param name="next" select="$next"/>
1238        <xsl:with-param name="nav.context" select="$nav.context"/>
1239      </xsl:call-template>
1240
1241      <xsl:call-template name="user.footer.navigation"/>
1242    </body>
1243  </html>
1244  <xsl:value-of select="$chunk.append"/>
1245</xsl:template>
1246
1247</xsl:stylesheet>
Note: See TracBrowser for help on using the repository browser.