2 <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
5 <!-- ********************************************************************
7 This file is part of the DocBook XSL Stylesheet distribution.
8 See ../README or http://cdn.docbook.org/ for copyright
9 copyright and other information.
11 ******************************************************************** -->
13 <!-- Create keys for quickly looking up olink targets -->
14 <xsl:key name="targetdoc-key" match="document" use="@targetdoc" />
15 <xsl:key name="targetptr-key" match="div|obj"
16 use="concat(ancestor::document/@targetdoc, '/',
17 @targetptr, '/', ancestor::document/@lang)" />
19 <!-- Customize this template if you want olink errors to be fatal -->
20 <xsl:template name="olink.error">
21 <xsl:param name="message"/>
24 <xsl:text>Olink error: </xsl:text>
25 <xsl:value-of select="$message"/>
29 <!-- Customize this template if you want olink warnings to be fatal -->
30 <xsl:template name="olink.warning">
31 <xsl:param name="message"/>
34 <xsl:text>Olink warning: </xsl:text>
35 <xsl:value-of select="$message"/>
39 <!-- Customize this template if you want unresolved olink pointers to be fatal -->
40 <xsl:template name="olink.unresolved">
41 <xsl:param name="targetdoc.att"/>
42 <xsl:param name="targetptr.att"/>
45 <xsl:text>Error: unresolved olink: targetdoc/targetptr = '</xsl:text>
46 <xsl:value-of select="$targetdoc.att"/>
47 <xsl:text>/</xsl:text>
48 <xsl:value-of select="$targetptr.att"/>
49 <xsl:text>'.</xsl:text>
53 <!-- Return filename of database -->
54 <xsl:template name="select.target.database">
55 <xsl:param name="targetdoc.att" select="''"/>
56 <xsl:param name="targetptr.att" select="''"/>
57 <xsl:param name="olink.lang" select="''"/>
59 <!-- use root's xml:base if exists -->
60 <xsl:variable name="xml.base" select="/*/@xml:base"/>
62 <!-- This selection can be customized if needed -->
63 <xsl:variable name="target.database.filename">
65 <xsl:when test="$xml.base != '' and
66 not(starts-with($target.database.document, 'file:/')) and
67 not(starts-with($target.database.document, '/'))">
68 <xsl:call-template name="systemIdToBaseURI">
69 <xsl:with-param name="systemId" select="$xml.base"/>
71 <xsl:value-of select="$target.database.document"/>
74 <xsl:value-of select="$target.database.document"/>
79 <xsl:variable name="target.database"
80 select="document($target.database.filename,/)"/>
83 <!-- Was the database document parameter not set? -->
84 <xsl:when test="$target.database.document = ''">
85 <xsl:call-template name="olink.error">
86 <xsl:with-param name="message">
87 <xsl:text>olinks not processed: must specify a </xsl:text>
88 <xsl:text>$target.database.document parameter </xsl:text>
89 <xsl:text>when using olinks with targetdoc </xsl:text>
90 <xsl:text>and targetptr attributes.</xsl:text>
94 <xsl:when test="namespace-uri($target.database/*) != ''">
95 <xsl:call-template name="olink.error">
96 <xsl:with-param name="message">
97 <xsl:text>the targetset element and children in '</xsl:text>
98 <xsl:value-of select="$target.database.document"/>
99 <xsl:text>' should not be in any namespace.</xsl:text>
103 <!-- Did it not open? Should be a targetset element -->
104 <xsl:when test="not($target.database/*)">
105 <xsl:call-template name="olink.error">
106 <xsl:with-param name="message">
107 <xsl:text>could not open target database '</xsl:text>
108 <xsl:value-of select="$target.database.filename"/>
109 <xsl:text>'.</xsl:text>
114 <xsl:value-of select="$target.database.filename"/>
119 <xsl:template name="select.olink.key">
120 <xsl:param name="targetdoc.att" select="''"/>
121 <xsl:param name="targetptr.att" select="''"/>
122 <xsl:param name="olink.lang" select="''"/>
123 <xsl:param name="target.database"/>
125 <xsl:if test="$target.database/*">
126 <xsl:variable name="olink.fallback.sequence">
127 <xsl:call-template name="select.olink.lang.fallback">
128 <xsl:with-param name="olink.lang" select="$olink.lang"/>
132 <!-- Recurse through the languages until you find a match -->
133 <xsl:call-template name="select.olink.key.in.lang">
134 <xsl:with-param name="targetdoc.att" select="$targetdoc.att"/>
135 <xsl:with-param name="targetptr.att" select="$targetptr.att"/>
136 <xsl:with-param name="olink.lang" select="$olink.lang"/>
137 <xsl:with-param name="target.database" select="$target.database"/>
138 <xsl:with-param name="fallback.index" select="1"/>
139 <xsl:with-param name="olink.fallback.sequence"
140 select="$olink.fallback.sequence"/>
146 <!-- Locate olink key in a particular language -->
147 <xsl:template name="select.olink.key.in.lang">
148 <xsl:param name="targetdoc.att" select="''"/>
149 <xsl:param name="targetptr.att" select="''"/>
150 <xsl:param name="olink.lang" select="''"/>
151 <xsl:param name="target.database"/>
152 <xsl:param name="fallback.index" select="1"/>
153 <xsl:param name="olink.fallback.sequence" select="''"/>
155 <xsl:variable name="target.lang">
156 <xsl:call-template name="select.target.lang">
157 <xsl:with-param name="fallback.index" select="$fallback.index"/>
158 <xsl:with-param name="olink.fallback.sequence"
159 select="$olink.fallback.sequence"/>
163 <xsl:if test="$olink.debug != 0">
164 <xsl:message><xsl:text>Olink debug: cases for targetdoc='</xsl:text>
165 <xsl:value-of select="$targetdoc.att"/>
166 <xsl:text>' and targetptr='</xsl:text>
167 <xsl:value-of select="$targetptr.att"/>
168 <xsl:text>' in language '</xsl:text>
169 <xsl:value-of select="$target.lang"/>
170 <xsl:text>'.</xsl:text>
174 <!-- Customize these cases if you want different selection logic -->
175 <xsl:variable name="CaseA">
176 <!-- targetdoc.att = not blank
177 targetptr.att = not blank
179 <xsl:if test="$targetdoc.att != '' and
180 $targetptr.att != ''">
181 <xsl:for-each select="$target.database">
182 <xsl:variable name="key"
183 select="concat($targetdoc.att, '/',
187 <xsl:when test="key('targetptr-key', $key)[1]/@href != ''">
188 <xsl:value-of select="$key"/>
189 <xsl:if test="$olink.debug != 0">
190 <xsl:message>Olink debug: CaseA matched.</xsl:message>
193 <xsl:when test="$olink.debug != 0">
194 <xsl:message>Olink debug: CaseA NOT matched</xsl:message>
201 <xsl:variable name="CaseB">
202 <!-- targetdoc.att = not blank
203 targetptr.att = not blank
204 prefer.internal.olink = not zero
205 current.docid = not blank
207 <xsl:if test="$targetdoc.att != '' and
208 $targetptr.att != '' and
209 $current.docid != '' and
210 $prefer.internal.olink != 0">
211 <xsl:for-each select="$target.database">
212 <xsl:variable name="key"
213 select="concat($current.docid, '/',
217 <xsl:when test="key('targetptr-key', $key)[1]/@href != ''">
218 <xsl:value-of select="$key"/>
219 <xsl:if test="$olink.debug != 0">
220 <xsl:message>Olink debug: CaseB matched.</xsl:message>
223 <xsl:when test="$olink.debug != 0">
224 <xsl:message>Olink debug: CaseB NOT matched</xsl:message>
231 <xsl:variable name="CaseC">
232 <!-- targetdoc.att = blank
233 targetptr.att = not blank
234 current.docid = not blank
236 <xsl:if test="string-length($targetdoc.att) = 0 and
237 $targetptr.att != '' and
238 $current.docid != ''">
239 <!-- Must use a for-each to change context for keys to work -->
240 <xsl:for-each select="$target.database">
241 <xsl:variable name="key"
242 select="concat($current.docid, '/',
246 <xsl:when test="key('targetptr-key', $key)[1]/@href != ''">
247 <xsl:value-of select="$key"/>
248 <xsl:if test="$olink.debug != 0">
249 <xsl:message>Olink debug: CaseC matched.</xsl:message>
252 <xsl:when test="$olink.debug != 0">
253 <xsl:message>Olink debug: CaseC NOT matched.</xsl:message>
260 <xsl:variable name="CaseD">
261 <!-- targetdoc.att = blank
262 targetptr.att = not blank
263 current.docid = blank
265 <!-- This is possible if only one document in the database -->
266 <xsl:if test="string-length($targetdoc.att) = 0 and
267 $targetptr.att != '' and
268 string-length($current.docid) = 0 and
269 count($target.database//document) = 1">
270 <xsl:for-each select="$target.database">
271 <xsl:variable name="key"
272 select="concat(.//document/@targetdoc, '/',
276 <xsl:when test="key('targetptr-key', $key)[1]/@href != ''">
277 <xsl:value-of select="$key"/>
278 <xsl:if test="$olink.debug != 0">
279 <xsl:message>Olink debug: CaseD matched.</xsl:message>
282 <xsl:when test="$olink.debug != 0">
283 <xsl:message>Olink debug: CaseD NOT matched</xsl:message>
290 <xsl:variable name="CaseE">
291 <!-- targetdoc.att = not blank
292 targetptr.att = blank
294 <xsl:if test="$targetdoc.att != '' and
295 string-length($targetptr.att) = 0">
297 <!-- Try the document's root element id -->
298 <xsl:variable name="rootid">
300 <xsl:when test="$target.lang != ''">
301 <xsl:value-of select="$target.database//document[@targetdoc = $targetdoc.att and @lang = $target.lang]/*[1]/@targetptr"/>
304 <xsl:value-of select="$target.database//document[@targetdoc = $targetdoc.att and not(@lang)]/*[1]/@targetptr"/>
309 <xsl:for-each select="$target.database">
310 <xsl:variable name="key"
311 select="concat($targetdoc.att, '/',
315 <xsl:when test="key('targetptr-key', $key)[1]/@href != ''">
316 <xsl:value-of select="$key"/>
317 <xsl:if test="$olink.debug != 0">
318 <xsl:message>Olink debug: CaseE matched.</xsl:message>
321 <xsl:when test="$olink.debug != 0">
322 <xsl:message>Olink debug: CaseE NOT matched.</xsl:message>
329 <xsl:variable name="CaseF">
330 <!-- targetdoc.att = not blank
331 targetptr.att = blank
332 prefer.internal.olink = not zero
333 current.docid = not blank
335 <xsl:if test="$targetdoc.att != '' and
336 string-length($targetptr.att) = 0 and
337 $current.docid != '' and
338 $prefer.internal.olink != 0">
339 <!-- Try the document's root element id -->
340 <xsl:variable name="rootid">
342 <xsl:when test="$target.lang != ''">
343 <xsl:value-of select="$target.database//document[@targetdoc = $current.docid and @lang = $target.lang]/*[1]/@targetptr"/>
346 <xsl:value-of select="$target.database//document[@targetdoc = $current.docid and not(@lang)]/*[1]/@targetptr"/>
351 <xsl:for-each select="$target.database">
352 <xsl:variable name="key"
353 select="concat($current.docid, '/',
357 <xsl:when test="key('targetptr-key', $key)[1]/@href != ''">
358 <xsl:value-of select="$key"/>
359 <xsl:if test="$olink.debug != 0">
360 <xsl:message>Olink debug: CaseF matched.</xsl:message>
363 <xsl:when test="$olink.debug != 0">
364 <xsl:message>Olink debug: CaseF NOT matched.</xsl:message>
371 <!-- Now select the best match. Customize the order if needed -->
372 <xsl:variable name="selected.key">
374 <xsl:when test="$CaseB != ''">
375 <xsl:value-of select="$CaseB"/>
376 <xsl:if test="$olink.debug != 0">
378 <xsl:text>Olink debug: CaseB key is the final selection: </xsl:text>
379 <xsl:value-of select="$CaseB"/>
383 <xsl:when test="$CaseA != ''">
384 <xsl:value-of select="$CaseA"/>
385 <xsl:if test="$olink.debug != 0">
387 <xsl:text>Olink debug: CaseA key is the final selection: </xsl:text>
388 <xsl:value-of select="$CaseA"/>
392 <xsl:when test="$CaseC != ''">
393 <xsl:value-of select="$CaseC"/>
394 <xsl:if test="$olink.debug != 0">
396 <xsl:text>Olink debug: CaseC key is the final selection: </xsl:text>
397 <xsl:value-of select="$CaseC"/>
401 <xsl:when test="$CaseD != ''">
402 <xsl:value-of select="$CaseD"/>
403 <xsl:if test="$olink.debug != 0">
405 <xsl:text>Olink debug: CaseD key is the final selection: </xsl:text>
406 <xsl:value-of select="$CaseD"/>
410 <xsl:when test="$CaseF != ''">
411 <xsl:value-of select="$CaseF"/>
412 <xsl:if test="$olink.debug != 0">
414 <xsl:text>Olink debug: CaseF key is the final selection: </xsl:text>
415 <xsl:value-of select="$CaseF"/>
419 <xsl:when test="$CaseE != ''">
420 <xsl:value-of select="$CaseE"/>
421 <xsl:if test="$olink.debug != 0">
423 <xsl:text>Olink debug: CaseE key is the final selection: </xsl:text>
424 <xsl:value-of select="$CaseE"/>
429 <xsl:if test="$olink.debug != 0">
431 <xsl:text>Olink debug: No case matched for lang '</xsl:text>
432 <xsl:value-of select="$target.lang"/>
433 <xsl:text>'.</xsl:text>
441 <xsl:when test="$selected.key != ''">
442 <xsl:value-of select="$selected.key"/>
444 <xsl:when test="string-length($selected.key) = 0 and
445 string-length($target.lang) = 0">
446 <!-- No match on last try, and we are done -->
449 <!-- Recurse through next language -->
450 <xsl:call-template name="select.olink.key.in.lang">
451 <xsl:with-param name="targetdoc.att" select="$targetdoc.att"/>
452 <xsl:with-param name="targetptr.att" select="$targetptr.att"/>
453 <xsl:with-param name="olink.lang" select="$olink.lang"/>
454 <xsl:with-param name="target.database" select="$target.database"/>
455 <xsl:with-param name="fallback.index" select="$fallback.index + 1"/>
456 <xsl:with-param name="olink.fallback.sequence"
457 select="$olink.fallback.sequence"/>
464 <xsl:template name="select.target.lang">
465 <xsl:param name="fallback.index" select="1"/>
466 <xsl:param name="olink.fallback.sequence" select="''"/>
468 <!-- recurse backwards to find the lang matching the index -->
469 <xsl:variable name="firstlang"
470 select="substring-before($olink.fallback.sequence, ' ')"/>
471 <xsl:variable name="rest"
472 select="substring-after($olink.fallback.sequence, ' ')"/>
474 <xsl:when test="$fallback.index = 1">
475 <xsl:value-of select="$firstlang"/>
477 <xsl:when test="$fallback.index > 1">
478 <xsl:call-template name="select.target.lang">
479 <xsl:with-param name="fallback.index" select="$fallback.index - 1"/>
480 <xsl:with-param name="olink.fallback.sequence"
489 <xsl:template name="select.olink.lang.fallback">
490 <xsl:param name="olink.lang" select="''"/>
492 <!-- Prefer language of the olink element -->
493 <xsl:value-of select="concat(normalize-space(concat($olink.lang, ' ',
494 $olink.lang.fallback.sequence)), ' ')"/>
497 <!-- Returns the complete olink href value if found -->
498 <xsl:template name="make.olink.href">
499 <xsl:param name="olink.key" select="''"/>
500 <xsl:param name="target.database"/>
502 <xsl:if test="$olink.key != ''">
503 <xsl:variable name="target.href" >
504 <xsl:for-each select="$target.database" >
505 <xsl:value-of select="key('targetptr-key', $olink.key)[1]/@href" />
509 <xsl:variable name="targetdoc">
510 <xsl:value-of select="substring-before($olink.key, '/')"/>
513 <!-- Does the target database use a sitemap? -->
514 <xsl:variable name="use.sitemap">
516 <xsl:when test="$target.database//sitemap">1</xsl:when>
517 <xsl:otherwise>0</xsl:otherwise>
522 <!-- Get the baseuri for this targetptr -->
523 <xsl:variable name="baseuri" >
525 <!-- Does the database use a sitemap? -->
526 <xsl:when test="$use.sitemap != 0" >
528 <!-- Was current.docid parameter set? -->
529 <xsl:when test="$current.docid != ''">
530 <!-- Was it found in the database? -->
531 <xsl:variable name="currentdoc.key" >
532 <xsl:for-each select="$target.database" >
533 <xsl:value-of select="key('targetdoc-key',
534 $current.docid)[1]/@targetdoc" />
538 <xsl:when test="$currentdoc.key != ''">
539 <xsl:for-each select="$target.database" >
540 <xsl:call-template name="targetpath" >
541 <xsl:with-param name="dirnode"
542 select="key('targetdoc-key', $current.docid)[1]/parent::dir"/>
543 <xsl:with-param name="targetdoc" select="$targetdoc"/>
548 <xsl:call-template name="olink.error">
549 <xsl:with-param name="message">
550 <xsl:text>cannot compute relative </xsl:text>
551 <xsl:text>sitemap path because $current.docid '</xsl:text>
552 <xsl:value-of select="$current.docid"/>
553 <xsl:text>' not found in target database.</xsl:text>
560 <xsl:call-template name="olink.error">
561 <xsl:with-param name="message">
562 <xsl:text>cannot compute relative </xsl:text>
563 <xsl:text>sitemap path without $current.docid parameter</xsl:text>
568 <!-- In either case, add baseuri from its document entry-->
569 <xsl:variable name="docbaseuri">
570 <xsl:for-each select="$target.database" >
571 <xsl:value-of select="key('targetdoc-key', $targetdoc)[1]/@baseuri" />
574 <xsl:if test="$docbaseuri != ''" >
575 <xsl:value-of select="$docbaseuri"/>
578 <!-- No database sitemap in use -->
580 <!-- Just use any baseuri from its document entry -->
581 <xsl:variable name="docbaseuri">
582 <xsl:for-each select="$target.database" >
583 <xsl:value-of select="key('targetdoc-key', $targetdoc)[1]/@baseuri" />
586 <xsl:if test="$docbaseuri != ''" >
587 <xsl:value-of select="$docbaseuri"/>
593 <!-- Is this olink to be active? -->
594 <xsl:variable name="active.olink">
596 <xsl:when test="$activate.external.olinks = 0">
598 <xsl:when test="$current.docid = ''">1</xsl:when>
599 <xsl:when test="$targetdoc = ''">1</xsl:when>
600 <xsl:when test="$targetdoc = $current.docid">1</xsl:when>
601 <xsl:otherwise>0</xsl:otherwise>
604 <xsl:otherwise>1</xsl:otherwise>
608 <!-- Form the href information -->
609 <xsl:if test="$active.olink != 0">
610 <xsl:if test="$baseuri != ''">
611 <xsl:value-of select="$baseuri"/>
612 <xsl:if test="substring($target.href,1,1) != '#'">
613 <!--xsl:text>/</xsl:text-->
616 <!-- optionally turn off frag for PDF references -->
617 <xsl:if test="not($insert.olink.pdf.frag = 0 and
618 translate(substring($baseuri, string-length($baseuri) - 3),
619 'PDF', 'pdf') = '.pdf'
620 and starts-with($target.href, '#') )">
621 <xsl:value-of select="$target.href"/>
627 <!-- Computes the href of the object containing the olink element -->
628 <xsl:template name="olink.from.uri">
629 <xsl:param name="target.database"/>
630 <xsl:param name="object" select="NotAnElement"/>
631 <xsl:param name="object.targetdoc" select="$current.docid"/>
632 <xsl:param name="object.lang"
633 select="concat($object/ancestor::*[last()]/@lang,
634 $object/ancestor::*[last()]/@xml:lang)"/>
636 <xsl:variable name="parent.id">
637 <xsl:call-template name="object.id">
638 <xsl:with-param name="object" select="$object"/>
642 <!-- Get the olink key for the parent of olink element -->
643 <xsl:variable name="from.key">
644 <xsl:call-template name="select.olink.key">
645 <xsl:with-param name="targetdoc.att" select="$object.targetdoc"/>
646 <xsl:with-param name="targetptr.att" select="$parent.id"/>
647 <xsl:with-param name="olink.lang" select="$object.lang"/>
648 <xsl:with-param name="target.database" select="$target.database"/>
652 <xsl:variable name="from.olink.href">
653 <xsl:for-each select="$target.database" >
654 <xsl:value-of select="key('targetptr-key', $from.key)[1]/@href" />
659 <!-- we found the olink object -->
660 <xsl:when test="$from.olink.href != ''">
661 <xsl:value-of select="$from.olink.href"/>
663 <xsl:when test="not($object/parent::*)">
664 <xsl:value-of select="$from.olink.href"/>
667 <!-- recurse upward in current document -->
668 <xsl:call-template name="olink.from.uri">
669 <xsl:with-param name="target.database" select="$target.database"/>
670 <xsl:with-param name="object" select="$object/parent::*"/>
671 <xsl:with-param name="object.targetdoc" select="$object.targetdoc"/>
672 <xsl:with-param name="object.lang" select="$object.lang"/>
679 <xsl:template name="olink.hottext">
680 <xsl:param name="target.database"/>
681 <xsl:param name="olink.lang" select="''"/>
682 <xsl:param name="olink.key" select="''"/>
683 <xsl:param name="referrer" select="."/>
684 <xsl:param name="xrefstyle">
685 <xsl:apply-templates select="." mode="xrefstyle">
686 <xsl:with-param name="olink.key" select="$olink.key"/>
687 <xsl:with-param name="referrer" select="$referrer"/>
688 </xsl:apply-templates>
692 <!-- If it has elements or text (not just PI or comment) -->
693 <xsl:when test="child::text() or child::*">
694 <xsl:apply-templates/>
696 <xsl:when test="$olink.key != ''">
697 <!-- Get the xref text for this record -->
698 <xsl:variable name="xref.text" >
699 <xsl:for-each select="$target.database" >
700 <xsl:call-template name="insert.targetdb.data">
701 <xsl:with-param name="data"
702 select="key('targetptr-key', $olink.key)[1]/xreftext/node()" />
707 <xsl:variable name="xref.number" >
708 <xsl:for-each select="$target.database" >
709 <xsl:value-of select="key('targetptr-key', $olink.key)[1]/@number" />
713 <xsl:variable name="target.elem" >
714 <xsl:for-each select="$target.database" >
715 <xsl:value-of select="key('targetptr-key', $olink.key)[1]/@element" />
719 <xsl:variable name="lang">
720 <xsl:variable name="candidate">
721 <xsl:for-each select="$target.database" >
723 select="key('targetptr-key', $olink.key)[1]/@lang" />
727 <xsl:when test="$candidate != ''">
728 <xsl:value-of select="$candidate"/>
731 <xsl:value-of select="$olink.lang"/>
736 <xsl:variable name="targetdoc">
737 <xsl:value-of select="substring-before($olink.key, '/')"/>
741 <xsl:when test="$xrefstyle != '' and
742 starts-with(normalize-space($xrefstyle), 'select:') and
743 (contains($xrefstyle, 'nodocname') or
744 contains($xrefstyle, 'nopage')) and
745 not(contains($xrefstyle, 'title')) and
746 not(contains($xrefstyle, 'label'))">
747 <xsl:copy-of select="$xref.text"/>
749 <xsl:when test="$xrefstyle != ''">
750 <xsl:if test="$olink.debug != 0">
752 <xsl:text>xrefstyle is '</xsl:text>
753 <xsl:value-of select="$xrefstyle"/>
754 <xsl:text>'.</xsl:text>
757 <xsl:variable name="template">
759 <xsl:when test="starts-with(normalize-space($xrefstyle),
761 <xsl:call-template name="make.gentext.template">
762 <xsl:with-param name="xrefstyle" select="$xrefstyle"/>
763 <xsl:with-param name="purpose" select="'olink'"/>
764 <xsl:with-param name="referrer" select="."/>
765 <xsl:with-param name="target.elem" select="$target.elem"/>
768 <xsl:when test="starts-with(normalize-space($xrefstyle),
770 <xsl:value-of select="substring-after(
771 normalize-space($xrefstyle), 'template:')"/>
774 <!-- Look for Gentext template with @style attribute -->
775 <!-- Must compare to no style value because gentext.template
776 falls back to no style -->
778 <xsl:variable name="xref-context">
779 <xsl:call-template name="gentext.template">
780 <xsl:with-param name="context" select="'xref'"/>
781 <xsl:with-param name="name" select="$target.elem"/>
782 <xsl:with-param name="lang" select="$lang"/>
786 <xsl:variable name="styled-xref-context">
787 <xsl:call-template name="gentext.template">
788 <xsl:with-param name="context" select="'xref'"/>
789 <xsl:with-param name="name" select="$target.elem"/>
790 <xsl:with-param name="lang" select="$lang"/>
791 <xsl:with-param name="xrefstyle" select="$xrefstyle"/>
795 <xsl:variable name="xref-number-context">
796 <xsl:call-template name="gentext.template">
797 <xsl:with-param name="context" select="'xref-number'"/>
798 <xsl:with-param name="name" select="$target.elem"/>
799 <xsl:with-param name="lang" select="$lang"/>
803 <xsl:variable name="styled-xref-number-context">
804 <xsl:call-template name="gentext.template">
805 <xsl:with-param name="context" select="'xref-number'"/>
806 <xsl:with-param name="name" select="$target.elem"/>
807 <xsl:with-param name="lang" select="$lang"/>
808 <xsl:with-param name="xrefstyle" select="$xrefstyle"/>
812 <xsl:variable name="xref-number-and-title-context">
813 <xsl:call-template name="gentext.template">
814 <xsl:with-param name="context"
815 select="'xref-number-and-title'"/>
816 <xsl:with-param name="name" select="$target.elem"/>
817 <xsl:with-param name="lang" select="$lang"/>
821 <xsl:variable name="styled-xref-number-and-title-context">
822 <xsl:call-template name="gentext.template">
823 <xsl:with-param name="context"
824 select="'xref-number-and-title'"/>
825 <xsl:with-param name="name" select="$target.elem"/>
826 <xsl:with-param name="lang" select="$lang"/>
827 <xsl:with-param name="xrefstyle" select="$xrefstyle"/>
832 <xsl:when test="$xref-number-and-title-context !=
833 $styled-xref-number-and-title-context and
834 $xref.number != '' and
835 $xref.with.number.and.title != 0">
837 select="$styled-xref-number-and-title-context"/>
839 <xsl:when test="$xref-number-context !=
840 $styled-xref-number-context and
842 <xsl:value-of select="$styled-xref-number-context"/>
844 <xsl:when test="$xref-context != $styled-xref-context">
845 <xsl:value-of select="$styled-xref-context"/>
847 <xsl:when test="$xref-number-and-title-context != '' and
848 $xref.number != '' and
849 $xref.with.number.and.title != 0">
851 select="$xref-number-and-title-context"/>
852 <xsl:if test="$olink.debug">
853 <xsl:call-template name="olink.warning">
854 <xsl:with-param name="message">
855 <xsl:text>no gentext template</xsl:text>
856 <xsl:text> exists for xrefstyle '</xsl:text>
857 <xsl:value-of select="$xrefstyle"/>
858 <xsl:text>' for element '</xsl:text>
859 <xsl:value-of select="$target.elem"/>
860 <xsl:text>' in language '</xsl:text>
861 <xsl:value-of select="$lang"/>
862 <xsl:text>' in context 'xref-number-and-title</xsl:text>
863 <xsl:text>'. Using template without @style.</xsl:text>
868 <xsl:when test="$xref-number-context != '' and
870 <xsl:value-of select="$xref-number-context"/>
871 <xsl:if test="$olink.debug">
872 <xsl:call-template name="olink.warning">
873 <xsl:with-param name="message">
874 <xsl:text>no gentext template</xsl:text>
875 <xsl:text> exists for xrefstyle '</xsl:text>
876 <xsl:value-of select="$xrefstyle"/>
877 <xsl:text>' for element '</xsl:text>
878 <xsl:value-of select="$target.elem"/>
879 <xsl:text>' in language '</xsl:text>
880 <xsl:value-of select="$lang"/>
881 <xsl:text>' in context 'xref-number</xsl:text>
882 <xsl:text>'. Using template without @style.</xsl:text>
887 <xsl:when test="$xref-context != ''">
888 <xsl:value-of select="$xref-context"/>
889 <xsl:if test="$olink.debug">
890 <xsl:call-template name="olink.warning">
891 <xsl:with-param name="message">
892 <xsl:text>no gentext template</xsl:text>
893 <xsl:text> exists for xrefstyle '</xsl:text>
894 <xsl:value-of select="$xrefstyle"/>
895 <xsl:text>' for element '</xsl:text>
896 <xsl:value-of select="$target.elem"/>
897 <xsl:text>' in language '</xsl:text>
898 <xsl:value-of select="$lang"/>
899 <xsl:text>' in context 'xref</xsl:text>
900 <xsl:text>'. Using template without @style.</xsl:text>
906 <xsl:call-template name="olink.warning">
907 <xsl:with-param name="message">
908 <xsl:text>no gentext template</xsl:text>
909 <xsl:text> exists for xrefstyle '</xsl:text>
910 <xsl:value-of select="$xrefstyle"/>
911 <xsl:text>' for element '</xsl:text>
912 <xsl:value-of select="$target.elem"/>
913 <xsl:text>' in language '</xsl:text>
914 <xsl:value-of select="$lang"/>
915 <xsl:text>'. Trying '%t'.</xsl:text>
918 <xsl:value-of select="'%t'"/>
925 <xsl:if test="$olink.debug != 0">
927 <xsl:text>Olink debug: xrefstyle template is '</xsl:text>
928 <xsl:value-of select="$template"/>
929 <xsl:text>'.</xsl:text>
933 <xsl:call-template name="substitute-markup">
934 <xsl:with-param name="template" select="$template"/>
935 <xsl:with-param name="title">
936 <xsl:for-each select="$target.database" >
937 <xsl:call-template name="insert.targetdb.data">
938 <xsl:with-param name="data"
939 select="key('targetptr-key', $olink.key)/ttl/node()"/>
943 <xsl:with-param name="label">
944 <xsl:for-each select="$target.database" >
946 select="key('targetptr-key', $olink.key)[1]/@number" />
949 <xsl:with-param name="pagenumber">
950 <xsl:for-each select="$target.database" >
952 select="key('targetptr-key', $olink.key)[1]/@page" />
955 <xsl:with-param name="docname">
956 <xsl:for-each select="$target.database" >
957 <xsl:call-template name="insert.targetdb.data">
958 <xsl:with-param name="data"
959 select="key('targetdoc-key', $targetdoc)[1]/div[1]/ttl/node()" />
966 <xsl:when test="$use.local.olink.style != 0">
968 <!-- Is autonumbering on? -->
969 <xsl:variable name="target.number">
970 <xsl:for-each select="$target.database" >
972 select="key('targetptr-key', $olink.key)[1]/@number" />
976 <xsl:variable name="autonumber">
978 <xsl:when test="$target.number != ''">1</xsl:when>
979 <xsl:otherwise>0</xsl:otherwise>
983 <xsl:variable name="number-and-title-template">
984 <xsl:call-template name="gentext.template.exists">
985 <xsl:with-param name="context" select="'xref-number-and-title'"/>
986 <xsl:with-param name="name" select="$target.elem"/>
990 <xsl:variable name="number-template">
991 <xsl:call-template name="gentext.template.exists">
992 <xsl:with-param name="context" select="'xref-number'"/>
993 <xsl:with-param name="name" select="$target.elem"/>
997 <xsl:variable name="context">
999 <xsl:when test="string($autonumber) != 0
1000 and $number-and-title-template != 0
1001 and $xref.with.number.and.title != 0">
1002 <xsl:value-of select="'xref-number-and-title'"/>
1004 <xsl:when test="string($autonumber) != 0
1005 and $number-template != 0">
1006 <xsl:value-of select="'xref-number'"/>
1009 <xsl:value-of select="'xref'"/>
1014 <xsl:variable name="template">
1015 <xsl:call-template name="gentext.template">
1016 <xsl:with-param name="context" select="$context"/>
1017 <xsl:with-param name="name" select="$target.elem"/>
1018 <xsl:with-param name="lang" select="$lang"/>
1019 </xsl:call-template>
1022 <xsl:call-template name="substitute-markup">
1023 <xsl:with-param name="template" select="$template"/>
1024 <xsl:with-param name="title">
1025 <xsl:for-each select="$target.database" >
1026 <xsl:call-template name="insert.targetdb.data">
1027 <xsl:with-param name="data"
1028 select="key('targetptr-key', $olink.key)[1]/ttl/node()" />
1029 </xsl:call-template>
1032 <xsl:with-param name="label">
1033 <xsl:for-each select="$target.database" >
1034 <xsl:call-template name="insert.targetdb.data">
1035 <xsl:with-param name="data"
1036 select="key('targetptr-key', $olink.key)[1]/@number" />
1037 </xsl:call-template>
1040 </xsl:call-template>
1042 <xsl:when test="$xref.text !=''">
1043 <xsl:copy-of select="$xref.text"/>
1046 <xsl:call-template name="olink.error">
1047 <xsl:with-param name="message">
1048 <xsl:text>no generated text for targetdoc/targetptr/lang = '</xsl:text>
1049 <xsl:value-of select="$olink.key"/>
1050 <xsl:text>'.</xsl:text>
1052 </xsl:call-template>
1053 <xsl:text>????</xsl:text>
1058 <xsl:if test="$olink.key != ''">
1059 <xsl:call-template name="olink.error">
1060 <xsl:with-param name="message">
1061 <xsl:text>no generated text for targetdoc/targetptr/lang = '</xsl:text>
1062 <xsl:value-of select="$olink.key"/>
1063 <xsl:text>'.</xsl:text>
1065 </xsl:call-template>
1067 <xsl:text>????</xsl:text>
1072 <xsl:template name="insert.targetdb.data">
1073 <xsl:param name="data"/>
1074 <!-- Customize this to massage data further -->
1075 <xsl:copy-of select="$data"/>
1078 <xsl:template match="*" mode="olink.docname.markup">
1079 <!-- No-op for now -->
1082 <xsl:template name="targetpath">
1083 <xsl:param name="dirnode" />
1084 <xsl:param name="targetdoc" select="''"/>
1087 <xsl:message>dirnode is <xsl:value-of select="$dirnode/@name"/></xsl:message>
1088 <xsl:message>targetdoc is <xsl:value-of select="$targetdoc"/></xsl:message>
1090 <!-- recursive template generates path to olink target directory -->
1092 <!-- Have we arrived at the final path step? -->
1093 <xsl:when test="$dirnode/child::document[@targetdoc = $targetdoc]">
1094 <!-- We are done -->
1096 <!-- Have we reached the top without a match? -->
1097 <xsl:when test="local-name($dirnode) != 'dir'" >
1098 <xsl:call-template name="olink.error">
1099 <xsl:with-param name="message">
1100 <xsl:text>cannot locate targetdoc </xsl:text>
1101 <xsl:value-of select="$targetdoc"/>
1102 <xsl:text> in sitemap</xsl:text>
1104 </xsl:call-template>
1106 <!-- Is the target in a descendant? -->
1107 <xsl:when test="$dirnode/descendant::document/@targetdoc = $targetdoc">
1108 <xsl:variable name="step" select="$dirnode/child::dir[descendant::document/@targetdoc = $targetdoc]"/>
1109 <xsl:if test = "$step">
1110 <xsl:value-of select="$step/@name"/>
1111 <xsl:text>/</xsl:text>
1113 <!-- Now recurse with the child -->
1114 <xsl:call-template name="targetpath" >
1115 <xsl:with-param name="dirnode" select="$step"/>
1116 <xsl:with-param name="targetdoc" select="$targetdoc"/>
1117 </xsl:call-template>
1119 <!-- Otherwise we need to move up a step -->
1121 <xsl:if test="$dirnode/parent::dir">
1122 <xsl:text>../</xsl:text>
1124 <xsl:call-template name="targetpath" >
1125 <xsl:with-param name="dirnode" select="$dirnode/parent::*"/>
1126 <xsl:with-param name="targetdoc" select="$targetdoc"/>
1127 </xsl:call-template>
1132 <xsl:template name="olink.page.citation">
1133 <xsl:param name="olink.key" select="''"/>
1134 <xsl:param name="olink.lang" select="'en'"/>
1135 <xsl:param name="referrer" select="."/>
1136 <xsl:param name="target.database"/>
1137 <xsl:param name="linkend" select="''"/>
1138 <xsl:param name="xrefstyle">
1139 <xsl:apply-templates select="." mode="xrefstyle">
1140 <xsl:with-param name="olink.key" select="$olink.key"/>
1141 <xsl:with-param name="referrer" select="$referrer"/>
1142 </xsl:apply-templates>
1145 <xsl:variable name="targetdoc">
1146 <xsl:value-of select="substring-before($olink.key, '/')"/>
1150 <xsl:when test="$linkend != ''">
1151 <xsl:call-template name="xref.page.citation">
1152 <xsl:with-param name="linkend" select="$linkend"/>
1153 <xsl:with-param name="target" select="key('id', $linkend)"/>
1154 <xsl:with-param name="xrefstyle" select="$xrefstyle"/>
1155 </xsl:call-template>
1157 <xsl:when test="not(starts-with(normalize-space($xrefstyle),
1159 and (contains($xrefstyle, 'page')
1160 or contains($xrefstyle, 'Page')))
1161 and $current.docid != ''
1162 and $current.docid != $targetdoc
1163 and $insert.olink.page.number = 'yes' ">
1165 <xsl:variable name="page-number">
1166 <xsl:for-each select="$target.database" >
1168 select="key('targetptr-key', $olink.key)[1]/@page" />
1172 <xsl:if test="$page-number != ''">
1173 <xsl:call-template name="substitute-markup">
1174 <xsl:with-param name="template">
1175 <xsl:call-template name="gentext.template">
1176 <xsl:with-param name="name" select="'olink.page.citation'"/>
1177 <xsl:with-param name="context" select="'xref'"/>
1178 <xsl:with-param name="lang" select="$olink.lang"/>
1179 </xsl:call-template>
1181 <xsl:with-param name="pagenumber" select="$page-number"/>
1182 </xsl:call-template>
1189 <xsl:template name="olink.document.citation">
1190 <xsl:param name="referrer" select="."/>
1191 <xsl:param name="olink.key" select="''"/>
1192 <xsl:param name="olink.lang" select="'en'"/>
1193 <xsl:param name="target.database"/>
1194 <xsl:param name="xrefstyle">
1195 <xsl:apply-templates select="." mode="xrefstyle">
1196 <xsl:with-param name="olink.key" select="$olink.key"/>
1197 <xsl:with-param name="referrer" select="$referrer"/>
1198 </xsl:apply-templates>
1201 <xsl:variable name="page">
1202 <xsl:for-each select="$target.database" >
1204 select="key('targetptr-key', $olink.key)[1]/@page" />
1208 <xsl:variable name="targetdoc">
1209 <xsl:value-of select="substring-before($olink.key, '/')"/>
1212 <xsl:variable name="targetptr">
1214 select="substring-before(substring-after($olink.key, '/'), '/')"/>
1217 <!-- Don't add docname if pointing to root element -->
1218 <xsl:variable name="rootptr">
1219 <xsl:for-each select="$target.database" >
1221 select="key('targetdoc-key', $targetdoc)[1]/div[1]/@targetptr" />
1225 <xsl:variable name="docname">
1226 <xsl:for-each select="$target.database" >
1227 <xsl:call-template name="insert.targetdb.data">
1228 <xsl:with-param name="data"
1229 select="key('targetdoc-key', $targetdoc)[1]/div[1]/ttl/node()" />
1230 </xsl:call-template>
1234 <xsl:if test="not(starts-with(normalize-space($xrefstyle), 'select:')
1235 and (contains($xrefstyle, 'docname')))
1236 and ($olink.doctitle = 'yes' or $olink.doctitle = '1')
1237 and $current.docid != ''
1238 and $rootptr != $targetptr
1239 and $current.docid != $targetdoc
1240 and $docname != ''">
1241 <xsl:call-template name="substitute-markup">
1242 <xsl:with-param name="template">
1243 <xsl:call-template name="gentext.template">
1244 <xsl:with-param name="name" select="'olink.document.citation'"/>
1245 <xsl:with-param name="context" select="'xref'"/>
1246 <xsl:with-param name="lang" select="$olink.lang"/>
1247 </xsl:call-template>
1249 <xsl:with-param name="docname" select="$docname"/>
1250 <xsl:with-param name="pagenumber" select="$page"/>
1251 </xsl:call-template>
1255 <xsl:template name="xref.page.citation">
1256 <!-- Determine if this xref should have a page citation.
1257 Context node is the xref or local olink element -->
1258 <xsl:param name="referrer" select="."/>
1259 <xsl:param name="linkend" select="@linkend"/>
1260 <xsl:param name="target" select="key('id', $linkend)"/>
1261 <xsl:param name="xrefstyle">
1262 <xsl:apply-templates select="." mode="xrefstyle">
1263 <xsl:with-param name="target" select="$target"/>
1264 <xsl:with-param name="referrer" select="$referrer"/>
1265 </xsl:apply-templates>
1268 <xsl:if test="not(starts-with(normalize-space($xrefstyle),'select:')
1269 and (contains($xrefstyle, 'page')
1270 or contains($xrefstyle, 'Page')))
1271 and ( $insert.xref.page.number = 'yes'
1272 or $insert.xref.page.number = '1')
1273 or ( local-name($target) = 'para'
1274 and $insert.xref.page.number.para = 'yes')">
1275 <xsl:apply-templates select="$target" mode="page.citation">
1276 <xsl:with-param name="id" select="$linkend"/>
1277 </xsl:apply-templates>