OLD | NEW |
| (Empty) |
1 <?xml version="1.0"?> | |
2 <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" | |
3 version="1.0"> | |
4 | |
5 <!-- ******************************************************************** | |
6 $Id: olink.xsl 9650 2012-10-26 18:24:02Z bobstayton $ | |
7 ******************************************************************** | |
8 | |
9 This file is part of the DocBook XSL Stylesheet distribution. | |
10 See ../README or http://docbook.sf.net/ for copyright | |
11 copyright and other information. | |
12 | |
13 ******************************************************************** --> | |
14 | |
15 <!-- Create keys for quickly looking up olink targets --> | |
16 <xsl:key name="targetdoc-key" match="document" use="@targetdoc" /> | |
17 <xsl:key name="targetptr-key" match="div|obj" | |
18 use="concat(ancestor::document/@targetdoc, '/', | |
19 @targetptr, '/', ancestor::document/@lang)" /> | |
20 | |
21 <!-- Return filename of database --> | |
22 <xsl:template name="select.target.database"> | |
23 <xsl:param name="targetdoc.att" select="''"/> | |
24 <xsl:param name="targetptr.att" select="''"/> | |
25 <xsl:param name="olink.lang" select="''"/> | |
26 | |
27 <!-- use root's xml:base if exists --> | |
28 <xsl:variable name="xml.base" select="/*/@xml:base"/> | |
29 | |
30 <!-- This selection can be customized if needed --> | |
31 <xsl:variable name="target.database.filename"> | |
32 <xsl:choose> | |
33 <xsl:when test="$xml.base != '' and | |
34 not(starts-with($target.database.document, 'file:/')) and | |
35 not(starts-with($target.database.document, '/'))"> | |
36 <xsl:call-template name="systemIdToBaseURI"> | |
37 <xsl:with-param name="systemId" select="$xml.base"/> | |
38 </xsl:call-template> | |
39 <xsl:value-of select="$target.database.document"/> | |
40 </xsl:when> | |
41 <xsl:otherwise> | |
42 <xsl:value-of select="$target.database.document"/> | |
43 </xsl:otherwise> | |
44 </xsl:choose> | |
45 </xsl:variable> | |
46 | |
47 <xsl:variable name="target.database" | |
48 select="document($target.database.filename,/)"/> | |
49 | |
50 <xsl:choose> | |
51 <!-- Was the database document parameter not set? --> | |
52 <xsl:when test="$target.database.document = ''"> | |
53 <xsl:message> | |
54 <xsl:text>Olinks not processed: must specify a </xsl:text> | |
55 <xsl:text>$target.database.document parameter </xsl:text> | |
56 <xsl:text>when using olinks with targetdoc </xsl:text> | |
57 <xsl:text>and targetptr attributes.</xsl:text> | |
58 </xsl:message> | |
59 </xsl:when> | |
60 <xsl:when test="namespace-uri($target.database/*) != ''"> | |
61 <xsl:message> | |
62 <xsl:text>Olink error: the targetset element and children in '</xsl:text
> | |
63 <xsl:value-of select="$target.database.document"/> | |
64 <xsl:text>' should not be in any namespace.</xsl:text> | |
65 </xsl:message> | |
66 </xsl:when> | |
67 <!-- Did it not open? Should be a targetset element --> | |
68 <xsl:when test="not($target.database/*)"> | |
69 <xsl:message> | |
70 <xsl:text>Olink error: could not open target database '</xsl:text> | |
71 <xsl:value-of select="$target.database.filename"/> | |
72 <xsl:text>'.</xsl:text> | |
73 </xsl:message> | |
74 </xsl:when> | |
75 <xsl:otherwise> | |
76 <xsl:value-of select="$target.database.filename"/> | |
77 </xsl:otherwise> | |
78 </xsl:choose> | |
79 </xsl:template> | |
80 | |
81 <xsl:template name="select.olink.key"> | |
82 <xsl:param name="targetdoc.att" select="''"/> | |
83 <xsl:param name="targetptr.att" select="''"/> | |
84 <xsl:param name="olink.lang" select="''"/> | |
85 <xsl:param name="target.database"/> | |
86 | |
87 <xsl:if test="$target.database/*"> | |
88 <xsl:variable name="olink.fallback.sequence"> | |
89 <xsl:call-template name="select.olink.lang.fallback"> | |
90 <xsl:with-param name="olink.lang" select="$olink.lang"/> | |
91 </xsl:call-template> | |
92 </xsl:variable> | |
93 | |
94 <!-- Recurse through the languages until you find a match --> | |
95 <xsl:call-template name="select.olink.key.in.lang"> | |
96 <xsl:with-param name="targetdoc.att" select="$targetdoc.att"/> | |
97 <xsl:with-param name="targetptr.att" select="$targetptr.att"/> | |
98 <xsl:with-param name="olink.lang" select="$olink.lang"/> | |
99 <xsl:with-param name="target.database" select="$target.database"/> | |
100 <xsl:with-param name="fallback.index" select="1"/> | |
101 <xsl:with-param name="olink.fallback.sequence" | |
102 select="$olink.fallback.sequence"/> | |
103 </xsl:call-template> | |
104 </xsl:if> | |
105 | |
106 </xsl:template> | |
107 | |
108 <!-- Locate olink key in a particular language --> | |
109 <xsl:template name="select.olink.key.in.lang"> | |
110 <xsl:param name="targetdoc.att" select="''"/> | |
111 <xsl:param name="targetptr.att" select="''"/> | |
112 <xsl:param name="olink.lang" select="''"/> | |
113 <xsl:param name="target.database"/> | |
114 <xsl:param name="fallback.index" select="1"/> | |
115 <xsl:param name="olink.fallback.sequence" select="''"/> | |
116 | |
117 <xsl:variable name="target.lang"> | |
118 <xsl:call-template name="select.target.lang"> | |
119 <xsl:with-param name="fallback.index" select="$fallback.index"/> | |
120 <xsl:with-param name="olink.fallback.sequence" | |
121 select="$olink.fallback.sequence"/> | |
122 </xsl:call-template> | |
123 </xsl:variable> | |
124 | |
125 <xsl:if test="$olink.debug != 0"> | |
126 <xsl:message><xsl:text>Olink debug: cases for targetdoc='</xsl:text> | |
127 <xsl:value-of select="$targetdoc.att"/> | |
128 <xsl:text>' and targetptr='</xsl:text> | |
129 <xsl:value-of select="$targetptr.att"/> | |
130 <xsl:text>' in language '</xsl:text> | |
131 <xsl:value-of select="$target.lang"/> | |
132 <xsl:text>'.</xsl:text> | |
133 </xsl:message> | |
134 </xsl:if> | |
135 | |
136 <!-- Customize these cases if you want different selection logic --> | |
137 <xsl:variable name="CaseA"> | |
138 <!-- targetdoc.att = not blank | |
139 targetptr.att = not blank | |
140 --> | |
141 <xsl:if test="$targetdoc.att != '' and | |
142 $targetptr.att != ''"> | |
143 <xsl:for-each select="$target.database"> | |
144 <xsl:variable name="key" | |
145 select="concat($targetdoc.att, '/', | |
146 $targetptr.att, '/', | |
147 $target.lang)"/> | |
148 <xsl:choose> | |
149 <xsl:when test="key('targetptr-key', $key)[1]/@href != ''"> | |
150 <xsl:value-of select="$key"/> | |
151 <xsl:if test="$olink.debug != 0"> | |
152 <xsl:message>Olink debug: CaseA matched.</xsl:message> | |
153 </xsl:if> | |
154 </xsl:when> | |
155 <xsl:when test="$olink.debug != 0"> | |
156 <xsl:message>Olink debug: CaseA NOT matched</xsl:message> | |
157 </xsl:when> | |
158 </xsl:choose> | |
159 </xsl:for-each> | |
160 </xsl:if> | |
161 </xsl:variable> | |
162 | |
163 <xsl:variable name="CaseB"> | |
164 <!-- targetdoc.att = not blank | |
165 targetptr.att = not blank | |
166 prefer.internal.olink = not zero | |
167 current.docid = not blank | |
168 --> | |
169 <xsl:if test="$targetdoc.att != '' and | |
170 $targetptr.att != '' and | |
171 $current.docid != '' and | |
172 $prefer.internal.olink != 0"> | |
173 <xsl:for-each select="$target.database"> | |
174 <xsl:variable name="key" | |
175 select="concat($current.docid, '/', | |
176 $targetptr.att, '/', | |
177 $target.lang)"/> | |
178 <xsl:choose> | |
179 <xsl:when test="key('targetptr-key', $key)[1]/@href != ''"> | |
180 <xsl:value-of select="$key"/> | |
181 <xsl:if test="$olink.debug != 0"> | |
182 <xsl:message>Olink debug: CaseB matched.</xsl:message> | |
183 </xsl:if> | |
184 </xsl:when> | |
185 <xsl:when test="$olink.debug != 0"> | |
186 <xsl:message>Olink debug: CaseB NOT matched</xsl:message> | |
187 </xsl:when> | |
188 </xsl:choose> | |
189 </xsl:for-each> | |
190 </xsl:if> | |
191 </xsl:variable> | |
192 | |
193 <xsl:variable name="CaseC"> | |
194 <!-- targetdoc.att = blank | |
195 targetptr.att = not blank | |
196 current.docid = not blank | |
197 --> | |
198 <xsl:if test="string-length($targetdoc.att) = 0 and | |
199 $targetptr.att != '' and | |
200 $current.docid != ''"> | |
201 <!-- Must use a for-each to change context for keys to work --> | |
202 <xsl:for-each select="$target.database"> | |
203 <xsl:variable name="key" | |
204 select="concat($current.docid, '/', | |
205 $targetptr.att, '/', | |
206 $target.lang)"/> | |
207 <xsl:choose> | |
208 <xsl:when test="key('targetptr-key', $key)[1]/@href != ''"> | |
209 <xsl:value-of select="$key"/> | |
210 <xsl:if test="$olink.debug != 0"> | |
211 <xsl:message>Olink debug: CaseC matched.</xsl:message> | |
212 </xsl:if> | |
213 </xsl:when> | |
214 <xsl:when test="$olink.debug != 0"> | |
215 <xsl:message>Olink debug: CaseC NOT matched.</xsl:message> | |
216 </xsl:when> | |
217 </xsl:choose> | |
218 </xsl:for-each> | |
219 </xsl:if> | |
220 </xsl:variable> | |
221 | |
222 <xsl:variable name="CaseD"> | |
223 <!-- targetdoc.att = blank | |
224 targetptr.att = not blank | |
225 current.docid = blank | |
226 --> | |
227 <!-- This is possible if only one document in the database --> | |
228 <xsl:if test="string-length($targetdoc.att) = 0 and | |
229 $targetptr.att != '' and | |
230 string-length($current.docid) = 0 and | |
231 count($target.database//document) = 1"> | |
232 <xsl:for-each select="$target.database"> | |
233 <xsl:variable name="key" | |
234 select="concat(.//document/@targetdoc, '/', | |
235 $targetptr.att, '/', | |
236 $target.lang)"/> | |
237 <xsl:choose> | |
238 <xsl:when test="key('targetptr-key', $key)[1]/@href != ''"> | |
239 <xsl:value-of select="$key"/> | |
240 <xsl:if test="$olink.debug != 0"> | |
241 <xsl:message>Olink debug: CaseD matched.</xsl:message> | |
242 </xsl:if> | |
243 </xsl:when> | |
244 <xsl:when test="$olink.debug != 0"> | |
245 <xsl:message>Olink debug: CaseD NOT matched</xsl:message> | |
246 </xsl:when> | |
247 </xsl:choose> | |
248 </xsl:for-each> | |
249 </xsl:if> | |
250 </xsl:variable> | |
251 | |
252 <xsl:variable name="CaseE"> | |
253 <!-- targetdoc.att = not blank | |
254 targetptr.att = blank | |
255 --> | |
256 <xsl:if test="$targetdoc.att != '' and | |
257 string-length($targetptr.att) = 0"> | |
258 | |
259 <!-- Try the document's root element id --> | |
260 <xsl:variable name="rootid"> | |
261 <xsl:choose> | |
262 <xsl:when test="$target.lang != ''"> | |
263 <xsl:value-of select="$target.database//document[@targetdoc = $targe
tdoc.att and @lang = $target.lang]/*[1]/@targetptr"/> | |
264 </xsl:when> | |
265 <xsl:otherwise> | |
266 <xsl:value-of select="$target.database//document[@targetdoc = $targe
tdoc.att and not(@lang)]/*[1]/@targetptr"/> | |
267 </xsl:otherwise> | |
268 </xsl:choose> | |
269 </xsl:variable> | |
270 | |
271 <xsl:for-each select="$target.database"> | |
272 <xsl:variable name="key" | |
273 select="concat($targetdoc.att, '/', | |
274 $rootid, '/', | |
275 $target.lang)"/> | |
276 <xsl:choose> | |
277 <xsl:when test="key('targetptr-key', $key)[1]/@href != ''"> | |
278 <xsl:value-of select="$key"/> | |
279 <xsl:if test="$olink.debug != 0"> | |
280 <xsl:message>Olink debug: CaseE matched.</xsl:message> | |
281 </xsl:if> | |
282 </xsl:when> | |
283 <xsl:when test="$olink.debug != 0"> | |
284 <xsl:message>Olink debug: CaseE NOT matched.</xsl:message> | |
285 </xsl:when> | |
286 </xsl:choose> | |
287 </xsl:for-each> | |
288 </xsl:if> | |
289 </xsl:variable> | |
290 | |
291 <xsl:variable name="CaseF"> | |
292 <!-- targetdoc.att = not blank | |
293 targetptr.att = blank | |
294 prefer.internal.olink = not zero | |
295 current.docid = not blank | |
296 --> | |
297 <xsl:if test="$targetdoc.att != '' and | |
298 string-length($targetptr.att) = 0 and | |
299 $current.docid != '' and | |
300 $prefer.internal.olink != 0"> | |
301 <!-- Try the document's root element id --> | |
302 <xsl:variable name="rootid"> | |
303 <xsl:choose> | |
304 <xsl:when test="$target.lang != ''"> | |
305 <xsl:value-of select="$target.database//document[@targetdoc = $curre
nt.docid and @lang = $target.lang]/*[1]/@targetptr"/> | |
306 </xsl:when> | |
307 <xsl:otherwise> | |
308 <xsl:value-of select="$target.database//document[@targetdoc = $curre
nt.docid and not(@lang)]/*[1]/@targetptr"/> | |
309 </xsl:otherwise> | |
310 </xsl:choose> | |
311 </xsl:variable> | |
312 | |
313 <xsl:for-each select="$target.database"> | |
314 <xsl:variable name="key" | |
315 select="concat($current.docid, '/', | |
316 $rootid, '/', | |
317 $target.lang)"/> | |
318 <xsl:choose> | |
319 <xsl:when test="key('targetptr-key', $key)[1]/@href != ''"> | |
320 <xsl:value-of select="$key"/> | |
321 <xsl:if test="$olink.debug != 0"> | |
322 <xsl:message>Olink debug: CaseF matched.</xsl:message> | |
323 </xsl:if> | |
324 </xsl:when> | |
325 <xsl:when test="$olink.debug != 0"> | |
326 <xsl:message>Olink debug: CaseF NOT matched.</xsl:message> | |
327 </xsl:when> | |
328 </xsl:choose> | |
329 </xsl:for-each> | |
330 </xsl:if> | |
331 </xsl:variable> | |
332 | |
333 <!-- Now select the best match. Customize the order if needed --> | |
334 <xsl:variable name="selected.key"> | |
335 <xsl:choose> | |
336 <xsl:when test="$CaseB != ''"> | |
337 <xsl:value-of select="$CaseB"/> | |
338 <xsl:if test="$olink.debug != 0"> | |
339 <xsl:message> | |
340 <xsl:text>Olink debug: CaseB key is the final selection: </xsl:text> | |
341 <xsl:value-of select="$CaseB"/> | |
342 </xsl:message> | |
343 </xsl:if> | |
344 </xsl:when> | |
345 <xsl:when test="$CaseA != ''"> | |
346 <xsl:value-of select="$CaseA"/> | |
347 <xsl:if test="$olink.debug != 0"> | |
348 <xsl:message> | |
349 <xsl:text>Olink debug: CaseA key is the final selection: </xsl:text> | |
350 <xsl:value-of select="$CaseA"/> | |
351 </xsl:message> | |
352 </xsl:if> | |
353 </xsl:when> | |
354 <xsl:when test="$CaseC != ''"> | |
355 <xsl:value-of select="$CaseC"/> | |
356 <xsl:if test="$olink.debug != 0"> | |
357 <xsl:message> | |
358 <xsl:text>Olink debug: CaseC key is the final selection: </xsl:text> | |
359 <xsl:value-of select="$CaseC"/> | |
360 </xsl:message> | |
361 </xsl:if> | |
362 </xsl:when> | |
363 <xsl:when test="$CaseD != ''"> | |
364 <xsl:value-of select="$CaseD"/> | |
365 <xsl:if test="$olink.debug != 0"> | |
366 <xsl:message> | |
367 <xsl:text>Olink debug: CaseD key is the final selection: </xsl:text> | |
368 <xsl:value-of select="$CaseD"/> | |
369 </xsl:message> | |
370 </xsl:if> | |
371 </xsl:when> | |
372 <xsl:when test="$CaseF != ''"> | |
373 <xsl:value-of select="$CaseF"/> | |
374 <xsl:if test="$olink.debug != 0"> | |
375 <xsl:message> | |
376 <xsl:text>Olink debug: CaseF key is the final selection: </xsl:text> | |
377 <xsl:value-of select="$CaseF"/> | |
378 </xsl:message> | |
379 </xsl:if> | |
380 </xsl:when> | |
381 <xsl:when test="$CaseE != ''"> | |
382 <xsl:value-of select="$CaseE"/> | |
383 <xsl:if test="$olink.debug != 0"> | |
384 <xsl:message> | |
385 <xsl:text>Olink debug: CaseE key is the final selection: </xsl:text> | |
386 <xsl:value-of select="$CaseE"/> | |
387 </xsl:message> | |
388 </xsl:if> | |
389 </xsl:when> | |
390 <xsl:otherwise> | |
391 <xsl:if test="$olink.debug != 0"> | |
392 <xsl:message> | |
393 <xsl:text>Olink debug: No case matched for lang '</xsl:text> | |
394 <xsl:value-of select="$target.lang"/> | |
395 <xsl:text>'.</xsl:text> | |
396 </xsl:message> | |
397 </xsl:if> | |
398 </xsl:otherwise> | |
399 </xsl:choose> | |
400 </xsl:variable> | |
401 | |
402 <xsl:choose> | |
403 <xsl:when test="$selected.key != ''"> | |
404 <xsl:value-of select="$selected.key"/> | |
405 </xsl:when> | |
406 <xsl:when test="string-length($selected.key) = 0 and | |
407 string-length($target.lang) = 0"> | |
408 <!-- No match on last try, and we are done --> | |
409 </xsl:when> | |
410 <xsl:otherwise> | |
411 <!-- Recurse through next language --> | |
412 <xsl:call-template name="select.olink.key.in.lang"> | |
413 <xsl:with-param name="targetdoc.att" select="$targetdoc.att"/> | |
414 <xsl:with-param name="targetptr.att" select="$targetptr.att"/> | |
415 <xsl:with-param name="olink.lang" select="$olink.lang"/> | |
416 <xsl:with-param name="target.database" select="$target.database"/> | |
417 <xsl:with-param name="fallback.index" select="$fallback.index + 1"/> | |
418 <xsl:with-param name="olink.fallback.sequence" | |
419 select="$olink.fallback.sequence"/> | |
420 </xsl:call-template> | |
421 </xsl:otherwise> | |
422 </xsl:choose> | |
423 | |
424 </xsl:template> | |
425 | |
426 <xsl:template name="select.target.lang"> | |
427 <xsl:param name="fallback.index" select="1"/> | |
428 <xsl:param name="olink.fallback.sequence" select="''"/> | |
429 | |
430 <!-- recurse backwards to find the lang matching the index --> | |
431 <xsl:variable name="firstlang" | |
432 select="substring-before($olink.fallback.sequence, ' ')"/> | |
433 <xsl:variable name="rest" | |
434 select="substring-after($olink.fallback.sequence, ' ')"/> | |
435 <xsl:choose> | |
436 <xsl:when test="$fallback.index = 1"> | |
437 <xsl:value-of select="$firstlang"/> | |
438 </xsl:when> | |
439 <xsl:when test="$fallback.index > 1"> | |
440 <xsl:call-template name="select.target.lang"> | |
441 <xsl:with-param name="fallback.index" select="$fallback.index - 1"/> | |
442 <xsl:with-param name="olink.fallback.sequence" | |
443 select="$rest"/> | |
444 </xsl:call-template> | |
445 </xsl:when> | |
446 <xsl:otherwise> | |
447 </xsl:otherwise> | |
448 </xsl:choose> | |
449 </xsl:template> | |
450 | |
451 <xsl:template name="select.olink.lang.fallback"> | |
452 <xsl:param name="olink.lang" select="''"/> | |
453 | |
454 <!-- Prefer language of the olink element --> | |
455 <xsl:value-of select="concat(normalize-space(concat($olink.lang, ' ', | |
456 $olink.lang.fallback.sequence)), ' ')"/> | |
457 </xsl:template> | |
458 | |
459 <!-- Returns the complete olink href value if found --> | |
460 <xsl:template name="make.olink.href"> | |
461 <xsl:param name="olink.key" select="''"/> | |
462 <xsl:param name="target.database"/> | |
463 | |
464 <xsl:if test="$olink.key != ''"> | |
465 <xsl:variable name="target.href" > | |
466 <xsl:for-each select="$target.database" > | |
467 <xsl:value-of select="key('targetptr-key', $olink.key)[1]/@href" /> | |
468 </xsl:for-each> | |
469 </xsl:variable> | |
470 | |
471 <xsl:variable name="targetdoc"> | |
472 <xsl:value-of select="substring-before($olink.key, '/')"/> | |
473 </xsl:variable> | |
474 | |
475 <!-- Does the target database use a sitemap? --> | |
476 <xsl:variable name="use.sitemap"> | |
477 <xsl:choose> | |
478 <xsl:when test="$target.database//sitemap">1</xsl:when> | |
479 <xsl:otherwise>0</xsl:otherwise> | |
480 </xsl:choose> | |
481 </xsl:variable> | |
482 | |
483 | |
484 <!-- Get the baseuri for this targetptr --> | |
485 <xsl:variable name="baseuri" > | |
486 <xsl:choose> | |
487 <!-- Does the database use a sitemap? --> | |
488 <xsl:when test="$use.sitemap != 0" > | |
489 <xsl:choose> | |
490 <!-- Was current.docid parameter set? --> | |
491 <xsl:when test="$current.docid != ''"> | |
492 <!-- Was it found in the database? --> | |
493 <xsl:variable name="currentdoc.key" > | |
494 <xsl:for-each select="$target.database" > | |
495 <xsl:value-of select="key('targetdoc-key', | |
496 $current.docid)[1]/@targetdoc" /> | |
497 </xsl:for-each> | |
498 </xsl:variable> | |
499 <xsl:choose> | |
500 <xsl:when test="$currentdoc.key != ''"> | |
501 <xsl:for-each select="$target.database" > | |
502 <xsl:call-template name="targetpath" > | |
503 <xsl:with-param name="dirnode" | |
504 select="key('targetdoc-key', $current.docid)[1]/parent
::dir"/> | |
505 <xsl:with-param name="targetdoc" select="$targetdoc"/> | |
506 </xsl:call-template> | |
507 </xsl:for-each > | |
508 </xsl:when> | |
509 <xsl:otherwise> | |
510 <xsl:message> | |
511 <xsl:text>Olink error: cannot compute relative </xsl:text> | |
512 <xsl:text>sitemap path because $current.docid '</xsl:text> | |
513 <xsl:value-of select="$current.docid"/> | |
514 <xsl:text>' not found in target database.</xsl:text> | |
515 </xsl:message> | |
516 </xsl:otherwise> | |
517 </xsl:choose> | |
518 </xsl:when> | |
519 <xsl:otherwise> | |
520 <xsl:message> | |
521 <xsl:text>Olink warning: cannot compute relative </xsl:text> | |
522 <xsl:text>sitemap path without $current.docid parameter</xsl:tex
t> | |
523 </xsl:message> | |
524 </xsl:otherwise> | |
525 </xsl:choose> | |
526 <!-- In either case, add baseuri from its document entry--> | |
527 <xsl:variable name="docbaseuri"> | |
528 <xsl:for-each select="$target.database" > | |
529 <xsl:value-of select="key('targetdoc-key', $targetdoc)[1]/@baseuri
" /> | |
530 </xsl:for-each> | |
531 </xsl:variable> | |
532 <xsl:if test="$docbaseuri != ''" > | |
533 <xsl:value-of select="$docbaseuri"/> | |
534 </xsl:if> | |
535 </xsl:when> | |
536 <!-- No database sitemap in use --> | |
537 <xsl:otherwise> | |
538 <!-- Just use any baseuri from its document entry --> | |
539 <xsl:variable name="docbaseuri"> | |
540 <xsl:for-each select="$target.database" > | |
541 <xsl:value-of select="key('targetdoc-key', $targetdoc)[1]/@baseuri
" /> | |
542 </xsl:for-each> | |
543 </xsl:variable> | |
544 <xsl:if test="$docbaseuri != ''" > | |
545 <xsl:value-of select="$docbaseuri"/> | |
546 </xsl:if> | |
547 </xsl:otherwise> | |
548 </xsl:choose> | |
549 </xsl:variable> | |
550 | |
551 <!-- Is this olink to be active? --> | |
552 <xsl:variable name="active.olink"> | |
553 <xsl:choose> | |
554 <xsl:when test="$activate.external.olinks = 0"> | |
555 <xsl:choose> | |
556 <xsl:when test="$current.docid = ''">1</xsl:when> | |
557 <xsl:when test="$targetdoc = ''">1</xsl:when> | |
558 <xsl:when test="$targetdoc = $current.docid">1</xsl:when> | |
559 <xsl:otherwise>0</xsl:otherwise> | |
560 </xsl:choose> | |
561 </xsl:when> | |
562 <xsl:otherwise>1</xsl:otherwise> | |
563 </xsl:choose> | |
564 </xsl:variable> | |
565 | |
566 <!-- Form the href information --> | |
567 <xsl:if test="$active.olink != 0"> | |
568 <xsl:if test="$baseuri != ''"> | |
569 <xsl:value-of select="$baseuri"/> | |
570 <xsl:if test="substring($target.href,1,1) != '#'"> | |
571 <!--xsl:text>/</xsl:text--> | |
572 </xsl:if> | |
573 </xsl:if> | |
574 <!-- optionally turn off frag for PDF references --> | |
575 <xsl:if test="not($insert.olink.pdf.frag = 0 and | |
576 translate(substring($baseuri, string-length($baseuri) - 3), | |
577 'PDF', 'pdf') = '.pdf' | |
578 and starts-with($target.href, '#') )"> | |
579 <xsl:value-of select="$target.href"/> | |
580 </xsl:if> | |
581 </xsl:if> | |
582 </xsl:if> | |
583 </xsl:template> | |
584 | |
585 <!-- Computes the href of the object containing the olink element --> | |
586 <xsl:template name="olink.from.uri"> | |
587 <xsl:param name="target.database"/> | |
588 <xsl:param name="object" select="NotAnElement"/> | |
589 <xsl:param name="object.targetdoc" select="$current.docid"/> | |
590 <xsl:param name="object.lang" | |
591 select="concat($object/ancestor::*[last()]/@lang, | |
592 $object/ancestor::*[last()]/@xml:lang)"/> | |
593 | |
594 <xsl:variable name="parent.id"> | |
595 <xsl:call-template name="object.id"> | |
596 <xsl:with-param name="object" select="$object"/> | |
597 </xsl:call-template> | |
598 </xsl:variable> | |
599 | |
600 <!-- Get the olink key for the parent of olink element --> | |
601 <xsl:variable name="from.key"> | |
602 <xsl:call-template name="select.olink.key"> | |
603 <xsl:with-param name="targetdoc.att" select="$object.targetdoc"/> | |
604 <xsl:with-param name="targetptr.att" select="$parent.id"/> | |
605 <xsl:with-param name="olink.lang" select="$object.lang"/> | |
606 <xsl:with-param name="target.database" select="$target.database"/> | |
607 </xsl:call-template> | |
608 </xsl:variable> | |
609 | |
610 <xsl:variable name="from.olink.href"> | |
611 <xsl:for-each select="$target.database" > | |
612 <xsl:value-of select="key('targetptr-key', $from.key)[1]/@href" /> | |
613 </xsl:for-each> | |
614 </xsl:variable> | |
615 | |
616 <xsl:choose> | |
617 <!-- we found the olink object --> | |
618 <xsl:when test="$from.olink.href != ''"> | |
619 <xsl:value-of select="$from.olink.href"/> | |
620 </xsl:when> | |
621 <xsl:when test="not($object/parent::*)"> | |
622 <xsl:value-of select="$from.olink.href"/> | |
623 </xsl:when> | |
624 <xsl:otherwise> | |
625 <!-- recurse upward in current document --> | |
626 <xsl:call-template name="olink.from.uri"> | |
627 <xsl:with-param name="target.database" select="$target.database"/> | |
628 <xsl:with-param name="object" select="$object/parent::*"/> | |
629 <xsl:with-param name="object.targetdoc" select="$object.targetdoc"/> | |
630 <xsl:with-param name="object.lang" select="$object.lang"/> | |
631 </xsl:call-template> | |
632 </xsl:otherwise> | |
633 </xsl:choose> | |
634 | |
635 </xsl:template> | |
636 | |
637 <xsl:template name="olink.hottext"> | |
638 <xsl:param name="target.database"/> | |
639 <xsl:param name="olink.lang" select="''"/> | |
640 <xsl:param name="olink.key" select="''"/> | |
641 <xsl:param name="referrer" select="."/> | |
642 <xsl:param name="xrefstyle"> | |
643 <xsl:choose> | |
644 <xsl:when test="@role and not(@xrefstyle) | |
645 and $use.role.as.xrefstyle != 0"> | |
646 <xsl:value-of select="@role"/> | |
647 </xsl:when> | |
648 <xsl:otherwise> | |
649 <xsl:value-of select="@xrefstyle"/> | |
650 </xsl:otherwise> | |
651 </xsl:choose> | |
652 </xsl:param> | |
653 | |
654 <xsl:choose> | |
655 <!-- If it has elements or text (not just PI or comment) --> | |
656 <xsl:when test="child::text() or child::*"> | |
657 <xsl:apply-templates/> | |
658 </xsl:when> | |
659 <xsl:when test="$olink.key != ''"> | |
660 <!-- Get the xref text for this record --> | |
661 <xsl:variable name="xref.text" > | |
662 <xsl:for-each select="$target.database" > | |
663 <xsl:call-template name="insert.targetdb.data"> | |
664 <xsl:with-param name="data" | |
665 select="key('targetptr-key', $olink.key)[1]/xreftext/node()" /
> | |
666 </xsl:call-template> | |
667 </xsl:for-each> | |
668 </xsl:variable> | |
669 | |
670 <xsl:variable name="xref.number" > | |
671 <xsl:for-each select="$target.database" > | |
672 <xsl:value-of select="key('targetptr-key', $olink.key)[1]/@number" /> | |
673 </xsl:for-each> | |
674 </xsl:variable> | |
675 | |
676 <xsl:variable name="target.elem" > | |
677 <xsl:for-each select="$target.database" > | |
678 <xsl:value-of select="key('targetptr-key', $olink.key)[1]/@element" /> | |
679 </xsl:for-each> | |
680 </xsl:variable> | |
681 | |
682 <xsl:variable name="lang"> | |
683 <xsl:variable name="candidate"> | |
684 <xsl:for-each select="$target.database" > | |
685 <xsl:value-of | |
686 select="key('targetptr-key', $olink.key)[1]/@lang" /> | |
687 </xsl:for-each> | |
688 </xsl:variable> | |
689 <xsl:choose> | |
690 <xsl:when test="$candidate != ''"> | |
691 <xsl:value-of select="$candidate"/> | |
692 </xsl:when> | |
693 <xsl:otherwise> | |
694 <xsl:value-of select="$olink.lang"/> | |
695 </xsl:otherwise> | |
696 </xsl:choose> | |
697 </xsl:variable> | |
698 | |
699 <xsl:variable name="targetdoc"> | |
700 <xsl:value-of select="substring-before($olink.key, '/')"/> | |
701 </xsl:variable> | |
702 | |
703 <xsl:choose> | |
704 <xsl:when test="$xrefstyle != '' and | |
705 starts-with(normalize-space($xrefstyle), 'select:') and | |
706 (contains($xrefstyle, 'nodocname') or | |
707 contains($xrefstyle, 'nopage')) and | |
708 not(contains($xrefstyle, 'title')) and | |
709 not(contains($xrefstyle, 'label'))"> | |
710 <xsl:copy-of select="$xref.text"/> | |
711 </xsl:when> | |
712 <xsl:when test="$xrefstyle != ''"> | |
713 <xsl:if test="$olink.debug != 0"> | |
714 <xsl:message> | |
715 <xsl:text>xrefstyle is '</xsl:text> | |
716 <xsl:value-of select="$xrefstyle"/> | |
717 <xsl:text>'.</xsl:text> | |
718 </xsl:message> | |
719 </xsl:if> | |
720 <xsl:variable name="template"> | |
721 <xsl:choose> | |
722 <xsl:when test="starts-with(normalize-space($xrefstyle), | |
723 'select:')"> | |
724 <xsl:call-template name="make.gentext.template"> | |
725 <xsl:with-param name="xrefstyle" select="$xrefstyle"/> | |
726 <xsl:with-param name="purpose" select="'olink'"/> | |
727 <xsl:with-param name="referrer" select="."/> | |
728 <xsl:with-param name="target.elem" select="$target.elem"/> | |
729 </xsl:call-template> | |
730 </xsl:when> | |
731 <xsl:when test="starts-with(normalize-space($xrefstyle), | |
732 'template:')"> | |
733 <xsl:value-of select="substring-after( | |
734 normalize-space($xrefstyle), 'template:')"/> | |
735 </xsl:when> | |
736 <xsl:otherwise> | |
737 <!-- Look for Gentext template with @style attribute --> | |
738 <!-- Must compare to no style value because gentext.template | |
739 falls back to no style --> | |
740 | |
741 <xsl:variable name="xref-context"> | |
742 <xsl:call-template name="gentext.template"> | |
743 <xsl:with-param name="context" select="'xref'"/> | |
744 <xsl:with-param name="name" select="$target.elem"/> | |
745 <xsl:with-param name="lang" select="$lang"/> | |
746 </xsl:call-template> | |
747 </xsl:variable> | |
748 | |
749 <xsl:variable name="styled-xref-context"> | |
750 <xsl:call-template name="gentext.template"> | |
751 <xsl:with-param name="context" select="'xref'"/> | |
752 <xsl:with-param name="name" select="$target.elem"/> | |
753 <xsl:with-param name="lang" select="$lang"/> | |
754 <xsl:with-param name="xrefstyle" select="$xrefstyle"/> | |
755 </xsl:call-template> | |
756 </xsl:variable> | |
757 | |
758 <xsl:variable name="xref-number-context"> | |
759 <xsl:call-template name="gentext.template"> | |
760 <xsl:with-param name="context" select="'xref-number'"/> | |
761 <xsl:with-param name="name" select="$target.elem"/> | |
762 <xsl:with-param name="lang" select="$lang"/> | |
763 </xsl:call-template> | |
764 </xsl:variable> | |
765 | |
766 <xsl:variable name="styled-xref-number-context"> | |
767 <xsl:call-template name="gentext.template"> | |
768 <xsl:with-param name="context" select="'xref-number'"/> | |
769 <xsl:with-param name="name" select="$target.elem"/> | |
770 <xsl:with-param name="lang" select="$lang"/> | |
771 <xsl:with-param name="xrefstyle" select="$xrefstyle"/> | |
772 </xsl:call-template> | |
773 </xsl:variable> | |
774 | |
775 <xsl:variable name="xref-number-and-title-context"> | |
776 <xsl:call-template name="gentext.template"> | |
777 <xsl:with-param name="context" | |
778 select="'xref-number-and-title'"/> | |
779 <xsl:with-param name="name" select="$target.elem"/> | |
780 <xsl:with-param name="lang" select="$lang"/> | |
781 </xsl:call-template> | |
782 </xsl:variable> | |
783 | |
784 <xsl:variable name="styled-xref-number-and-title-context"> | |
785 <xsl:call-template name="gentext.template"> | |
786 <xsl:with-param name="context" | |
787 select="'xref-number-and-title'"/> | |
788 <xsl:with-param name="name" select="$target.elem"/> | |
789 <xsl:with-param name="lang" select="$lang"/> | |
790 <xsl:with-param name="xrefstyle" select="$xrefstyle"/> | |
791 </xsl:call-template> | |
792 </xsl:variable> | |
793 | |
794 <xsl:choose> | |
795 <xsl:when test="$xref-number-and-title-context != | |
796 $styled-xref-number-and-title-context and | |
797 $xref.number != '' and | |
798 $xref.with.number.and.title != 0"> | |
799 <xsl:value-of | |
800 select="$styled-xref-number-and-title-context"/> | |
801 </xsl:when> | |
802 <xsl:when test="$xref-number-context != | |
803 $styled-xref-number-context and | |
804 $xref.number != ''"> | |
805 <xsl:value-of select="$styled-xref-number-context"/> | |
806 </xsl:when> | |
807 <xsl:when test="$xref-context != $styled-xref-context"> | |
808 <xsl:value-of select="$styled-xref-context"/> | |
809 </xsl:when> | |
810 <xsl:when test="$xref-number-and-title-context != '' and | |
811 $xref.number != '' and | |
812 $xref.with.number.and.title != 0"> | |
813 <xsl:value-of | |
814 select="$xref-number-and-title-context"/> | |
815 <xsl:if test="$olink.debug"> | |
816 <xsl:message> | |
817 <xsl:text>Olink error: no gentext template</xsl:text> | |
818 <xsl:text> exists for xrefstyle '</xsl:text> | |
819 <xsl:value-of select="$xrefstyle"/> | |
820 <xsl:text>' for element '</xsl:text> | |
821 <xsl:value-of select="$target.elem"/> | |
822 <xsl:text>' in language '</xsl:text> | |
823 <xsl:value-of select="$lang"/> | |
824 <xsl:text>' in context 'xref-number-and-title</xsl:text> | |
825 <xsl:text>'. Using template without @style.</xsl:text> | |
826 </xsl:message> | |
827 </xsl:if> | |
828 </xsl:when> | |
829 <xsl:when test="$xref-number-context != '' and | |
830 $xref.number != ''"> | |
831 <xsl:value-of select="$xref-number-context"/> | |
832 <xsl:if test="$olink.debug"> | |
833 <xsl:message> | |
834 <xsl:text>Olink error: no gentext template</xsl:text> | |
835 <xsl:text> exists for xrefstyle '</xsl:text> | |
836 <xsl:value-of select="$xrefstyle"/> | |
837 <xsl:text>' for element '</xsl:text> | |
838 <xsl:value-of select="$target.elem"/> | |
839 <xsl:text>' in language '</xsl:text> | |
840 <xsl:value-of select="$lang"/> | |
841 <xsl:text>' in context 'xref-number</xsl:text> | |
842 <xsl:text>'. Using template without @style.</xsl:text> | |
843 </xsl:message> | |
844 </xsl:if> | |
845 </xsl:when> | |
846 <xsl:when test="$xref-context != ''"> | |
847 <xsl:value-of select="$xref-context"/> | |
848 <xsl:if test="$olink.debug"> | |
849 <xsl:message> | |
850 <xsl:text>Olink error: no gentext template</xsl:text> | |
851 <xsl:text> exists for xrefstyle '</xsl:text> | |
852 <xsl:value-of select="$xrefstyle"/> | |
853 <xsl:text>' for element '</xsl:text> | |
854 <xsl:value-of select="$target.elem"/> | |
855 <xsl:text>' in language '</xsl:text> | |
856 <xsl:value-of select="$lang"/> | |
857 <xsl:text>' in context 'xref</xsl:text> | |
858 <xsl:text>'. Using template without @style.</xsl:text> | |
859 </xsl:message> | |
860 </xsl:if> | |
861 </xsl:when> | |
862 <xsl:otherwise> | |
863 <xsl:message> | |
864 <xsl:text>Olink error: no gentext template</xsl:text> | |
865 <xsl:text> exists for xrefstyle '</xsl:text> | |
866 <xsl:value-of select="$xrefstyle"/> | |
867 <xsl:text>' for element '</xsl:text> | |
868 <xsl:value-of select="$target.elem"/> | |
869 <xsl:text>' in language '</xsl:text> | |
870 <xsl:value-of select="$lang"/> | |
871 <xsl:text>'. Trying '%t'.</xsl:text> | |
872 </xsl:message> | |
873 <xsl:value-of select="'%t'"/> | |
874 </xsl:otherwise> | |
875 </xsl:choose> | |
876 </xsl:otherwise> | |
877 </xsl:choose> | |
878 </xsl:variable> | |
879 | |
880 <xsl:if test="$olink.debug != 0"> | |
881 <xsl:message> | |
882 <xsl:text>Olink debug: xrefstyle template is '</xsl:text> | |
883 <xsl:value-of select="$template"/> | |
884 <xsl:text>'.</xsl:text> | |
885 </xsl:message> | |
886 </xsl:if> | |
887 | |
888 <xsl:call-template name="substitute-markup"> | |
889 <xsl:with-param name="template" select="$template"/> | |
890 <xsl:with-param name="title"> | |
891 <xsl:for-each select="$target.database" > | |
892 <xsl:call-template name="insert.targetdb.data"> | |
893 <xsl:with-param name="data" | |
894 select="key('targetptr-key', $olink.key)/ttl/n
ode()"/> | |
895 </xsl:call-template> | |
896 </xsl:for-each> | |
897 </xsl:with-param> | |
898 <xsl:with-param name="label"> | |
899 <xsl:for-each select="$target.database" > | |
900 <xsl:value-of | |
901 select="key('targetptr-key', $olink.key)[1]/@number" /> | |
902 </xsl:for-each> | |
903 </xsl:with-param> | |
904 <xsl:with-param name="pagenumber"> | |
905 <xsl:for-each select="$target.database" > | |
906 <xsl:value-of | |
907 select="key('targetptr-key', $olink.key)[1]/@page" /> | |
908 </xsl:for-each> | |
909 </xsl:with-param> | |
910 <xsl:with-param name="docname"> | |
911 <xsl:for-each select="$target.database" > | |
912 <xsl:call-template name="insert.targetdb.data"> | |
913 <xsl:with-param name="data" | |
914 select="key('targetdoc-key', $targetdoc)[1]/div[1]/ttl/no
de()" /> | |
915 </xsl:call-template> | |
916 </xsl:for-each> | |
917 </xsl:with-param> | |
918 </xsl:call-template> | |
919 </xsl:when> | |
920 | |
921 <xsl:when test="$use.local.olink.style != 0"> | |
922 | |
923 <!-- Is autonumbering on? --> | |
924 <xsl:variable name="target.number"> | |
925 <xsl:for-each select="$target.database" > | |
926 <xsl:value-of | |
927 select="key('targetptr-key', $olink.key)[1]/@number" /> | |
928 </xsl:for-each> | |
929 </xsl:variable> | |
930 | |
931 <xsl:variable name="autonumber"> | |
932 <xsl:choose> | |
933 <xsl:when test="$target.number != ''">1</xsl:when> | |
934 <xsl:otherwise>0</xsl:otherwise> | |
935 </xsl:choose> | |
936 </xsl:variable> | |
937 | |
938 <xsl:variable name="number-and-title-template"> | |
939 <xsl:call-template name="gentext.template.exists"> | |
940 <xsl:with-param name="context" select="'xref-number-and-title'"/> | |
941 <xsl:with-param name="name" select="$target.elem"/> | |
942 </xsl:call-template> | |
943 </xsl:variable> | |
944 | |
945 <xsl:variable name="number-template"> | |
946 <xsl:call-template name="gentext.template.exists"> | |
947 <xsl:with-param name="context" select="'xref-number'"/> | |
948 <xsl:with-param name="name" select="$target.elem"/> | |
949 </xsl:call-template> | |
950 </xsl:variable> | |
951 | |
952 <xsl:variable name="context"> | |
953 <xsl:choose> | |
954 <xsl:when test="string($autonumber) != 0 | |
955 and $number-and-title-template != 0 | |
956 and $xref.with.number.and.title != 0"> | |
957 <xsl:value-of select="'xref-number-and-title'"/> | |
958 </xsl:when> | |
959 <xsl:when test="string($autonumber) != 0 | |
960 and $number-template != 0"> | |
961 <xsl:value-of select="'xref-number'"/> | |
962 </xsl:when> | |
963 <xsl:otherwise> | |
964 <xsl:value-of select="'xref'"/> | |
965 </xsl:otherwise> | |
966 </xsl:choose> | |
967 </xsl:variable> | |
968 | |
969 <xsl:variable name="template"> | |
970 <xsl:call-template name="gentext.template"> | |
971 <xsl:with-param name="context" select="$context"/> | |
972 <xsl:with-param name="name" select="$target.elem"/> | |
973 <xsl:with-param name="lang" select="$lang"/> | |
974 </xsl:call-template> | |
975 </xsl:variable> | |
976 | |
977 <xsl:call-template name="substitute-markup"> | |
978 <xsl:with-param name="template" select="$template"/> | |
979 <xsl:with-param name="title"> | |
980 <xsl:for-each select="$target.database" > | |
981 <xsl:call-template name="insert.targetdb.data"> | |
982 <xsl:with-param name="data" | |
983 select="key('targetptr-key', $olink.key)[1]/ttl/n
ode()" /> | |
984 </xsl:call-template> | |
985 </xsl:for-each> | |
986 </xsl:with-param> | |
987 <xsl:with-param name="label"> | |
988 <xsl:for-each select="$target.database" > | |
989 <xsl:call-template name="insert.targetdb.data"> | |
990 <xsl:with-param name="data" | |
991 select="key('targetptr-key', $olink.key)[1]/@number" /
> | |
992 </xsl:call-template> | |
993 </xsl:for-each> | |
994 </xsl:with-param> | |
995 </xsl:call-template> | |
996 </xsl:when> | |
997 <xsl:when test="$xref.text !=''"> | |
998 <xsl:copy-of select="$xref.text"/> | |
999 </xsl:when> | |
1000 <xsl:otherwise> | |
1001 <xsl:message> | |
1002 <xsl:text>Olink error: no generated text for </xsl:text> | |
1003 <xsl:text>targetdoc/targetptr/lang = '</xsl:text> | |
1004 <xsl:value-of select="$olink.key"/> | |
1005 <xsl:text>'.</xsl:text> | |
1006 </xsl:message> | |
1007 <xsl:text>????</xsl:text> | |
1008 </xsl:otherwise> | |
1009 </xsl:choose> | |
1010 </xsl:when> | |
1011 <xsl:otherwise> | |
1012 <xsl:if test="$olink.key != ''"> | |
1013 <xsl:message> | |
1014 <xsl:text>Olink error: no generated text for </xsl:text> | |
1015 <xsl:text>targetdoc/targetptr/lang = '</xsl:text> | |
1016 <xsl:value-of select="$olink.key"/> | |
1017 <xsl:text>'.</xsl:text> | |
1018 </xsl:message> | |
1019 </xsl:if> | |
1020 <xsl:text>????</xsl:text> | |
1021 </xsl:otherwise> | |
1022 </xsl:choose> | |
1023 </xsl:template> | |
1024 | |
1025 <xsl:template name="insert.targetdb.data"> | |
1026 <xsl:param name="data"/> | |
1027 <!-- Customize this to massage data further --> | |
1028 <xsl:copy-of select="$data"/> | |
1029 </xsl:template> | |
1030 | |
1031 <xsl:template match="*" mode="olink.docname.markup"> | |
1032 <!-- No-op for now --> | |
1033 </xsl:template> | |
1034 | |
1035 <xsl:template name="targetpath"> | |
1036 <xsl:param name="dirnode" /> | |
1037 <xsl:param name="targetdoc" select="''"/> | |
1038 | |
1039 <!-- | |
1040 <xsl:message>dirnode is <xsl:value-of select="$dirnode/@name"/></xsl:message> | |
1041 <xsl:message>targetdoc is <xsl:value-of select="$targetdoc"/></xsl:message> | |
1042 --> | |
1043 <!-- recursive template generates path to olink target directory --> | |
1044 <xsl:choose> | |
1045 <!-- Have we arrived at the final path step? --> | |
1046 <xsl:when test="$dirnode/child::document[@targetdoc = $targetdoc]"> | |
1047 <!-- We are done --> | |
1048 </xsl:when> | |
1049 <!-- Have we reached the top without a match? --> | |
1050 <xsl:when test="local-name($dirnode) != 'dir'" > | |
1051 <xsl:message>Olink error: cannot locate targetdoc <xsl:value-of select="
$targetdoc"/> in sitemap</xsl:message> | |
1052 </xsl:when> | |
1053 <!-- Is the target in a descendant? --> | |
1054 <xsl:when test="$dirnode/descendant::document/@targetdoc = $targetdoc"> | |
1055 <xsl:variable name="step" select="$dirnode/child::dir[descendant::document
/@targetdoc = $targetdoc]"/> | |
1056 <xsl:if test = "$step"> | |
1057 <xsl:value-of select="$step/@name"/> | |
1058 <xsl:text>/</xsl:text> | |
1059 </xsl:if> | |
1060 <!-- Now recurse with the child --> | |
1061 <xsl:call-template name="targetpath" > | |
1062 <xsl:with-param name="dirnode" select="$step"/> | |
1063 <xsl:with-param name="targetdoc" select="$targetdoc"/> | |
1064 </xsl:call-template> | |
1065 </xsl:when> | |
1066 <!-- Otherwise we need to move up a step --> | |
1067 <xsl:otherwise> | |
1068 <xsl:if test="$dirnode/parent::dir"> | |
1069 <xsl:text>../</xsl:text> | |
1070 </xsl:if> | |
1071 <xsl:call-template name="targetpath" > | |
1072 <xsl:with-param name="dirnode" select="$dirnode/parent::*"/> | |
1073 <xsl:with-param name="targetdoc" select="$targetdoc"/> | |
1074 </xsl:call-template> | |
1075 </xsl:otherwise> | |
1076 </xsl:choose> | |
1077 </xsl:template> | |
1078 | |
1079 <xsl:template name="olink.page.citation"> | |
1080 <xsl:param name="olink.key" select="''"/> | |
1081 <xsl:param name="olink.lang" select="'en'"/> | |
1082 <xsl:param name="target.database"/> | |
1083 <xsl:param name="linkend" select="''"/> | |
1084 <xsl:param name="xrefstyle"> | |
1085 <xsl:choose> | |
1086 <xsl:when test="@role and not(@xrefstyle) | |
1087 and $use.role.as.xrefstyle != 0"> | |
1088 <xsl:value-of select="@role"/> | |
1089 </xsl:when> | |
1090 <xsl:otherwise> | |
1091 <xsl:value-of select="@xrefstyle"/> | |
1092 </xsl:otherwise> | |
1093 </xsl:choose> | |
1094 </xsl:param> | |
1095 | |
1096 <xsl:variable name="targetdoc"> | |
1097 <xsl:value-of select="substring-before($olink.key, '/')"/> | |
1098 </xsl:variable> | |
1099 | |
1100 <xsl:choose> | |
1101 <xsl:when test="$linkend != ''"> | |
1102 <xsl:call-template name="xref.page.citation"> | |
1103 <xsl:with-param name="linkend" select="$linkend"/> | |
1104 <xsl:with-param name="target" select="key('id', $linkend)"/> | |
1105 <xsl:with-param name="xrefstyle" select="$xrefstyle"/> | |
1106 </xsl:call-template> | |
1107 </xsl:when> | |
1108 <xsl:when test="not(starts-with(normalize-space($xrefstyle), | |
1109 'select:') | |
1110 and (contains($xrefstyle, 'page') | |
1111 or contains($xrefstyle, 'Page'))) | |
1112 and $current.docid != '' | |
1113 and $current.docid != $targetdoc | |
1114 and $insert.olink.page.number = 'yes' "> | |
1115 | |
1116 <xsl:variable name="page-number"> | |
1117 <xsl:for-each select="$target.database" > | |
1118 <xsl:value-of | |
1119 select="key('targetptr-key', $olink.key)[1]/@page" /> | |
1120 </xsl:for-each> | |
1121 </xsl:variable> | |
1122 | |
1123 <xsl:if test="$page-number != ''"> | |
1124 <xsl:call-template name="substitute-markup"> | |
1125 <xsl:with-param name="template"> | |
1126 <xsl:call-template name="gentext.template"> | |
1127 <xsl:with-param name="name" select="'olink.page.citation'"/> | |
1128 <xsl:with-param name="context" select="'xref'"/> | |
1129 <xsl:with-param name="lang" select="$olink.lang"/> | |
1130 </xsl:call-template> | |
1131 </xsl:with-param> | |
1132 <xsl:with-param name="pagenumber" select="$page-number"/> | |
1133 </xsl:call-template> | |
1134 </xsl:if> | |
1135 | |
1136 </xsl:when> | |
1137 </xsl:choose> | |
1138 </xsl:template> | |
1139 | |
1140 <xsl:template name="olink.document.citation"> | |
1141 <xsl:param name="olink.key" select="''"/> | |
1142 <xsl:param name="olink.lang" select="'en'"/> | |
1143 <xsl:param name="target.database"/> | |
1144 <xsl:param name="xrefstyle"> | |
1145 <xsl:choose> | |
1146 <xsl:when test="@role and not(@xrefstyle) | |
1147 and $use.role.as.xrefstyle != 0"> | |
1148 <xsl:value-of select="@role"/> | |
1149 </xsl:when> | |
1150 <xsl:otherwise> | |
1151 <xsl:value-of select="@xrefstyle"/> | |
1152 </xsl:otherwise> | |
1153 </xsl:choose> | |
1154 </xsl:param> | |
1155 | |
1156 <xsl:variable name="page"> | |
1157 <xsl:for-each select="$target.database" > | |
1158 <xsl:value-of | |
1159 select="key('targetptr-key', $olink.key)[1]/@page" /> | |
1160 </xsl:for-each> | |
1161 </xsl:variable> | |
1162 | |
1163 <xsl:variable name="targetdoc"> | |
1164 <xsl:value-of select="substring-before($olink.key, '/')"/> | |
1165 </xsl:variable> | |
1166 | |
1167 <xsl:variable name="targetptr"> | |
1168 <xsl:value-of | |
1169 select="substring-before(substring-after($olink.key, '/'), '/')"/> | |
1170 </xsl:variable> | |
1171 | |
1172 <!-- Don't add docname if pointing to root element --> | |
1173 <xsl:variable name="rootptr"> | |
1174 <xsl:for-each select="$target.database" > | |
1175 <xsl:value-of | |
1176 select="key('targetdoc-key', $targetdoc)[1]/div[1]/@targetptr" /> | |
1177 </xsl:for-each> | |
1178 </xsl:variable> | |
1179 | |
1180 <xsl:variable name="docname"> | |
1181 <xsl:for-each select="$target.database" > | |
1182 <xsl:call-template name="insert.targetdb.data"> | |
1183 <xsl:with-param name="data" | |
1184 select="key('targetdoc-key', $targetdoc)[1]/div[1]/ttl/node()" /> | |
1185 </xsl:call-template> | |
1186 </xsl:for-each> | |
1187 </xsl:variable> | |
1188 | |
1189 <xsl:if test="not(starts-with(normalize-space($xrefstyle), 'select:') | |
1190 and (contains($xrefstyle, 'docname'))) | |
1191 and ($olink.doctitle = 'yes' or $olink.doctitle = '1') | |
1192 and $current.docid != '' | |
1193 and $rootptr != $targetptr | |
1194 and $current.docid != $targetdoc | |
1195 and $docname != ''"> | |
1196 <xsl:call-template name="substitute-markup"> | |
1197 <xsl:with-param name="template"> | |
1198 <xsl:call-template name="gentext.template"> | |
1199 <xsl:with-param name="name" select="'olink.document.citation'"/> | |
1200 <xsl:with-param name="context" select="'xref'"/> | |
1201 <xsl:with-param name="lang" select="$olink.lang"/> | |
1202 </xsl:call-template> | |
1203 </xsl:with-param> | |
1204 <xsl:with-param name="docname" select="$docname"/> | |
1205 <xsl:with-param name="pagenumber" select="$page"/> | |
1206 </xsl:call-template> | |
1207 </xsl:if> | |
1208 </xsl:template> | |
1209 | |
1210 <xsl:template name="xref.page.citation"> | |
1211 <!-- Determine if this xref should have a page citation. | |
1212 Context node is the xref or local olink element --> | |
1213 <xsl:param name="linkend" select="@linkend"/> | |
1214 <xsl:param name="target" select="key('id', $linkend)"/> | |
1215 <xsl:param name="xrefstyle"> | |
1216 <xsl:choose> | |
1217 <xsl:when test="@role and not(@xrefstyle) | |
1218 and $use.role.as.xrefstyle != 0"> | |
1219 <xsl:value-of select="@role"/> | |
1220 </xsl:when> | |
1221 <xsl:otherwise> | |
1222 <xsl:value-of select="@xrefstyle"/> | |
1223 </xsl:otherwise> | |
1224 </xsl:choose> | |
1225 </xsl:param> | |
1226 | |
1227 <xsl:if test="not(starts-with(normalize-space($xrefstyle),'select:') | |
1228 and (contains($xrefstyle, 'page') | |
1229 or contains($xrefstyle, 'Page'))) | |
1230 and ( $insert.xref.page.number = 'yes' | |
1231 or $insert.xref.page.number = '1') | |
1232 or local-name($target) = 'para'"> | |
1233 <xsl:apply-templates select="$target" mode="page.citation"> | |
1234 <xsl:with-param name="id" select="$linkend"/> | |
1235 </xsl:apply-templates> | |
1236 </xsl:if> | |
1237 </xsl:template> | |
1238 | |
1239 </xsl:stylesheet> | |
1240 | |
OLD | NEW |