]> git.lyx.org Git - lyx.git/blob - lib/docbook/common/olink.xsl
Use same find-dialogs as other bind-files also for x?emacs
[lyx.git] / lib / docbook / common / olink.xsl
1 <?xml version="1.0"?>
2 <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
3                 version="1.0">
4
5 <!-- ********************************************************************
6
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.
10
11      ******************************************************************** -->
12
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)" />
18
19 <!-- Customize this template if you want olink errors to be fatal -->
20 <xsl:template name="olink.error">
21   <xsl:param name="message"/>
22
23   <xsl:message>
24     <xsl:text>Olink error: </xsl:text>
25     <xsl:value-of select="$message"/>
26   </xsl:message>
27 </xsl:template>
28
29 <!-- Customize this template if you want olink warnings to be fatal -->
30 <xsl:template name="olink.warning">
31   <xsl:param name="message"/>
32
33   <xsl:message>
34     <xsl:text>Olink warning: </xsl:text>
35     <xsl:value-of select="$message"/>
36   </xsl:message>
37 </xsl:template>
38
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"/>
43
44   <xsl:message>
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>
50   </xsl:message>
51 </xsl:template>
52
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="''"/>
58
59   <!-- use root's xml:base if exists -->
60   <xsl:variable name="xml.base" select="/*/@xml:base"/>
61
62   <!-- This selection can be customized if needed -->
63   <xsl:variable name="target.database.filename">
64     <xsl:choose>
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"/>
70         </xsl:call-template>
71         <xsl:value-of select="$target.database.document"/>
72       </xsl:when>
73       <xsl:otherwise>
74         <xsl:value-of select="$target.database.document"/>
75       </xsl:otherwise>
76     </xsl:choose>
77   </xsl:variable>
78
79   <xsl:variable name="target.database" 
80       select="document($target.database.filename,/)"/>
81
82   <xsl:choose>
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&#10;</xsl:text>
89           <xsl:text>when using olinks with targetdoc </xsl:text>
90           <xsl:text>and targetptr attributes.</xsl:text>
91         </xsl:with-param>
92       </xsl:call-template>
93     </xsl:when>
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>
100         </xsl:with-param>
101       </xsl:call-template>
102     </xsl:when>
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>
110         </xsl:with-param>
111       </xsl:call-template>
112     </xsl:when>
113     <xsl:otherwise>
114       <xsl:value-of select="$target.database.filename"/>
115     </xsl:otherwise>
116   </xsl:choose>
117 </xsl:template>
118
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"/>
124
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"/>
129       </xsl:call-template>
130     </xsl:variable>
131   
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"/>
141     </xsl:call-template>
142   </xsl:if>
143   
144 </xsl:template>
145
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="''"/>
154   
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"/>
160     </xsl:call-template>
161   </xsl:variable>
162
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>
171     </xsl:message>
172   </xsl:if>
173
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
178     -->
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, '/', 
184                                      $targetptr.att, '/',
185                                      $target.lang)"/>
186         <xsl:choose>
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>
191             </xsl:if>
192           </xsl:when>
193           <xsl:when test="$olink.debug != 0">
194             <xsl:message>Olink debug: CaseA NOT matched</xsl:message>
195           </xsl:when>
196         </xsl:choose>
197       </xsl:for-each>
198     </xsl:if>
199   </xsl:variable>
200
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 
206     -->
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, '/', 
214                                      $targetptr.att, '/',
215                                      $target.lang)"/>
216         <xsl:choose>
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>
221             </xsl:if>
222           </xsl:when>
223           <xsl:when test="$olink.debug != 0">
224             <xsl:message>Olink debug: CaseB NOT matched</xsl:message>
225           </xsl:when>
226         </xsl:choose>
227       </xsl:for-each>
228     </xsl:if>
229   </xsl:variable>
230
231   <xsl:variable name="CaseC">
232     <!-- targetdoc.att = blank
233          targetptr.att = not blank
234          current.docid = not blank 
235     -->
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, '/', 
243                                      $targetptr.att, '/',
244                                      $target.lang)"/>
245         <xsl:choose>
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>
250             </xsl:if>
251           </xsl:when>
252           <xsl:when test="$olink.debug != 0">
253             <xsl:message>Olink debug: CaseC NOT matched.</xsl:message>
254           </xsl:when>
255         </xsl:choose>
256       </xsl:for-each>
257     </xsl:if>
258   </xsl:variable>
259
260   <xsl:variable name="CaseD">
261     <!-- targetdoc.att = blank
262          targetptr.att = not blank
263          current.docid = blank 
264     -->
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, '/', 
273                                      $targetptr.att, '/',
274                                      $target.lang)"/>
275         <xsl:choose>
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>
280             </xsl:if>
281           </xsl:when>
282           <xsl:when test="$olink.debug != 0">
283             <xsl:message>Olink debug: CaseD NOT matched</xsl:message>
284           </xsl:when>
285         </xsl:choose>
286       </xsl:for-each>
287     </xsl:if>
288   </xsl:variable>
289
290   <xsl:variable name="CaseE">
291     <!-- targetdoc.att = not blank
292          targetptr.att = blank
293     -->
294     <xsl:if test="$targetdoc.att != '' and
295                   string-length($targetptr.att) = 0">
296
297       <!-- Try the document's root element id -->
298       <xsl:variable name="rootid">
299         <xsl:choose>
300           <xsl:when test="$target.lang != ''">
301             <xsl:value-of select="$target.database//document[@targetdoc = $targetdoc.att and @lang = $target.lang]/*[1]/@targetptr"/>
302           </xsl:when>
303           <xsl:otherwise>
304             <xsl:value-of select="$target.database//document[@targetdoc = $targetdoc.att and not(@lang)]/*[1]/@targetptr"/>
305           </xsl:otherwise>
306         </xsl:choose>
307       </xsl:variable>
308
309       <xsl:for-each select="$target.database">
310         <xsl:variable name="key" 
311                       select="concat($targetdoc.att, '/', 
312                                      $rootid, '/',
313                                      $target.lang)"/>
314         <xsl:choose>
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>
319             </xsl:if>
320           </xsl:when>
321           <xsl:when test="$olink.debug != 0">
322             <xsl:message>Olink debug: CaseE NOT matched.</xsl:message>
323           </xsl:when>
324         </xsl:choose>
325       </xsl:for-each>
326     </xsl:if>
327   </xsl:variable>
328
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 
334     -->
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">
341         <xsl:choose>
342           <xsl:when test="$target.lang != ''">
343             <xsl:value-of select="$target.database//document[@targetdoc = $current.docid and @lang = $target.lang]/*[1]/@targetptr"/>
344           </xsl:when>
345           <xsl:otherwise>
346             <xsl:value-of select="$target.database//document[@targetdoc = $current.docid and not(@lang)]/*[1]/@targetptr"/>
347           </xsl:otherwise>
348         </xsl:choose>
349       </xsl:variable>
350
351       <xsl:for-each select="$target.database">
352         <xsl:variable name="key" 
353                       select="concat($current.docid, '/', 
354                                      $rootid, '/',
355                                      $target.lang)"/>
356         <xsl:choose>
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>
361             </xsl:if>
362           </xsl:when>
363           <xsl:when test="$olink.debug != 0">
364             <xsl:message>Olink debug: CaseF NOT matched.</xsl:message>
365           </xsl:when>
366         </xsl:choose>
367       </xsl:for-each>
368     </xsl:if>
369   </xsl:variable>
370
371   <!-- Now select the best match. Customize the order if needed -->
372   <xsl:variable name="selected.key">
373     <xsl:choose>
374       <xsl:when test="$CaseB != ''">
375         <xsl:value-of select="$CaseB"/>
376         <xsl:if test="$olink.debug != 0">
377           <xsl:message>
378             <xsl:text>Olink debug: CaseB key is the final selection: </xsl:text>
379             <xsl:value-of select="$CaseB"/>
380           </xsl:message>
381         </xsl:if>
382       </xsl:when>
383       <xsl:when test="$CaseA != ''">
384         <xsl:value-of select="$CaseA"/>
385         <xsl:if test="$olink.debug != 0">
386           <xsl:message>
387             <xsl:text>Olink debug: CaseA key is the final selection: </xsl:text>
388             <xsl:value-of select="$CaseA"/>
389           </xsl:message>
390         </xsl:if>
391       </xsl:when>
392       <xsl:when test="$CaseC != ''">
393         <xsl:value-of select="$CaseC"/>
394         <xsl:if test="$olink.debug != 0">
395           <xsl:message>
396             <xsl:text>Olink debug: CaseC key is the final selection: </xsl:text>
397             <xsl:value-of select="$CaseC"/>
398           </xsl:message>
399         </xsl:if>
400       </xsl:when>
401       <xsl:when test="$CaseD != ''">
402         <xsl:value-of select="$CaseD"/>
403         <xsl:if test="$olink.debug != 0">
404           <xsl:message>
405             <xsl:text>Olink debug: CaseD key is the final selection: </xsl:text>
406             <xsl:value-of select="$CaseD"/>
407           </xsl:message>
408         </xsl:if>
409       </xsl:when>
410       <xsl:when test="$CaseF != ''">
411         <xsl:value-of select="$CaseF"/>
412         <xsl:if test="$olink.debug != 0">
413           <xsl:message>
414             <xsl:text>Olink debug: CaseF key is the final selection: </xsl:text>
415             <xsl:value-of select="$CaseF"/>
416           </xsl:message>
417         </xsl:if>
418       </xsl:when>
419       <xsl:when test="$CaseE != ''">
420         <xsl:value-of select="$CaseE"/>
421         <xsl:if test="$olink.debug != 0">
422           <xsl:message>
423             <xsl:text>Olink debug: CaseE key is the final selection: </xsl:text>
424             <xsl:value-of select="$CaseE"/>
425           </xsl:message>
426         </xsl:if>
427       </xsl:when>
428       <xsl:otherwise>
429         <xsl:if test="$olink.debug != 0">
430           <xsl:message>
431             <xsl:text>Olink debug: No case matched for lang '</xsl:text>
432             <xsl:value-of select="$target.lang"/>
433             <xsl:text>'.</xsl:text>
434           </xsl:message>
435         </xsl:if>
436       </xsl:otherwise>
437     </xsl:choose>
438   </xsl:variable>
439
440   <xsl:choose>
441     <xsl:when test="$selected.key != ''">
442       <xsl:value-of select="$selected.key"/>
443     </xsl:when>
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 -->
447     </xsl:when>
448     <xsl:otherwise>
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"/>
458       </xsl:call-template>
459     </xsl:otherwise>
460   </xsl:choose>
461
462 </xsl:template>
463
464 <xsl:template name="select.target.lang">
465   <xsl:param name="fallback.index" select="1"/>
466   <xsl:param name="olink.fallback.sequence" select="''"/>
467
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, ' ')"/>
473   <xsl:choose>
474     <xsl:when test="$fallback.index = 1">
475       <xsl:value-of select="$firstlang"/>
476     </xsl:when>
477     <xsl:when test="$fallback.index &gt; 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"
481                         select="$rest"/>
482       </xsl:call-template>
483     </xsl:when>
484     <xsl:otherwise>
485     </xsl:otherwise>
486   </xsl:choose>
487 </xsl:template>
488
489 <xsl:template name="select.olink.lang.fallback">
490   <xsl:param name="olink.lang" select="''"/>
491
492   <!-- Prefer language of the olink element -->
493   <xsl:value-of select="concat(normalize-space(concat($olink.lang, ' ', 
494                         $olink.lang.fallback.sequence)), ' ')"/>
495 </xsl:template>
496
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"/>
501
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" />
506       </xsl:for-each>
507     </xsl:variable>
508   
509     <xsl:variable name="targetdoc">
510       <xsl:value-of select="substring-before($olink.key, '/')"/>
511     </xsl:variable>
512   
513     <!-- Does the target database use a sitemap? -->
514     <xsl:variable name="use.sitemap">
515       <xsl:choose>
516         <xsl:when test="$target.database//sitemap">1</xsl:when>
517         <xsl:otherwise>0</xsl:otherwise>
518       </xsl:choose>
519     </xsl:variable>
520   
521   
522     <!-- Get the baseuri for this targetptr -->
523     <xsl:variable name="baseuri" >
524       <xsl:choose>
525         <!-- Does the database use a sitemap? -->
526         <xsl:when test="$use.sitemap != 0" >
527           <xsl:choose>
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" />
535                 </xsl:for-each>
536               </xsl:variable>
537               <xsl:choose>
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"/>
544                     </xsl:call-template>
545                   </xsl:for-each>
546                 </xsl:when>
547                 <xsl:otherwise>
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>
554                     </xsl:with-param>
555                   </xsl:call-template>
556                 </xsl:otherwise>
557               </xsl:choose>
558             </xsl:when>
559             <xsl:otherwise>
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>
564                 </xsl:with-param>
565               </xsl:call-template>
566             </xsl:otherwise>
567           </xsl:choose> 
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" />
572             </xsl:for-each>
573           </xsl:variable>
574           <xsl:if test="$docbaseuri != ''" >
575             <xsl:value-of select="$docbaseuri"/>
576           </xsl:if>
577         </xsl:when>
578         <!-- No database sitemap in use -->
579         <xsl:otherwise>
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" />
584             </xsl:for-each>
585           </xsl:variable>
586           <xsl:if test="$docbaseuri != ''" >
587             <xsl:value-of select="$docbaseuri"/>
588           </xsl:if>
589         </xsl:otherwise>
590       </xsl:choose>
591     </xsl:variable>
592   
593     <!-- Is this olink to be active? -->
594     <xsl:variable name="active.olink">
595       <xsl:choose>
596         <xsl:when test="$activate.external.olinks = 0">
597           <xsl:choose>
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>
602           </xsl:choose>
603         </xsl:when>
604         <xsl:otherwise>1</xsl:otherwise>
605       </xsl:choose>
606     </xsl:variable>
607
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-->
614         </xsl:if>
615       </xsl:if>
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"/>
622       </xsl:if>
623     </xsl:if>
624   </xsl:if>
625 </xsl:template>
626
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)"/>
635
636   <xsl:variable name="parent.id">
637     <xsl:call-template name="object.id">
638       <xsl:with-param name="object" select="$object"/>
639     </xsl:call-template>
640   </xsl:variable>
641
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"/>
649     </xsl:call-template>
650   </xsl:variable>
651
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" />
655     </xsl:for-each>
656   </xsl:variable>
657
658   <xsl:choose>
659     <!-- we found the olink object -->
660     <xsl:when test="$from.olink.href != ''">
661       <xsl:value-of select="$from.olink.href"/>
662     </xsl:when>
663     <xsl:when test="not($object/parent::*)">
664       <xsl:value-of select="$from.olink.href"/>
665     </xsl:when>
666     <xsl:otherwise>
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"/>
673       </xsl:call-template>
674     </xsl:otherwise>
675   </xsl:choose>
676
677 </xsl:template>
678
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>
689   </xsl:param>
690
691   <xsl:choose>
692     <!-- If it has elements or text (not just PI or comment) -->
693     <xsl:when test="child::text() or child::*">
694       <xsl:apply-templates/>
695     </xsl:when>
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()" />
703           </xsl:call-template>
704         </xsl:for-each>
705       </xsl:variable>
706
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" />
710         </xsl:for-each>
711       </xsl:variable>
712
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" />
716         </xsl:for-each>
717       </xsl:variable>
718
719       <xsl:variable name="lang">
720         <xsl:variable name="candidate">
721           <xsl:for-each select="$target.database" >
722             <xsl:value-of 
723                       select="key('targetptr-key', $olink.key)[1]/@lang" />
724           </xsl:for-each>
725         </xsl:variable>
726         <xsl:choose>
727           <xsl:when test="$candidate != ''">
728             <xsl:value-of select="$candidate"/>
729           </xsl:when>
730           <xsl:otherwise>
731             <xsl:value-of select="$olink.lang"/>
732           </xsl:otherwise>
733         </xsl:choose>
734       </xsl:variable>
735
736       <xsl:variable name="targetdoc">
737         <xsl:value-of select="substring-before($olink.key, '/')"/>
738       </xsl:variable>
739
740       <xsl:choose>
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"/>
748         </xsl:when>
749         <xsl:when test="$xrefstyle != ''">
750           <xsl:if test="$olink.debug != 0">
751             <xsl:message>
752               <xsl:text>xrefstyle is '</xsl:text>
753               <xsl:value-of select="$xrefstyle"/>
754               <xsl:text>'.</xsl:text>
755             </xsl:message>
756           </xsl:if>
757           <xsl:variable name="template">
758             <xsl:choose>
759               <xsl:when test="starts-with(normalize-space($xrefstyle),
760                                           'select:')">
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"/>
766                 </xsl:call-template>
767               </xsl:when>
768               <xsl:when test="starts-with(normalize-space($xrefstyle),
769                                           'template:')">
770                 <xsl:value-of select="substring-after(
771                                  normalize-space($xrefstyle), 'template:')"/>
772               </xsl:when>
773               <xsl:otherwise>
774                 <!-- Look for Gentext template with @style attribute -->
775                 <!-- Must compare to no style value because gentext.template
776                      falls back to no style -->
777
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"/>
783                   </xsl:call-template>
784                 </xsl:variable>
785
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"/>
792                   </xsl:call-template>
793                 </xsl:variable>
794
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"/>
800                   </xsl:call-template>
801                 </xsl:variable>
802
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"/>
809                   </xsl:call-template>
810                 </xsl:variable>
811
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"/>
818                   </xsl:call-template>
819                 </xsl:variable>
820
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"/>
828                   </xsl:call-template>
829                 </xsl:variable>
830
831                 <xsl:choose>
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">
836                     <xsl:value-of 
837                             select="$styled-xref-number-and-title-context"/>
838                   </xsl:when>
839                   <xsl:when test="$xref-number-context != 
840                                  $styled-xref-number-context and
841                                  $xref.number != ''">
842                     <xsl:value-of select="$styled-xref-number-context"/>
843                   </xsl:when>
844                   <xsl:when test="$xref-context != $styled-xref-context">
845                     <xsl:value-of select="$styled-xref-context"/>
846                   </xsl:when>
847                   <xsl:when test="$xref-number-and-title-context != '' and
848                                  $xref.number != '' and
849                                  $xref.with.number.and.title != 0">
850                     <xsl:value-of 
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>
864                         </xsl:with-param>
865                       </xsl:call-template>
866                     </xsl:if>
867                   </xsl:when>
868                   <xsl:when test="$xref-number-context != '' and
869                                  $xref.number != ''">
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>
883                         </xsl:with-param>
884                       </xsl:call-template>
885                     </xsl:if>
886                   </xsl:when>
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>
901                         </xsl:with-param>
902                       </xsl:call-template>
903                     </xsl:if>
904                   </xsl:when>
905                   <xsl:otherwise>
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>
916                       </xsl:with-param>
917                     </xsl:call-template>
918                     <xsl:value-of select="'%t'"/>
919                   </xsl:otherwise>
920                 </xsl:choose>
921               </xsl:otherwise>
922             </xsl:choose>
923           </xsl:variable>
924
925           <xsl:if test="$olink.debug != 0">
926             <xsl:message>
927               <xsl:text>Olink debug: xrefstyle template is '</xsl:text>
928               <xsl:value-of select="$template"/>
929               <xsl:text>'.</xsl:text>
930             </xsl:message>
931           </xsl:if>
932
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()"/>
940                 </xsl:call-template>
941               </xsl:for-each>
942             </xsl:with-param>
943             <xsl:with-param name="label">
944               <xsl:for-each select="$target.database" >
945                 <xsl:value-of 
946                         select="key('targetptr-key', $olink.key)[1]/@number" />
947               </xsl:for-each>
948             </xsl:with-param>
949             <xsl:with-param name="pagenumber">
950               <xsl:for-each select="$target.database" >
951                 <xsl:value-of 
952                         select="key('targetptr-key', $olink.key)[1]/@page" />
953               </xsl:for-each>
954             </xsl:with-param>
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()" />
960                 </xsl:call-template>
961               </xsl:for-each>
962             </xsl:with-param>
963           </xsl:call-template>
964         </xsl:when>
965
966         <xsl:when test="$use.local.olink.style != 0">
967
968           <!-- Is autonumbering on? -->
969           <xsl:variable name="target.number">
970             <xsl:for-each select="$target.database" >
971               <xsl:value-of 
972                       select="key('targetptr-key', $olink.key)[1]/@number" />
973             </xsl:for-each>
974           </xsl:variable>
975
976           <xsl:variable name="autonumber">
977             <xsl:choose>
978               <xsl:when test="$target.number != ''">1</xsl:when>
979               <xsl:otherwise>0</xsl:otherwise>
980             </xsl:choose>
981           </xsl:variable>
982         
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"/>
987             </xsl:call-template>
988           </xsl:variable>
989         
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"/>
994             </xsl:call-template>
995           </xsl:variable>
996         
997           <xsl:variable name="context">
998             <xsl:choose>
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'"/>
1003               </xsl:when>
1004               <xsl:when test="string($autonumber) != 0 
1005                               and $number-template != 0">
1006                  <xsl:value-of select="'xref-number'"/>
1007               </xsl:when>
1008               <xsl:otherwise>
1009                  <xsl:value-of select="'xref'"/>
1010               </xsl:otherwise>
1011             </xsl:choose>
1012           </xsl:variable>
1013         
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>
1020           </xsl:variable>
1021
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>
1030               </xsl:for-each>
1031             </xsl:with-param>
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>
1038               </xsl:for-each>
1039             </xsl:with-param>
1040           </xsl:call-template>
1041         </xsl:when>
1042         <xsl:when test="$xref.text !=''">
1043           <xsl:copy-of select="$xref.text"/>
1044         </xsl:when>
1045         <xsl:otherwise>
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>
1051             </xsl:with-param>
1052           </xsl:call-template>
1053           <xsl:text>????</xsl:text>
1054         </xsl:otherwise>
1055       </xsl:choose>
1056     </xsl:when>
1057     <xsl:otherwise>
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>
1064           </xsl:with-param>
1065         </xsl:call-template>
1066       </xsl:if>
1067       <xsl:text>????</xsl:text>
1068     </xsl:otherwise>
1069   </xsl:choose>
1070 </xsl:template>
1071
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"/>
1076 </xsl:template>
1077
1078 <xsl:template match="*" mode="olink.docname.markup">
1079   <!-- No-op for now -->
1080 </xsl:template>
1081
1082 <xsl:template name="targetpath">
1083   <xsl:param name="dirnode" />
1084   <xsl:param name="targetdoc" select="''"/>
1085
1086 <!-- 
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>
1089 -->
1090   <!-- recursive template generates path to olink target directory -->
1091   <xsl:choose>
1092     <!-- Have we arrived at the final path step? -->
1093     <xsl:when test="$dirnode/child::document[@targetdoc = $targetdoc]">
1094       <!-- We are done -->
1095     </xsl:when>
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>
1103         </xsl:with-param>
1104       </xsl:call-template>
1105     </xsl:when>
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>
1112       </xsl:if>
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>
1118     </xsl:when>
1119     <!-- Otherwise we need to move up a step -->
1120     <xsl:otherwise>
1121       <xsl:if test="$dirnode/parent::dir">
1122         <xsl:text>../</xsl:text>
1123       </xsl:if>
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>
1128     </xsl:otherwise>
1129   </xsl:choose>
1130 </xsl:template>
1131
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>
1143   </xsl:param>
1144
1145   <xsl:variable name="targetdoc">
1146     <xsl:value-of select="substring-before($olink.key, '/')"/>
1147   </xsl:variable>
1148
1149   <xsl:choose>
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>
1156     </xsl:when>
1157     <xsl:when test="not(starts-with(normalize-space($xrefstyle),
1158                         'select:') 
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' ">
1164   
1165       <xsl:variable name="page-number">
1166         <xsl:for-each select="$target.database" >
1167           <xsl:value-of 
1168                  select="key('targetptr-key', $olink.key)[1]/@page" />
1169         </xsl:for-each>
1170       </xsl:variable>
1171   
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>
1180           </xsl:with-param>
1181           <xsl:with-param name="pagenumber" select="$page-number"/>
1182         </xsl:call-template>
1183       </xsl:if>
1184   
1185     </xsl:when>
1186   </xsl:choose>
1187 </xsl:template>
1188
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>
1199   </xsl:param>
1200
1201   <xsl:variable name="page">
1202     <xsl:for-each select="$target.database" >
1203       <xsl:value-of 
1204              select="key('targetptr-key', $olink.key)[1]/@page" />
1205     </xsl:for-each>
1206   </xsl:variable>
1207
1208   <xsl:variable name="targetdoc">
1209     <xsl:value-of select="substring-before($olink.key, '/')"/>
1210   </xsl:variable>
1211
1212   <xsl:variable name="targetptr">
1213     <xsl:value-of 
1214           select="substring-before(substring-after($olink.key, '/'), '/')"/>
1215   </xsl:variable>
1216
1217   <!-- Don't add docname if pointing to root element -->
1218   <xsl:variable name="rootptr">
1219     <xsl:for-each select="$target.database" >
1220       <xsl:value-of 
1221              select="key('targetdoc-key', $targetdoc)[1]/div[1]/@targetptr" />
1222     </xsl:for-each>
1223   </xsl:variable>
1224
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>
1231     </xsl:for-each>
1232   </xsl:variable>
1233
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>
1248       </xsl:with-param>
1249       <xsl:with-param name="docname" select="$docname"/>
1250       <xsl:with-param name="pagenumber" select="$page"/>
1251     </xsl:call-template>
1252   </xsl:if>
1253 </xsl:template>
1254
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>
1266   </xsl:param>
1267
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>
1278   </xsl:if>
1279 </xsl:template>
1280
1281 </xsl:stylesheet>
1282