2 <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
5 <!-- Create keys for quickly looking up olink targets -->
6 <xsl:key name="targetdoc-key" match="document" use="@targetdoc" />
7 <xsl:key name="targetptr-key" match="div|obj"
8 use="concat(ancestor::document/@targetdoc, '/',
9 @targetptr, '/', ancestor::document/@lang)" />
11 <!-- Return filename of database -->
12 <xsl:template name="select.target.database">
13 <xsl:param name="targetdoc.att" select="''"/>
14 <xsl:param name="targetptr.att" select="''"/>
15 <xsl:param name="olink.lang" select="''"/>
17 <!-- use root's xml:base if exists -->
18 <xsl:variable name="xml.base" select="/*/@xml:base"/>
20 <!-- This selection can be customized if needed -->
21 <xsl:variable name="target.database.filename">
23 <xsl:when test="$xml.base != '' and
24 not(starts-with($target.database.document, 'file:/')) and
25 not(starts-with($target.database.document, '/'))">
26 <xsl:call-template name="systemIdToBaseURI">
27 <xsl:with-param name="systemId" select="$xml.base"/>
29 <xsl:value-of select="$target.database.document"/>
32 <xsl:value-of select="$target.database.document"/>
37 <xsl:variable name="target.database"
38 select="document($target.database.filename,/)"/>
41 <!-- Was the database document parameter not set? -->
42 <xsl:when test="$target.database.document = ''">
44 <xsl:text>Olinks not processed: must specify a </xsl:text>
45 <xsl:text>$target.database.document parameter </xsl:text>
46 <xsl:text>when using olinks with targetdoc </xsl:text>
47 <xsl:text>and targetptr attributes.</xsl:text>
50 <!-- Did it not open? Should be a targetset element -->
51 <xsl:when test="not($target.database/*)">
53 <xsl:text>Olink error: could not open target database '</xsl:text>
54 <xsl:value-of select="$target.database.filename"/>
55 <xsl:text>'.</xsl:text>
59 <xsl:value-of select="$target.database.filename"/>
64 <xsl:template name="select.olink.key">
65 <xsl:param name="targetdoc.att" select="''"/>
66 <xsl:param name="targetptr.att" select="''"/>
67 <xsl:param name="olink.lang" select="''"/>
68 <xsl:param name="target.database"/>
70 <xsl:if test="$target.database/*">
71 <xsl:variable name="olink.fallback.sequence">
72 <xsl:call-template name="select.olink.lang.fallback">
73 <xsl:with-param name="olink.lang" select="$olink.lang"/>
77 <!-- Recurse through the languages until you find a match -->
78 <xsl:call-template name="select.olink.key.in.lang">
79 <xsl:with-param name="targetdoc.att" select="$targetdoc.att"/>
80 <xsl:with-param name="targetptr.att" select="$targetptr.att"/>
81 <xsl:with-param name="olink.lang" select="$olink.lang"/>
82 <xsl:with-param name="target.database" select="$target.database"/>
83 <xsl:with-param name="fallback.index" select="1"/>
84 <xsl:with-param name="olink.fallback.sequence"
85 select="$olink.fallback.sequence"/>
91 <!-- Locate olink key in a particular language -->
92 <xsl:template name="select.olink.key.in.lang">
93 <xsl:param name="targetdoc.att" select="''"/>
94 <xsl:param name="targetptr.att" select="''"/>
95 <xsl:param name="olink.lang" select="''"/>
96 <xsl:param name="target.database"/>
97 <xsl:param name="fallback.index" select="1"/>
98 <xsl:param name="olink.fallback.sequence" select="''"/>
100 <xsl:variable name="target.lang">
101 <xsl:call-template name="select.target.lang">
102 <xsl:with-param name="fallback.index" select="$fallback.index"/>
103 <xsl:with-param name="olink.fallback.sequence"
104 select="$olink.fallback.sequence"/>
108 <xsl:if test="$olink.debug != 0">
109 <xsl:message><xsl:text>Olink debug: cases for targetdoc='</xsl:text>
110 <xsl:value-of select="$targetdoc.att"/>
111 <xsl:text>' and targetptr='</xsl:text>
112 <xsl:value-of select="$targetptr.att"/>
113 <xsl:text>' in language '</xsl:text>
114 <xsl:value-of select="$target.lang"/>
115 <xsl:text>'.</xsl:text>
119 <!-- Customize these cases if you want different selection logic -->
120 <xsl:variable name="CaseA">
121 <!-- targetdoc.att = not blank
122 targetptr.att = not blank
124 <xsl:if test="$targetdoc.att != '' and
125 $targetptr.att != ''">
126 <xsl:for-each select="$target.database">
127 <xsl:variable name="key"
128 select="concat($targetdoc.att, '/',
132 <xsl:when test="key('targetptr-key', $key)[1]/@href != ''">
133 <xsl:value-of select="$key"/>
134 <xsl:if test="$olink.debug != 0">
135 <xsl:message>Olink debug: CaseA matched.</xsl:message>
138 <xsl:when test="$olink.debug != 0">
139 <xsl:message>Olink debug: CaseA NOT matched</xsl:message>
146 <xsl:variable name="CaseB">
147 <!-- targetdoc.att = not blank
148 targetptr.att = not blank
149 prefer.internal.olink = not zero
150 current.docid = not blank
152 <xsl:if test="$targetdoc.att != '' and
153 $targetptr.att != '' and
154 $current.docid != '' and
155 $prefer.internal.olink != 0">
156 <xsl:for-each select="$target.database">
157 <xsl:variable name="key"
158 select="concat($current.docid, '/',
162 <xsl:when test="key('targetptr-key', $key)[1]/@href != ''">
163 <xsl:value-of select="$key"/>
164 <xsl:if test="$olink.debug != 0">
165 <xsl:message>Olink debug: CaseB matched.</xsl:message>
168 <xsl:when test="$olink.debug != 0">
169 <xsl:message>Olink debug: CaseB NOT matched</xsl:message>
176 <xsl:variable name="CaseC">
177 <!-- targetdoc.att = blank
178 targetptr.att = not blank
179 current.docid = not blank
181 <xsl:if test="string-length($targetdoc.att) = 0 and
182 $targetptr.att != '' and
183 $current.docid != ''">
184 <!-- Must use a for-each to change context for keys to work -->
185 <xsl:for-each select="$target.database">
186 <xsl:variable name="key"
187 select="concat($current.docid, '/',
191 <xsl:when test="key('targetptr-key', $key)[1]/@href != ''">
192 <xsl:value-of select="$key"/>
193 <xsl:if test="$olink.debug != 0">
194 <xsl:message>Olink debug: CaseC matched.</xsl:message>
197 <xsl:when test="$olink.debug != 0">
198 <xsl:message>Olink debug: CaseC NOT matched.</xsl:message>
205 <xsl:variable name="CaseD">
206 <!-- targetdoc.att = blank
207 targetptr.att = not blank
208 current.docid = blank
210 <!-- This is possible if only one document in the database -->
211 <xsl:if test="string-length($targetdoc.att) = 0 and
212 $targetptr.att != '' and
213 string-length($current.docid) = 0 and
214 count($target.database//document) = 1">
215 <xsl:for-each select="$target.database">
216 <xsl:variable name="key"
217 select="concat(.//document/@targetdoc, '/',
221 <xsl:when test="key('targetptr-key', $key)[1]/@href != ''">
222 <xsl:value-of select="$key"/>
223 <xsl:if test="$olink.debug != 0">
224 <xsl:message>Olink debug: CaseD matched.</xsl:message>
227 <xsl:when test="$olink.debug != 0">
228 <xsl:message>Olink debug: CaseD NOT matched</xsl:message>
235 <xsl:variable name="CaseE">
236 <!-- targetdoc.att = not blank
237 targetptr.att = blank
239 <xsl:if test="$targetdoc.att != '' and
240 string-length($targetptr.att) = 0">
242 <!-- Try the document's root element id -->
243 <xsl:variable name="rootid">
245 <xsl:when test="$target.lang != ''">
246 <xsl:value-of select="$target.database//document[@targetdoc = $targetdoc.att and @lang = $target.lang]/*[1]/@targetptr"/>
249 <xsl:value-of select="$target.database//document[@targetdoc = $targetdoc.att and not(@lang)]/*[1]/@targetptr"/>
254 <xsl:for-each select="$target.database">
255 <xsl:variable name="key"
256 select="concat($targetdoc.att, '/',
260 <xsl:when test="key('targetptr-key', $key)[1]/@href != ''">
261 <xsl:value-of select="$key"/>
262 <xsl:if test="$olink.debug != 0">
263 <xsl:message>Olink debug: CaseE matched.</xsl:message>
266 <xsl:when test="$olink.debug != 0">
267 <xsl:message>Olink debug: CaseE NOT matched.</xsl:message>
274 <xsl:variable name="CaseF">
275 <!-- targetdoc.att = not blank
276 targetptr.att = blank
277 prefer.internal.olink = not zero
278 current.docid = not blank
280 <xsl:if test="$targetdoc.att != '' and
281 string-length($targetptr.att) = 0 and
282 $current.docid != '' and
283 $prefer.internal.olink != 0">
284 <!-- Try the document's root element id -->
285 <xsl:variable name="rootid">
287 <xsl:when test="$target.lang != ''">
288 <xsl:value-of select="$target.database//document[@targetdoc = $current.docid and @lang = $target.lang]/*[1]/@targetptr"/>
291 <xsl:value-of select="$target.database//document[@targetdoc = $current.docid and not(@lang)]/*[1]/@targetptr"/>
296 <xsl:for-each select="$target.database">
297 <xsl:variable name="key"
298 select="concat($current.docid, '/',
302 <xsl:when test="key('targetptr-key', $key)[1]/@href != ''">
303 <xsl:value-of select="$key"/>
304 <xsl:if test="$olink.debug != 0">
305 <xsl:message>Olink debug: CaseF matched.</xsl:message>
308 <xsl:when test="$olink.debug != 0">
309 <xsl:message>Olink debug: CaseF NOT matched.</xsl:message>
316 <!-- Now select the best match. Customize the order if needed -->
317 <xsl:variable name="selected.key">
319 <xsl:when test="$CaseB != ''">
320 <xsl:value-of select="$CaseB"/>
321 <xsl:if test="$olink.debug != 0">
323 <xsl:text>Olink debug: CaseB key is the final selection: </xsl:text>
324 <xsl:value-of select="$CaseB"/>
328 <xsl:when test="$CaseA != ''">
329 <xsl:value-of select="$CaseA"/>
330 <xsl:if test="$olink.debug != 0">
332 <xsl:text>Olink debug: CaseA key is the final selection: </xsl:text>
333 <xsl:value-of select="$CaseA"/>
337 <xsl:when test="$CaseC != ''">
338 <xsl:value-of select="$CaseC"/>
339 <xsl:if test="$olink.debug != 0">
341 <xsl:text>Olink debug: CaseC key is the final selection: </xsl:text>
342 <xsl:value-of select="$CaseC"/>
346 <xsl:when test="$CaseD != ''">
347 <xsl:value-of select="$CaseD"/>
348 <xsl:if test="$olink.debug != 0">
350 <xsl:text>Olink debug: CaseD key is the final selection: </xsl:text>
351 <xsl:value-of select="$CaseD"/>
355 <xsl:when test="$CaseF != ''">
356 <xsl:value-of select="$CaseF"/>
357 <xsl:if test="$olink.debug != 0">
359 <xsl:text>Olink debug: CaseF key is the final selection: </xsl:text>
360 <xsl:value-of select="$CaseF"/>
364 <xsl:when test="$CaseE != ''">
365 <xsl:value-of select="$CaseE"/>
366 <xsl:if test="$olink.debug != 0">
368 <xsl:text>Olink debug: CaseE key is the final selection: </xsl:text>
369 <xsl:value-of select="$CaseE"/>
374 <xsl:if test="$olink.debug != 0">
376 <xsl:text>Olink debug: No case matched for lang '</xsl:text>
377 <xsl:value-of select="$target.lang"/>
378 <xsl:text>'.</xsl:text>
386 <xsl:when test="$selected.key != ''">
387 <xsl:value-of select="$selected.key"/>
389 <xsl:when test="string-length($selected.key) = 0 and
390 string-length($target.lang) = 0">
391 <!-- No match on last try, and we are done -->
394 <!-- Recurse through next language -->
395 <xsl:call-template name="select.olink.key.in.lang">
396 <xsl:with-param name="targetdoc.att" select="$targetdoc.att"/>
397 <xsl:with-param name="targetptr.att" select="$targetptr.att"/>
398 <xsl:with-param name="olink.lang" select="$olink.lang"/>
399 <xsl:with-param name="target.database" select="$target.database"/>
400 <xsl:with-param name="fallback.index" select="$fallback.index + 1"/>
401 <xsl:with-param name="olink.fallback.sequence"
402 select="$olink.fallback.sequence"/>
409 <xsl:template name="select.target.lang">
410 <xsl:param name="fallback.index" select="1"/>
411 <xsl:param name="olink.fallback.sequence" select="''"/>
413 <!-- recurse backwards to find the lang matching the index -->
414 <xsl:variable name="firstlang"
415 select="substring-before($olink.fallback.sequence, ' ')"/>
416 <xsl:variable name="rest"
417 select="substring-after($olink.fallback.sequence, ' ')"/>
419 <xsl:when test="$fallback.index = 1">
420 <xsl:value-of select="$firstlang"/>
422 <xsl:when test="$fallback.index > 1">
423 <xsl:call-template name="select.target.lang">
424 <xsl:with-param name="fallback.index" select="$fallback.index - 1"/>
425 <xsl:with-param name="olink.fallback.sequence"
434 <xsl:template name="select.olink.lang.fallback">
435 <xsl:param name="olink.lang" select="''"/>
437 <!-- Prefer language of the olink element -->
438 <xsl:value-of select="concat(normalize-space(concat($olink.lang, ' ',
439 $olink.lang.fallback.sequence)), ' ')"/>
442 <!-- Returns the complete olink href value if found -->
443 <xsl:template name="make.olink.href">
444 <xsl:param name="olink.key" select="''"/>
445 <xsl:param name="target.database"/>
447 <xsl:if test="$olink.key != ''">
448 <xsl:variable name="target.href" >
449 <xsl:for-each select="$target.database" >
450 <xsl:value-of select="key('targetptr-key', $olink.key)[1]/@href" />
454 <xsl:variable name="targetdoc">
455 <xsl:value-of select="substring-before($olink.key, '/')"/>
458 <!-- Does the target database use a sitemap? -->
459 <xsl:variable name="use.sitemap">
461 <xsl:when test="$target.database//sitemap">1</xsl:when>
462 <xsl:otherwise>0</xsl:otherwise>
467 <!-- Get the baseuri for this targetptr -->
468 <xsl:variable name="baseuri" >
470 <!-- Does the database use a sitemap? -->
471 <xsl:when test="$use.sitemap != 0" >
473 <!-- Was current.docid parameter set? -->
474 <xsl:when test="$current.docid != ''">
475 <!-- Was it found in the database? -->
476 <xsl:variable name="currentdoc.key" >
477 <xsl:for-each select="$target.database" >
478 <xsl:value-of select="key('targetdoc-key',
479 $current.docid)[1]/@targetdoc" />
483 <xsl:when test="$currentdoc.key != ''">
484 <xsl:for-each select="$target.database" >
485 <xsl:call-template name="targetpath" >
486 <xsl:with-param name="dirnode"
487 select="key('targetdoc-key', $current.docid)[1]/parent::dir"/>
488 <xsl:with-param name="targetdoc" select="$targetdoc"/>
494 <xsl:text>Olink error: cannot compute relative </xsl:text>
495 <xsl:text>sitemap path because $current.docid '</xsl:text>
496 <xsl:value-of select="$current.docid"/>
497 <xsl:text>' not found in target database.</xsl:text>
504 <xsl:text>Olink warning: cannot compute relative </xsl:text>
505 <xsl:text>sitemap path without $current.docid parameter</xsl:text>
509 <!-- In either case, add baseuri from its document entry-->
510 <xsl:variable name="docbaseuri">
511 <xsl:for-each select="$target.database" >
512 <xsl:value-of select="key('targetdoc-key', $targetdoc)[1]/@baseuri" />
515 <xsl:if test="$docbaseuri != ''" >
516 <xsl:value-of select="$docbaseuri"/>
519 <!-- No database sitemap in use -->
521 <!-- Just use any baseuri from its document entry -->
522 <xsl:variable name="docbaseuri">
523 <xsl:for-each select="$target.database" >
524 <xsl:value-of select="key('targetdoc-key', $targetdoc)[1]/@baseuri" />
527 <xsl:if test="$docbaseuri != ''" >
528 <xsl:value-of select="$docbaseuri"/>
534 <!-- Form the href information -->
535 <xsl:if test="$baseuri != ''">
536 <xsl:value-of select="$baseuri"/>
537 <xsl:if test="substring($target.href,1,1) != '#'">
538 <!--xsl:text>/</xsl:text-->
541 <!-- optionally turn off frag for PDF references -->
542 <xsl:if test="not($insert.olink.pdf.frag = 0 and
543 translate(substring($baseuri, string-length($baseuri) - 3),
544 'PDF', 'pdf') = '.pdf'
545 and starts-with($target.href, '#') )">
546 <xsl:value-of select="$target.href"/>
551 <!-- Computes the href of the object containing the olink element -->
552 <xsl:template name="olink.from.uri">
553 <xsl:param name="target.database"/>
554 <xsl:param name="object" select="NotAnElement"/>
555 <xsl:param name="object.targetdoc" select="$current.docid"/>
556 <xsl:param name="object.lang"
557 select="concat($object/ancestor::*[last()]/@lang,
558 $object/ancestor::*[last()]/@xml:lang)"/>
560 <xsl:variable name="parent.id">
561 <xsl:call-template name="object.id">
562 <xsl:with-param name="object" select="$object"/>
566 <!-- Get the olink key for the parent of olink element -->
567 <xsl:variable name="from.key">
568 <xsl:call-template name="select.olink.key">
569 <xsl:with-param name="targetdoc.att" select="$object.targetdoc"/>
570 <xsl:with-param name="targetptr.att" select="$parent.id"/>
571 <xsl:with-param name="olink.lang" select="$object.lang"/>
572 <xsl:with-param name="target.database" select="$target.database"/>
576 <xsl:variable name="from.olink.href">
577 <xsl:for-each select="$target.database" >
578 <xsl:value-of select="key('targetptr-key', $from.key)[1]/@href" />
583 <!-- we found the olink object -->
584 <xsl:when test="$from.olink.href != ''">
585 <xsl:value-of select="$from.olink.href"/>
587 <xsl:when test="not($object/parent::*)">
588 <xsl:value-of select="$from.olink.href"/>
591 <!-- recurse upward in current document -->
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="$object/parent::*"/>
595 <xsl:with-param name="object.targetdoc" select="$object.targetdoc"/>
596 <xsl:with-param name="object.lang" select="$object.lang"/>
603 <xsl:template name="olink.hottext">
604 <xsl:param name="target.database"/>
605 <xsl:param name="olink.lang" select="''"/>
606 <xsl:param name="olink.key" select="''"/>
607 <xsl:param name="referrer" select="."/>
608 <xsl:param name="xrefstyle">
610 <xsl:when test="@role and not(@xrefstyle)
611 and $use.role.as.xrefstyle != 0">
612 <xsl:value-of select="@role"/>
615 <xsl:value-of select="@xrefstyle"/>
621 <!-- If it has elements or text (not just PI or comment) -->
622 <xsl:when test="child::text() or child::*">
623 <xsl:apply-templates/>
625 <xsl:when test="$olink.key != ''">
626 <!-- Get the xref text for this record -->
627 <xsl:variable name="xref.text" >
628 <xsl:for-each select="$target.database" >
629 <xsl:call-template name="insert.targetdb.data">
630 <xsl:with-param name="data"
631 select="key('targetptr-key', $olink.key)[1]/xreftext/node()" />
636 <xsl:variable name="xref.number" >
637 <xsl:for-each select="$target.database" >
638 <xsl:value-of select="key('targetptr-key', $olink.key)[1]/@number" />
642 <xsl:variable name="target.elem" >
643 <xsl:for-each select="$target.database" >
644 <xsl:value-of select="key('targetptr-key', $olink.key)[1]/@element" />
648 <xsl:variable name="lang">
649 <xsl:variable name="candidate">
650 <xsl:for-each select="$target.database" >
652 select="key('targetptr-key', $olink.key)[1]/@lang" />
656 <xsl:when test="$candidate != ''">
657 <xsl:value-of select="$candidate"/>
660 <xsl:value-of select="$olink.lang"/>
665 <xsl:variable name="targetdoc">
666 <xsl:value-of select="substring-before($olink.key, '/')"/>
670 <xsl:when test="$xrefstyle != '' and
671 starts-with(normalize-space($xrefstyle), 'select:') and
672 (contains($xrefstyle, 'nodocname') or
673 contains($xrefstyle, 'nopage')) and
674 not(contains($xrefstyle, 'title')) and
675 not(contains($xrefstyle, 'label'))">
676 <xsl:copy-of select="$xref.text"/>
678 <xsl:when test="$xrefstyle != ''">
679 <xsl:if test="$olink.debug != 0">
681 <xsl:text>xrefstyle is '</xsl:text>
682 <xsl:value-of select="$xrefstyle"/>
683 <xsl:text>'.</xsl:text>
686 <xsl:variable name="template">
688 <xsl:when test="starts-with(normalize-space($xrefstyle),
690 <xsl:call-template name="make.gentext.template">
691 <xsl:with-param name="xrefstyle" select="$xrefstyle"/>
692 <xsl:with-param name="purpose" select="'olink'"/>
693 <xsl:with-param name="referrer" select="."/>
694 <xsl:with-param name="target.elem" select="$target.elem"/>
697 <xsl:when test="starts-with(normalize-space($xrefstyle),
699 <xsl:value-of select="substring-after(
700 normalize-space($xrefstyle), 'template:')"/>
703 <!-- Look for Gentext template with @style attribute -->
704 <!-- Must compare to no style value because gentext.template
705 falls back to no style -->
707 <xsl:variable name="xref-context">
708 <xsl:call-template name="gentext.template">
709 <xsl:with-param name="context" select="'xref'"/>
710 <xsl:with-param name="name" select="$target.elem"/>
711 <xsl:with-param name="lang" select="$lang"/>
715 <xsl:variable name="styled-xref-context">
716 <xsl:call-template name="gentext.template">
717 <xsl:with-param name="context" select="'xref'"/>
718 <xsl:with-param name="name" select="$target.elem"/>
719 <xsl:with-param name="lang" select="$lang"/>
720 <xsl:with-param name="xrefstyle" select="$xrefstyle"/>
724 <xsl:variable name="xref-number-context">
725 <xsl:call-template name="gentext.template">
726 <xsl:with-param name="context" select="'xref-number'"/>
727 <xsl:with-param name="name" select="$target.elem"/>
728 <xsl:with-param name="lang" select="$lang"/>
732 <xsl:variable name="styled-xref-number-context">
733 <xsl:call-template name="gentext.template">
734 <xsl:with-param name="context" select="'xref-number'"/>
735 <xsl:with-param name="name" select="$target.elem"/>
736 <xsl:with-param name="lang" select="$lang"/>
737 <xsl:with-param name="xrefstyle" select="$xrefstyle"/>
741 <xsl:variable name="xref-number-and-title-context">
742 <xsl:call-template name="gentext.template">
743 <xsl:with-param name="context"
744 select="'xref-number-and-title'"/>
745 <xsl:with-param name="name" select="$target.elem"/>
746 <xsl:with-param name="lang" select="$lang"/>
750 <xsl:variable name="styled-xref-number-and-title-context">
751 <xsl:call-template name="gentext.template">
752 <xsl:with-param name="context"
753 select="'xref-number-and-title'"/>
754 <xsl:with-param name="name" select="$target.elem"/>
755 <xsl:with-param name="lang" select="$lang"/>
756 <xsl:with-param name="xrefstyle" select="$xrefstyle"/>
761 <xsl:when test="$xref-number-and-title-context !=
762 $styled-xref-number-and-title-context and
763 $xref.number != '' and
764 $xref.with.number.and.title != 0">
766 select="$styled-xref-number-and-title-context"/>
768 <xsl:when test="$xref-number-context !=
769 $styled-xref-number-context and
771 <xsl:value-of select="$styled-xref-number-context"/>
773 <xsl:when test="$xref-context != $styled-xref-context">
774 <xsl:value-of select="$styled-xref-context"/>
776 <xsl:when test="$xref-number-and-title-context != '' and
777 $xref.number != '' and
778 $xref.with.number.and.title != 0">
780 select="$xref-number-and-title-context"/>
781 <xsl:if test="$olink.debug">
783 <xsl:text>Olink error: no gentext template</xsl:text>
784 <xsl:text> exists for xrefstyle '</xsl:text>
785 <xsl:value-of select="$xrefstyle"/>
786 <xsl:text>' for element '</xsl:text>
787 <xsl:value-of select="$target.elem"/>
788 <xsl:text>' in language '</xsl:text>
789 <xsl:value-of select="$lang"/>
790 <xsl:text>' in context 'xref-number-and-title</xsl:text>
791 <xsl:text>'. Using template without @style.</xsl:text>
795 <xsl:when test="$xref-number-context != '' and
797 <xsl:value-of select="$xref-number-context"/>
798 <xsl:if test="$olink.debug">
800 <xsl:text>Olink error: no gentext template</xsl:text>
801 <xsl:text> exists for xrefstyle '</xsl:text>
802 <xsl:value-of select="$xrefstyle"/>
803 <xsl:text>' for element '</xsl:text>
804 <xsl:value-of select="$target.elem"/>
805 <xsl:text>' in language '</xsl:text>
806 <xsl:value-of select="$lang"/>
807 <xsl:text>' in context 'xref-number</xsl:text>
808 <xsl:text>'. Using template without @style.</xsl:text>
812 <xsl:when test="$xref-context != ''">
813 <xsl:value-of select="$xref-context"/>
814 <xsl:if test="$olink.debug">
816 <xsl:text>Olink error: no gentext template</xsl:text>
817 <xsl:text> exists for xrefstyle '</xsl:text>
818 <xsl:value-of select="$xrefstyle"/>
819 <xsl:text>' for element '</xsl:text>
820 <xsl:value-of select="$target.elem"/>
821 <xsl:text>' in language '</xsl:text>
822 <xsl:value-of select="$lang"/>
823 <xsl:text>' in context 'xref</xsl:text>
824 <xsl:text>'. Using template without @style.</xsl:text>
830 <xsl:text>Olink error: no gentext template</xsl:text>
831 <xsl:text> exists for xrefstyle '</xsl:text>
832 <xsl:value-of select="$xrefstyle"/>
833 <xsl:text>' for element '</xsl:text>
834 <xsl:value-of select="$target.elem"/>
835 <xsl:text>' in language '</xsl:text>
836 <xsl:value-of select="$lang"/>
837 <xsl:text>'. Trying '%t'.</xsl:text>
839 <xsl:value-of select="'%t'"/>
846 <xsl:if test="$olink.debug != 0">
848 <xsl:text>Olink debug: xrefstyle template is '</xsl:text>
849 <xsl:value-of select="$template"/>
850 <xsl:text>'.</xsl:text>
854 <xsl:call-template name="substitute-markup">
855 <xsl:with-param name="template" select="$template"/>
856 <xsl:with-param name="title">
857 <xsl:for-each select="$target.database" >
858 <xsl:call-template name="insert.targetdb.data">
859 <xsl:with-param name="data"
860 select="key('targetptr-key', $olink.key)/ttl" />
864 <xsl:with-param name="label">
865 <xsl:for-each select="$target.database" >
867 select="key('targetptr-key', $olink.key)[1]/@number" />
870 <xsl:with-param name="pagenumber">
871 <xsl:for-each select="$target.database" >
873 select="key('targetptr-key', $olink.key)[1]/@page" />
876 <xsl:with-param name="docname">
877 <xsl:for-each select="$target.database" >
878 <xsl:call-template name="insert.targetdb.data">
879 <xsl:with-param name="data"
880 select="key('targetdoc-key', $targetdoc)[1]/div[1]/ttl" />
887 <xsl:when test="$use.local.olink.style != 0">
889 <!-- Is autonumbering on? -->
890 <xsl:variable name="target.number">
891 <xsl:for-each select="$target.database" >
893 select="key('targetptr-key', $olink.key)[1]/@number" />
897 <xsl:variable name="autonumber">
899 <xsl:when test="$target.number != ''">1</xsl:when>
900 <xsl:otherwise>0</xsl:otherwise>
904 <xsl:variable name="number-and-title-template">
905 <xsl:call-template name="gentext.template.exists">
906 <xsl:with-param name="context" select="'xref-number-and-title'"/>
907 <xsl:with-param name="name" select="$target.elem"/>
911 <xsl:variable name="number-template">
912 <xsl:call-template name="gentext.template.exists">
913 <xsl:with-param name="context" select="'xref-number'"/>
914 <xsl:with-param name="name" select="$target.elem"/>
918 <xsl:variable name="context">
920 <xsl:when test="string($autonumber) != 0
921 and $number-and-title-template != 0
922 and $xref.with.number.and.title != 0">
923 <xsl:value-of select="'xref-number-and-title'"/>
925 <xsl:when test="string($autonumber) != 0
926 and $number-template != 0">
927 <xsl:value-of select="'xref-number'"/>
930 <xsl:value-of select="'xref'"/>
935 <xsl:variable name="template">
936 <xsl:call-template name="gentext.template">
937 <xsl:with-param name="context" select="$context"/>
938 <xsl:with-param name="name" select="$target.elem"/>
939 <xsl:with-param name="lang" select="$lang"/>
943 <xsl:call-template name="substitute-markup">
944 <xsl:with-param name="template" select="$template"/>
945 <xsl:with-param name="title">
946 <xsl:for-each select="$target.database" >
947 <xsl:call-template name="insert.targetdb.data">
948 <xsl:with-param name="data"
949 select="key('targetptr-key', $olink.key)[1]/ttl" />
953 <xsl:with-param name="label">
954 <xsl:for-each select="$target.database" >
955 <xsl:call-template name="insert.targetdb.data">
956 <xsl:with-param name="data"
957 select="key('targetptr-key', $olink.key)[1]/@number" />
963 <xsl:when test="$xref.text !=''">
964 <xsl:copy-of select="$xref.text"/>
968 <xsl:text>Olink error: no generated text for </xsl:text>
969 <xsl:text>targetdoc/targetptr/lang = '</xsl:text>
970 <xsl:value-of select="$olink.key"/>
971 <xsl:text>'.</xsl:text>
973 <xsl:text>????</xsl:text>
977 <xsl:when test="@targetdoc != '' or @targetptr != ''">
978 <xsl:if test="$olink.key != ''">
980 <xsl:text>Olink error: no generated text for </xsl:text>
981 <xsl:text>targetdoc/targetptr/lang = '</xsl:text>
982 <xsl:value-of select="$olink.key"/>
983 <xsl:text>'.</xsl:text>
986 <xsl:text>????</xsl:text>
989 <!-- old style olink -->
990 <xsl:call-template name="olink.outline">
991 <xsl:with-param name="outline.base.uri"
992 select="unparsed-entity-uri(@targetdocent)"/>
993 <xsl:with-param name="localinfo" select="@localinfo"/>
994 <xsl:with-param name="return" select="'xreftext'"/>
1000 <xsl:template name="insert.targetdb.data">
1001 <xsl:param name="data"/>
1002 <!-- Customize this to massage data further -->
1003 <xsl:copy-of select="$data"/>
1006 <xsl:template match="*" mode="olink.docname.markup">
1007 <!-- No-op for now -->
1010 <xsl:template name="targetpath">
1011 <xsl:param name="dirnode" />
1012 <xsl:param name="targetdoc" select="''"/>
1015 <xsl:message>dirnode is <xsl:value-of select="$dirnode/@name"/></xsl:message>
1016 <xsl:message>targetdoc is <xsl:value-of select="$targetdoc"/></xsl:message>
1018 <!-- recursive template generates path to olink target directory -->
1020 <!-- Have we arrived at the final path step? -->
1021 <xsl:when test="$dirnode/child::document[@targetdoc = $targetdoc]">
1022 <!-- We are done -->
1024 <!-- Have we reached the top without a match? -->
1025 <xsl:when test="local-name($dirnode) != 'dir'" >
1026 <xsl:message>Olink error: cannot locate targetdoc <xsl:value-of select="$targetdoc"/> in sitemap</xsl:message>
1028 <!-- Is the target in a descendant? -->
1029 <xsl:when test="$dirnode/descendant::document/@targetdoc = $targetdoc">
1030 <xsl:variable name="step" select="$dirnode/child::dir[descendant::document/@targetdoc = $targetdoc]"/>
1031 <xsl:if test = "$step">
1032 <xsl:value-of select="$step/@name"/>
1033 <xsl:text>/</xsl:text>
1035 <!-- Now recurse with the child -->
1036 <xsl:call-template name="targetpath" >
1037 <xsl:with-param name="dirnode" select="$step"/>
1038 <xsl:with-param name="targetdoc" select="$targetdoc"/>
1039 </xsl:call-template>
1041 <!-- Otherwise we need to move up a step -->
1043 <xsl:if test="$dirnode/parent::dir">
1044 <xsl:text>../</xsl:text>
1046 <xsl:call-template name="targetpath" >
1047 <xsl:with-param name="dirnode" select="$dirnode/parent::*"/>
1048 <xsl:with-param name="targetdoc" select="$targetdoc"/>
1049 </xsl:call-template>
1054 <xsl:template name="olink.page.citation">
1055 <xsl:param name="olink.key" select="''"/>
1056 <xsl:param name="olink.lang" select="'en'"/>
1057 <xsl:param name="target.database"/>
1058 <xsl:param name="linkend" select="''"/>
1059 <xsl:param name="xrefstyle">
1061 <xsl:when test="@role and not(@xrefstyle)
1062 and $use.role.as.xrefstyle != 0">
1063 <xsl:value-of select="@role"/>
1066 <xsl:value-of select="@xrefstyle"/>
1071 <xsl:variable name="targetdoc">
1072 <xsl:value-of select="substring-before($olink.key, '/')"/>
1076 <xsl:when test="$linkend != ''">
1077 <xsl:call-template name="xref.page.citation">
1078 <xsl:with-param name="linkend" select="$linkend"/>
1079 <xsl:with-param name="target" select="key('id', $linkend)"/>
1080 <xsl:with-param name="xrefstyle" select="$xrefstyle"/>
1081 </xsl:call-template>
1083 <xsl:when test="not(starts-with(normalize-space($xrefstyle),
1085 and (contains($xrefstyle, 'page')
1086 or contains($xrefstyle, 'Page')))
1087 and $current.docid != ''
1088 and $current.docid != $targetdoc
1089 and $insert.olink.page.number = 'yes' ">
1091 <xsl:variable name="page-number">
1092 <xsl:for-each select="$target.database" >
1094 select="key('targetptr-key', $olink.key)[1]/@page" />
1098 <xsl:if test="$page-number != ''">
1099 <xsl:call-template name="substitute-markup">
1100 <xsl:with-param name="template">
1101 <xsl:call-template name="gentext.template">
1102 <xsl:with-param name="name" select="'olink.page.citation'"/>
1103 <xsl:with-param name="context" select="'xref'"/>
1104 <xsl:with-param name="lang" select="$olink.lang"/>
1105 </xsl:call-template>
1107 <xsl:with-param name="pagenumber" select="$page-number"/>
1108 </xsl:call-template>
1115 <xsl:template name="olink.document.citation">
1116 <xsl:param name="olink.key" select="''"/>
1117 <xsl:param name="olink.lang" select="'en'"/>
1118 <xsl:param name="target.database"/>
1119 <xsl:param name="xrefstyle">
1121 <xsl:when test="@role and not(@xrefstyle)
1122 and $use.role.as.xrefstyle != 0">
1123 <xsl:value-of select="@role"/>
1126 <xsl:value-of select="@xrefstyle"/>
1131 <xsl:variable name="page">
1132 <xsl:for-each select="$target.database" >
1134 select="key('targetptr-key', $olink.key)[1]/@page" />
1138 <xsl:variable name="targetdoc">
1139 <xsl:value-of select="substring-before($olink.key, '/')"/>
1142 <xsl:variable name="targetptr">
1144 select="substring-before(substring-after($olink.key, '/'), '/')"/>
1147 <!-- Don't add docname if pointing to root element -->
1148 <xsl:variable name="rootptr">
1149 <xsl:for-each select="$target.database" >
1151 select="key('targetdoc-key', $targetdoc)[1]/div[1]/@targetptr" />
1155 <xsl:variable name="docname">
1156 <xsl:for-each select="$target.database" >
1157 <xsl:call-template name="insert.targetdb.data">
1158 <xsl:with-param name="data"
1159 select="key('targetdoc-key', $targetdoc)[1]/div[1]/ttl" />
1160 </xsl:call-template>
1164 <xsl:if test="not(starts-with(normalize-space($xrefstyle), 'select:')
1165 and (contains($xrefstyle, 'docname')))
1166 and ($olink.doctitle = 'yes' or $olink.doctitle = '1')
1167 and $current.docid != ''
1168 and $rootptr != $targetptr
1169 and $current.docid != $targetdoc
1170 and $docname != ''">
1171 <xsl:call-template name="substitute-markup">
1172 <xsl:with-param name="template">
1173 <xsl:call-template name="gentext.template">
1174 <xsl:with-param name="name" select="'olink.document.citation'"/>
1175 <xsl:with-param name="context" select="'xref'"/>
1176 <xsl:with-param name="lang" select="$olink.lang"/>
1177 </xsl:call-template>
1179 <xsl:with-param name="docname" select="$docname"/>
1180 <xsl:with-param name="pagenumber" select="$page"/>
1181 </xsl:call-template>
1185 <xsl:template name="xref.page.citation">
1186 <!-- Determine if this xref should have a page citation.
1187 Context node is the xref or local olink element -->
1188 <xsl:param name="linkend" select="@linkend"/>
1189 <xsl:param name="target" select="key('id', $linkend)"/>
1190 <xsl:param name="xrefstyle">
1192 <xsl:when test="@role and not(@xrefstyle)
1193 and $use.role.as.xrefstyle != 0">
1194 <xsl:value-of select="@role"/>
1197 <xsl:value-of select="@xrefstyle"/>
1202 <xsl:if test="not(starts-with(normalize-space($xrefstyle),'select:')
1203 and (contains($xrefstyle, 'page')
1204 or contains($xrefstyle, 'Page')))
1205 and ( $insert.xref.page.number = 'yes'
1206 or $insert.xref.page.number = '1')
1207 or local-name($target) = 'para'">
1208 <xsl:apply-templates select="$target" mode="page.citation">
1209 <xsl:with-param name="id" select="$linkend"/>
1210 </xsl:apply-templates>