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

Last change on this file since 3301 was 3301, checked in by Nicklas Nordborg, 14 years ago

Added option to stop the chunking of each sect1 in chapters and to chunk each sect2 inside sect1.

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