root/docs/docbook-xsl/fo/autoidx.xsl

Revision 23dea7e00df87480acb58bb3398283c2bb227949, 43.2 kB (checked in by Theo Schlossnagle <jesus@omniti.com>, 7 years ago)

pull docs into master

  • Property mode set to 100644
Line 
1 <?xml version="1.0"?>
2 <!DOCTYPE xsl:stylesheet [
3
4 <!ENTITY lowercase "'abcdefghijklmnopqrstuvwxyz'">
5 <!ENTITY uppercase "'ABCDEFGHIJKLMNOPQRSTUVWXYZ'">
6
7 <!ENTITY primary   'normalize-space(concat(primary/@sortas, primary[not(@sortas)]))'>
8 <!ENTITY secondary 'normalize-space(concat(secondary/@sortas, secondary[not(@sortas)]))'>
9 <!ENTITY tertiary  'normalize-space(concat(tertiary/@sortas, tertiary[not(@sortas)]))'>
10
11 <!ENTITY sep '" "'>
12 <!ENTITY scope 'count(ancestor::node()|$scope) = count(ancestor::node())
13                 and ($role = @role or $type = @type or
14                 (string-length($role) = 0 and string-length($type) = 0))'>
15 ]>
16 <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
17                 xmlns:fo="http://www.w3.org/1999/XSL/Format"
18                 xmlns:rx="http://www.renderx.com/XSL/Extensions"
19                 xmlns:axf="http://www.antennahouse.com/names/XSL/Extensions"
20                 version="1.0">
21
22 <!-- ********************************************************************
23      $Id: autoidx.xsl,v 1.34 2005/08/09 09:40:21 bobstayton Exp $
24      ********************************************************************
25
26      This file is part of the DocBook XSL Stylesheet distribution.
27      See ../README or http://docbook.sf.net/ for copyright
28      and other information.
29
30      ******************************************************************** -->
31
32 <!-- ==================================================================== -->
33 <!-- Derived from Jeni Tennison's work in the HTML case -->
34
35 <xsl:key name="letter"
36          match="indexterm"
37          use="translate(substring(&primary;, 1, 1),&lowercase;,&uppercase;)"/>
38
39 <xsl:key name="primary"
40          match="indexterm"
41          use="&primary;"/>
42
43 <xsl:key name="secondary"
44          match="indexterm"
45          use="concat(&primary;, &sep;, &secondary;)"/>
46
47 <xsl:key name="tertiary"
48          match="indexterm"
49          use="concat(&primary;, &sep;, &secondary;, &sep;, &tertiary;)"/>
50
51 <xsl:key name="endofrange"
52          match="indexterm[@class='endofrange']"
53          use="@startref"/>
54
55 <xsl:key name="see-also"
56          match="indexterm[seealso]"
57          use="concat(&primary;, &sep;, &secondary;, &sep;, &tertiary;, &sep;, seealso)"/>
58
59 <xsl:key name="see"
60          match="indexterm[see]"
61          use="concat(&primary;, &sep;, &secondary;, &sep;, &tertiary;, &sep;, see)"/>
62
63 <xsl:template name="generate-index">
64   <xsl:param name="scope" select="(ancestor::book|/)[last()]"/>
65
66   <xsl:variable name="role">
67     <xsl:if test="$index.on.role != 0">
68       <xsl:value-of select="@role"/>
69     </xsl:if>
70   </xsl:variable>
71
72   <xsl:variable name="type">
73     <xsl:if test="$index.on.type != 0">
74       <xsl:value-of select="@type"/>
75     </xsl:if>
76   </xsl:variable>
77
78   <xsl:variable name="terms"
79                 select="//indexterm[count(.|key('letter',
80                                                 translate(substring(&primary;, 1, 1),
81                                                           &lowercase;,
82                                                           &uppercase;))[&scope;][1]) = 1
83                                     and not(@class = 'endofrange')]"/>
84
85   <xsl:variable name="alphabetical"
86                 select="$terms[contains(concat(&lowercase;, &uppercase;),
87                                         substring(&primary;, 1, 1))]"/>
88
89   <xsl:variable name="others" select="$terms[not(contains(concat(&lowercase;,
90                                                  &uppercase;),
91                                              substring(&primary;, 1, 1)))]"/>
92   <fo:block>
93     <xsl:if test="$others">
94       <xsl:call-template name="indexdiv.title">
95         <xsl:with-param name="titlecontent">
96           <xsl:call-template name="gentext">
97             <xsl:with-param name="key" select="'index symbols'"/>
98           </xsl:call-template>
99         </xsl:with-param>
100       </xsl:call-template>
101
102       <fo:block>
103         <xsl:apply-templates select="$others[count(.|key('primary',
104                                      &primary;)[&scope;][1]) = 1]"
105                              mode="index-symbol-div">
106           <xsl:with-param name="scope" select="$scope"/>
107           <xsl:with-param name="role" select="$role"/>
108           <xsl:with-param name="type" select="$type"/>
109           <xsl:sort select="translate(&primary;, &lowercase;, &uppercase;)"/>
110         </xsl:apply-templates>
111       </fo:block>
112     </xsl:if>
113
114     <xsl:apply-templates select="$alphabetical[count(.|key('letter',
115                                  translate(substring(&primary;, 1, 1),
116                                            &lowercase;,&uppercase;))[&scope;][1]) = 1]"
117                          mode="index-div">
118       <xsl:with-param name="scope" select="$scope"/>
119       <xsl:with-param name="role" select="$role"/>
120       <xsl:with-param name="type" select="$type"/>
121       <xsl:sort select="translate(&primary;, &lowercase;, &uppercase;)"/>
122     </xsl:apply-templates>
123   </fo:block>
124 </xsl:template>
125
126 <xsl:template match="indexterm" mode="index-div">
127   <xsl:param name="scope" select="."/>
128   <xsl:param name="role" select="''"/>
129   <xsl:param name="type" select="''"/>
130
131   <xsl:variable name="key"
132                 select="translate(substring(&primary;, 1, 1),&lowercase;,&uppercase;)"/>
133
134   <xsl:if test="key('letter', $key)[&scope;]
135                 [count(.|key('primary', &primary;)[&scope;][1]) = 1]">
136     <fo:block>
137       <xsl:if test="contains(concat(&lowercase;, &uppercase;), $key)">
138         <xsl:call-template name="indexdiv.title">
139           <xsl:with-param name="titlecontent">
140             <xsl:value-of select="translate($key, &lowercase;, &uppercase;)"/>
141           </xsl:with-param>
142         </xsl:call-template>
143       </xsl:if>
144       <fo:block xsl:use-attribute-sets="index.entry.properties">
145         <xsl:apply-templates select="key('letter', $key)[&scope;]
146                                      [count(.|key('primary', &primary;)[&scope;][1])=1]"
147                              mode="index-primary">
148           <xsl:sort select="translate(&primary;, &lowercase;, &uppercase;)"/>
149           <xsl:with-param name="scope" select="$scope"/>
150           <xsl:with-param name="role" select="$role"/>
151           <xsl:with-param name="type" select="$type"/>
152         </xsl:apply-templates>
153       </fo:block>
154     </fo:block>
155   </xsl:if>
156 </xsl:template>
157
158 <xsl:template match="indexterm" mode="index-symbol-div">
159   <xsl:param name="scope" select="."/>
160   <xsl:param name="role" select="''"/>
161   <xsl:param name="type" select="''"/>
162
163   <xsl:variable name="key"
164                 select="translate(substring(&primary;, 1, 1),&lowercase;,&uppercase;)"/>
165
166   <fo:block xsl:use-attribute-sets="index.entry.properties">
167     <xsl:apply-templates select="key('letter', $key)[&scope;][count(.|key('primary', &primary;)[&scope;][1]) = 1]"
168                          mode="index-primary">
169       <xsl:with-param name="scope" select="$scope"/>
170       <xsl:with-param name="role" select="$role"/>
171       <xsl:with-param name="type" select="$type"/>
172       <xsl:sort select="translate(&primary;, &lowercase;, &uppercase;)"/>
173     </xsl:apply-templates>
174   </fo:block>
175 </xsl:template>
176
177 <xsl:template match="indexterm" mode="index-primary">
178   <xsl:param name="scope" select="."/>
179   <xsl:param name="role" select="''"/>
180   <xsl:param name="type" select="''"/>
181
182   <xsl:variable name="key" select="&primary;"/>
183   <xsl:variable name="refs" select="key('primary', $key)[&scope;]"/>
184   <fo:block>
185     <xsl:if test="$axf.extensions != 0">
186       <xsl:attribute name="axf:suppress-duplicate-page-number">true</xsl:attribute>
187     </xsl:if>
188     <xsl:value-of select="primary"/>
189
190     <xsl:choose>
191       <xsl:when test="$xep.extensions != 0">
192         <xsl:if test="$refs[not(see) and not(secondary)]">
193           <xsl:text>, </xsl:text>
194           <xsl:variable name="primary" select="&primary;"/>
195           <xsl:variable name="primary.significant" select="concat(&primary;, $significant.flag)"/>
196           <rx:page-index>
197             <xsl:if test="$refs[@significance='preferred'][not(see) and not(secondary)]">
198               <rx:index-item xsl:use-attribute-sets="index.preferred.page.properties xep.index.item.properties"
199                 ref-key="{$primary.significant}"/>
200             </xsl:if>
201             <xsl:if test="$refs[not(@significance) or @significance!='preferred'][not(see) and not(secondary)]">
202               <rx:index-item xsl:use-attribute-sets="xep.index.item.properties"
203                 ref-key="{$primary}"/>
204             </xsl:if>
205           </rx:page-index>       
206         </xsl:if>
207       </xsl:when>
208       <xsl:otherwise>
209         <xsl:variable name="page-number-citations">
210           <xsl:for-each select="$refs[not(see)
211                                 and not(secondary)]">
212             <xsl:apply-templates select="." mode="reference">
213               <xsl:with-param name="scope" select="$scope"/>
214               <xsl:with-param name="role" select="$role"/>
215               <xsl:with-param name="type" select="$type"/>
216             </xsl:apply-templates>
217           </xsl:for-each>
218         </xsl:variable>
219
220         <xsl:choose>
221           <xsl:when test="$passivetex.extensions != '0'">
222             <fotex:sort xmlns:fotex="http://www.tug.org/fotex">
223               <xsl:copy-of select="$page-number-citations"/>
224             </fotex:sort>
225           </xsl:when>
226           <xsl:otherwise>
227             <xsl:copy-of select="$page-number-citations"/>
228           </xsl:otherwise>
229         </xsl:choose>
230       </xsl:otherwise>
231     </xsl:choose>
232
233     <xsl:if test="$refs[not(secondary)]/*[self::see]">
234       <xsl:apply-templates select="$refs[generate-id() = generate-id(key('see', concat(&primary;, &sep;, &sep;, &sep;, see))[&scope;][1])]"
235                            mode="index-see">
236          <xsl:with-param name="scope" select="$scope"/>
237          <xsl:with-param name="role" select="$role"/>
238          <xsl:with-param name="type" select="$type"/>
239          <xsl:sort select="translate(see, &lowercase;, &uppercase;)"/>
240       </xsl:apply-templates>
241     </xsl:if>
242
243   </fo:block>
244
245   <xsl:if test="$refs/secondary or $refs[not(secondary)]/*[self::seealso]">
246     <fo:block start-indent="1pc">
247       <xsl:apply-templates select="$refs[generate-id() = generate-id(key('see-also', concat(&primary;, &sep;, &sep;, &sep;, seealso))[&scope;][1])]"
248                            mode="index-seealso">
249          <xsl:with-param name="scope" select="$scope"/>
250          <xsl:with-param name="role" select="$role"/>
251          <xsl:with-param name="type" select="$type"/>
252          <xsl:sort select="translate(seealso, &lowercase;, &uppercase;)"/>
253       </xsl:apply-templates>
254       <xsl:apply-templates select="$refs[secondary and count(.|key('secondary', concat($key, &sep;, &secondary;))[&scope;][1]) = 1]"
255                            mode="index-secondary">
256        <xsl:with-param name="scope" select="$scope"/>
257        <xsl:with-param name="role" select="$role"/>
258        <xsl:with-param name="type" select="$type"/>
259        <xsl:sort select="translate(&secondary;, &lowercase;, &uppercase;)"/>
260       </xsl:apply-templates>
261     </fo:block>
262   </xsl:if>
263 </xsl:template>
264
265 <xsl:template match="indexterm" mode="index-secondary">
266   <xsl:param name="scope" select="."/>
267   <xsl:param name="role" select="''"/>
268   <xsl:param name="type" select="''"/>
269
270   <xsl:variable name="key" select="concat(&primary;, &sep;, &secondary;)"/>
271   <xsl:variable name="refs" select="key('secondary', $key)[&scope;]"/>
272   <fo:block>
273     <xsl:if test="$axf.extensions != 0">
274       <xsl:attribute name="axf:suppress-duplicate-page-number">true</xsl:attribute>
275     </xsl:if>
276     <xsl:value-of select="secondary"/>
277
278     <xsl:choose>
279       <xsl:when test="$xep.extensions != 0">
280         <xsl:if test="$refs[not(see) and not(tertiary)]">
281           <xsl:text>, </xsl:text>
282           <xsl:variable name="primary" select="&primary;"/>
283           <xsl:variable name="secondary" select="&secondary;"/>
284           <xsl:variable name="primary.significant" select="concat(&primary;, $significant.flag)"/>
285           <rx:page-index>
286             <xsl:if test="$refs[@significance='preferred'][not(see) and not(tertiary)]">
287               <rx:index-item xsl:use-attribute-sets="index.preferred.page.properties xep.index.item.properties">
288                 <xsl:attribute name="ref-key">
289                   <xsl:value-of select="$primary.significant"/>
290                   <xsl:text>, </xsl:text>
291                   <xsl:value-of select="$secondary"/>
292                 </xsl:attribute>
293               </rx:index-item>
294             </xsl:if>
295             <xsl:if test="$refs[not(@significance) or @significance!='preferred'][not(see) and not(tertiary)]">
296               <rx:index-item xsl:use-attribute-sets="xep.index.item.properties">
297                 <xsl:attribute name="ref-key">
298                   <xsl:value-of select="$primary"/>
299                   <xsl:text>, </xsl:text>
300                   <xsl:value-of select="$secondary"/>
301                 </xsl:attribute>
302               </rx:index-item>
303             </xsl:if>
304           </rx:page-index>
305         </xsl:if>
306       </xsl:when>
307       <xsl:otherwise>
308         <xsl:variable name="page-number-citations">
309           <xsl:for-each select="$refs[not(see)
310                                 and not(tertiary)]">
311             <xsl:apply-templates select="." mode="reference">
312               <xsl:with-param name="scope" select="$scope"/>
313               <xsl:with-param name="role" select="$role"/>
314               <xsl:with-param name="type" select="$type"/>
315             </xsl:apply-templates>
316           </xsl:for-each>
317         </xsl:variable>
318
319         <xsl:choose>
320           <xsl:when test="$passivetex.extensions != '0'">
321             <fotex:sort xmlns:fotex="http://www.tug.org/fotex">
322               <xsl:copy-of select="$page-number-citations"/>
323             </fotex:sort>
324           </xsl:when>
325           <xsl:otherwise>
326             <xsl:copy-of select="$page-number-citations"/>
327           </xsl:otherwise>
328         </xsl:choose>
329       </xsl:otherwise>
330     </xsl:choose>
331
332     <xsl:if test="$refs[not(tertiary)]/*[self::see]">
333       <xsl:apply-templates select="$refs[generate-id() = generate-id(key('see', concat(&primary;, &sep;, &secondary;, &sep;, &sep;, see))[&scope;][1])]"
334                            mode="index-see">
335         <xsl:with-param name="scope" select="$scope"/>
336         <xsl:with-param name="role" select="$role"/>
337         <xsl:with-param name="type" select="$type"/>
338         <xsl:sort select="translate(see, &lowercase;, &uppercase;)"/>
339       </xsl:apply-templates>
340     </xsl:if>
341
342   </fo:block>
343
344   <xsl:if test="$refs/tertiary or $refs[not(tertiary)]/*[self::seealso]">
345     <fo:block start-indent="2pc">
346       <xsl:apply-templates select="$refs[generate-id() = generate-id(key('see-also', concat(&primary;, &sep;, &secondary;, &sep;, &sep;, seealso))[&scope;][1])]"
347                            mode="index-seealso">
348           <xsl:with-param name="scope" select="$scope"/>
349           <xsl:with-param name="role" select="$role"/>
350           <xsl:with-param name="type" select="$type"/>
351           <xsl:sort select="translate(seealso, &lowercase;, &uppercase;)"/>
352       </xsl:apply-templates>
353       <xsl:apply-templates select="$refs[tertiary and count(.|key('tertiary', concat($key, &sep;, &tertiary;))[&scope;][1]) = 1]"
354                            mode="index-tertiary">
355           <xsl:with-param name="scope" select="$scope"/>
356           <xsl:with-param name="role" select="$role"/>
357           <xsl:with-param name="type" select="$type"/>
358           <xsl:sort select="translate(&tertiary;, &lowercase;, &uppercase;)"/>
359       </xsl:apply-templates>
360     </fo:block>
361   </xsl:if>
362 </xsl:template>
363
364 <xsl:template match="indexterm" mode="index-tertiary">
365   <xsl:param name="scope" select="."/>
366   <xsl:param name="role" select="''"/>
367   <xsl:param name="type" select="''"/>
368   <xsl:variable name="key" select="concat(&primary;, &sep;, &secondary;, &sep;, &tertiary;)"/>
369   <xsl:variable name="refs" select="key('tertiary', $key)[&scope;]"/>
370   <fo:block>
371     <xsl:if test="$axf.extensions != 0">
372       <xsl:attribute name="axf:suppress-duplicate-page-number">true</xsl:attribute>
373     </xsl:if>
374     <xsl:value-of select="tertiary"/>
375
376     <xsl:choose>
377       <xsl:when test="$xep.extensions != 0">
378         <xsl:if test="$refs[not(see)]">
379           <xsl:text>, </xsl:text>
380           <xsl:variable name="primary" select="&primary;"/>
381           <xsl:variable name="secondary" select="&secondary;"/>
382           <xsl:variable name="tertiary" select="&tertiary;"/>
383           <xsl:variable name="primary.significant" select="concat(&primary;, $significant.flag)"/>
384           <rx:page-index>
385             <xsl:if test="$refs[@significance='preferred'][not(see)]">
386               <rx:index-item xsl:use-attribute-sets="index.preferred.page.properties xep.index.item.properties">
387                 <xsl:attribute name="ref-key">
388                   <xsl:value-of select="$primary.significant"/>
389                   <xsl:text>, </xsl:text>
390                   <xsl:value-of select="$secondary"/>
391                   <xsl:text>, </xsl:text>
392                   <xsl:value-of select="$tertiary"/>
393                 </xsl:attribute>
394               </rx:index-item>
395             </xsl:if>
396             <xsl:if test="$refs[not(@significance) or @significance!='preferred'][not(see)]">
397               <rx:index-item xsl:use-attribute-sets="xep.index.item.properties">
398                 <xsl:attribute name="ref-key">
399                   <xsl:value-of select="$primary"/>
400                   <xsl:text>, </xsl:text>
401                   <xsl:value-of select="$secondary"/>
402                   <xsl:text>, </xsl:text>
403                   <xsl:value-of select="$tertiary"/>
404                 </xsl:attribute>
405               </rx:index-item>
406             </xsl:if>
407           </rx:page-index>
408         </xsl:if>
409       </xsl:when>
410       <xsl:otherwise>
411         <xsl:variable name="page-number-citations">
412           <xsl:for-each select="$refs[not(see)]">
413             <xsl:apply-templates select="." mode="reference">
414               <xsl:with-param name="scope" select="$scope"/>
415               <xsl:with-param name="role" select="$role"/>
416               <xsl:with-param name="type" select="$type"/>
417             </xsl:apply-templates>
418           </xsl:for-each>
419         </xsl:variable>
420
421         <xsl:choose>
422           <xsl:when test="$passivetex.extensions != '0'">
423             <fotex:sort xmlns:fotex="http://www.tug.org/fotex">
424               <xsl:copy-of select="$page-number-citations"/>
425             </fotex:sort>
426           </xsl:when>
427           <xsl:otherwise>
428             <xsl:copy-of select="$page-number-citations"/>
429           </xsl:otherwise>
430         </xsl:choose>
431       </xsl:otherwise>
432     </xsl:choose>
433
434     <xsl:if test="$refs/see">
435       <xsl:apply-templates select="$refs[generate-id() = generate-id(key('see', concat(&primary;, &sep;, &secondary;, &sep;, &tertiary;, &sep;, see))[&scope;][1])]"
436                            mode="index-see">
437         <xsl:with-param name="scope" select="$scope"/>
438         <xsl:with-param name="role" select="$role"/>
439         <xsl:with-param name="type" select="$type"/>
440         <xsl:sort select="translate(see, &lowercase;, &uppercase;)"/>
441       </xsl:apply-templates>
442     </xsl:if>
443
444   </fo:block>
445
446   <xsl:if test="$refs/seealso">
447     <fo:block>
448       <xsl:apply-templates select="$refs[generate-id() = generate-id(key('see-also', concat(&primary;, &sep;, &secondary;, &sep;, &tertiary;, &sep;, seealso))[&scope;][1])]"
449                            mode="index-seealso">
450         <xsl:with-param name="scope" select="$scope"/>
451         <xsl:with-param name="role" select="$role"/>
452         <xsl:with-param name="type" select="$type"/>
453         <xsl:sort select="translate(seealso, &lowercase;, &uppercase;)"/>
454       </xsl:apply-templates>
455     </fo:block>
456   </xsl:if>
457 </xsl:template>
458
459 <xsl:template match="indexterm" mode="reference">
460   <xsl:param name="scope" select="."/>
461   <xsl:param name="role" select="''"/>
462   <xsl:param name="type" select="''"/>
463   <xsl:param name="separator" select="', '"/>
464
465   <xsl:if test="$passivetex.extensions = '0'">
466     <xsl:value-of select="$separator"/>
467   </xsl:if>
468
469   <xsl:choose>
470     <xsl:when test="@zone and string(@zone)">
471       <xsl:call-template name="reference">
472         <xsl:with-param name="zones" select="normalize-space(@zone)"/>
473         <xsl:with-param name="scope" select="$scope"/>
474         <xsl:with-param name="role" select="$role"/>
475         <xsl:with-param name="type" select="$type"/>
476       </xsl:call-template>
477     </xsl:when>
478     <xsl:when test="ancestor::*[contains(local-name(),'info') and not(starts-with(local-name(),'info'))]">
479       <xsl:call-template name="info.reference">
480         <xsl:with-param name="scope" select="$scope"/>
481         <xsl:with-param name="role" select="$role"/>
482         <xsl:with-param name="type" select="$type"/>
483       </xsl:call-template>
484     </xsl:when>
485     <xsl:otherwise>
486       <xsl:variable name="id">
487         <xsl:call-template name="object.id"/>
488       </xsl:variable>
489
490       <fo:basic-link internal-destination="{$id}">
491         <fo:page-number-citation ref-id="{$id}"/>
492       </fo:basic-link>
493
494       <xsl:if test="key('endofrange', @id)[&scope;]">
495         <xsl:apply-templates select="key('endofrange', @id)[&scope;][last()]"
496                              mode="reference">
497           <xsl:with-param name="scope" select="$scope"/>
498           <xsl:with-param name="role" select="$role"/>
499           <xsl:with-param name="type" select="$type"/>
500           <xsl:with-param name="separator" select="'-'"/>
501         </xsl:apply-templates>
502       </xsl:if>
503     </xsl:otherwise>
504   </xsl:choose>
505 </xsl:template>
506
507 <xsl:template name="reference">
508   <xsl:param name="scope" select="."/>
509   <xsl:param name="role" select="''"/>
510   <xsl:param name="type" select="''"/>
511   <xsl:param name="zones"/>
512
513   <xsl:choose>
514     <xsl:when test="contains($zones, ' ')">
515       <xsl:variable name="zone" select="substring-before($zones, ' ')"/>
516       <xsl:variable name="target" select="key('id', $zone)[&scope;]"/>
517
518       <xsl:variable name="id">
519         <xsl:call-template name="object.id">
520            <xsl:with-param name="object" select="$target[1]"/>
521         </xsl:call-template>
522       </xsl:variable>
523
524       <fo:basic-link internal-destination="{$id}">
525         <fo:page-number-citation ref-id="{$id}"/>
526       </fo:basic-link>
527
528       <xsl:if test="$passivetex.extensions = '0'">
529         <xsl:text>, </xsl:text>
530       </xsl:if>
531       <xsl:call-template name="reference">
532         <xsl:with-param name="zones" select="substring-after($zones, ' ')"/>
533         <xsl:with-param name="scope" select="$scope"/>
534         <xsl:with-param name="role" select="$role"/>
535         <xsl:with-param name="type" select="$type"/>
536       </xsl:call-template>
537     </xsl:when>
538     <xsl:otherwise>
539       <xsl:variable name="zone" select="$zones"/>
540       <xsl:variable name="target" select="key('id', $zone)[&scope;]"/>
541
542       <xsl:variable name="id">
543         <xsl:call-template name="object.id">
544           <xsl:with-param name="object" select="$target[1]"/>
545         </xsl:call-template>
546       </xsl:variable>
547
548       <fo:basic-link internal-destination="{$id}">
549         <fo:page-number-citation ref-id="{$id}"/>
550       </fo:basic-link>
551     </xsl:otherwise>
552   </xsl:choose>
553 </xsl:template>
554
555 <xsl:template name="info.reference">
556   <!-- This is not perfect. It doesn't treat indexterm inside info element as a range covering whole parent of info.
557        It also not work when there is no ID generated for parent element. But it works in the most common cases. -->
558   <xsl:param name="scope" select="."/>
559   <xsl:param name="role" select="''"/>
560   <xsl:param name="type" select="''"/>
561
562   <xsl:variable name="target" select="(ancestor::appendix|ancestor::article|ancestor::bibliography|ancestor::book|
563                                        ancestor::chapter|ancestor::glossary|ancestor::part|ancestor::preface|
564                                        ancestor::refentry|ancestor::reference|ancestor::refsect1|ancestor::refsect2|
565                                        ancestor::refsect3|ancestor::refsection|ancestor::refsynopsisdiv|
566                                        ancestor::sect1|ancestor::sect2|ancestor::sect3|ancestor::sect4|ancestor::sect5|
567                                        ancestor::section|ancestor::setindex|ancestor::set|ancestor::sidebar)[&scope;]"/>
568  
569   <xsl:variable name="id">
570     <xsl:call-template name="object.id">
571       <xsl:with-param name="object" select="$target[1]"/>
572     </xsl:call-template>
573   </xsl:variable>
574  
575   <fo:basic-link internal-destination="{$id}">
576     <fo:page-number-citation ref-id="{$id}"/>
577   </fo:basic-link>
578 </xsl:template>
579
580 <xsl:template match="indexterm" mode="index-see">
581    <xsl:param name="scope" select="."/>
582   <xsl:param name="role" select="''"/>
583   <xsl:param name="type" select="''"/>
584
585    <fo:inline>
586      <xsl:text> (</xsl:text>
587      <xsl:call-template name="gentext">
588        <xsl:with-param name="key" select="'see'"/>
589      </xsl:call-template>
590      <xsl:text> </xsl:text>
591      <xsl:value-of select="see"/>
592      <xsl:text>)</xsl:text>
593    </fo:inline>
594 </xsl:template>
595
596 <xsl:template match="indexterm" mode="index-seealso">
597    <xsl:param name="scope" select="."/>
598   <xsl:param name="role" select="''"/>
599   <xsl:param name="type" select="''"/>
600
601   <xsl:for-each select="seealso">
602     <xsl:sort select="translate(., &lowercase;, &uppercase;)"/>
603     <fo:block>
604       <xsl:text>(</xsl:text>
605       <xsl:call-template name="gentext">
606         <xsl:with-param name="key" select="'seealso'"/>
607       </xsl:call-template>
608       <xsl:text> </xsl:text>
609       <xsl:value-of select="."/>
610       <xsl:text>)</xsl:text>
611     </fo:block>
612   </xsl:for-each>
613
614 </xsl:template>
615
616 <!-- ====================================================================== -->
617
618 <xsl:template name="generate-index-markup">
619   <xsl:param name="scope" select="(ancestor::book|/)[last()]"/>
620   <xsl:param name="role" select="@role"/>
621   <xsl:param name="type" select="@type"/>
622
623   <xsl:variable name="terms" select="$scope//indexterm[count(.|key('letter',
624                                      translate(substring(&primary;, 1, 1),&lowercase;,&uppercase;))[&scope;][1]) = 1]"/>
625   <xsl:variable name="alphabetical"
626                 select="$terms[contains(concat(&lowercase;, &uppercase;),
627                                         substring(&primary;, 1, 1))]"/>
628   <xsl:variable name="others" select="$terms[not(contains(concat(&lowercase;,
629                                                  &uppercase;),
630                                              substring(&primary;, 1, 1)))]"/>
631
632   <xsl:text>&lt;index&gt;&#10;</xsl:text>
633   <xsl:if test="$others">
634     <xsl:text>&#10;&lt;indexdiv&gt;&#10;</xsl:text>
635     <xsl:text>&lt;title&gt;</xsl:text>
636     <xsl:call-template name="gentext">
637       <xsl:with-param name="key" select="'index symbols'"/>
638     </xsl:call-template>
639     <xsl:text>&lt;/title&gt;&#10;</xsl:text>
640     <xsl:apply-templates select="$others[count(.|key('primary',
641                                  &primary;)[&scope;][1]) = 1]"
642                          mode="index-symbol-div-markup">
643       <xsl:with-param name="scope" select="$scope"/>
644       <xsl:with-param name="role" select="$role"/>
645       <xsl:with-param name="type" select="$type"/>
646       <xsl:sort select="translate(&primary;, &lowercase;, &uppercase;)"/>
647     </xsl:apply-templates>
648     <xsl:text>&lt;/indexdiv&gt;&#10;</xsl:text>
649   </xsl:if>
650
651   <xsl:apply-templates select="$alphabetical[count(.|key('letter',
652                                translate(substring(&primary;, 1, 1),&lowercase;,&uppercase;))[&scope;][1]) = 1]"
653                        mode="index-div-markup">
654       <xsl:with-param name="scope" select="$scope"/>
655       <xsl:with-param name="role" select="$role"/>
656       <xsl:with-param name="type" select="$type"/>
657       <xsl:sort select="translate(&primary;, &lowercase;, &uppercase;)"/>
658   </xsl:apply-templates>
659   <xsl:text>&lt;/index&gt;&#10;</xsl:text>
660 </xsl:template>
661
662 <xsl:template match="*" mode="index-markup">
663   <xsl:param name="scope" select="."/>
664   <xsl:param name="role" select="''"/>
665   <xsl:param name="type" select="''"/>
666
667   <xsl:text>&lt;</xsl:text>
668   <xsl:value-of select="name(.)"/>
669   <xsl:text>&gt;&#10;</xsl:text>
670   <xsl:apply-templates mode="index-markup">
671     <xsl:with-param name="scope" select="$scope"/>
672     <xsl:with-param name="role" select="$role"/>
673     <xsl:with-param name="type" select="$type"/>
674   </xsl:apply-templates>
675 </xsl:template>
676
677 <xsl:template match="indexterm" mode="index-div-markup">
678   <xsl:param name="scope" select="."/>
679   <xsl:param name="role" select="''"/>
680   <xsl:param name="type" select="''"/>
681   <xsl:variable name="key" select="translate(substring(&primary;, 1, 1),&lowercase;,&uppercase;)"/>
682   <xsl:text>&#10;&lt;indexdiv&gt;&#10;</xsl:text>
683   <xsl:text>&lt;title&gt;</xsl:text>
684   <xsl:value-of select="translate($key, &lowercase;, &uppercase;)"/>
685   <xsl:text>&lt;/title&gt;&#10;</xsl:text>
686
687   <xsl:apply-templates select="key('letter', $key)[&scope;][count(.|key('primary', &primary;)[&scope;][1]) = 1]"
688                        mode="index-primary-markup">
689     <xsl:with-param name="scope" select="$scope"/>
690     <xsl:with-param name="role" select="$role"/>
691     <xsl:with-param name="type" select="$type"/>
692     <xsl:sort select="translate(&primary;, &lowercase;, &uppercase;)"/>
693   </xsl:apply-templates>
694   <xsl:text>&lt;/indexdiv&gt;&#10;</xsl:text>
695 </xsl:template>
696
697 <xsl:template match="indexterm" mode="index-symbol-div-markup">
698   <xsl:param name="scope" select="."/>
699   <xsl:param name="role" select="''"/>
700   <xsl:param name="type" select="''"/>
701   <xsl:variable name="key" select="translate(substring(&primary;, 1, 1),&lowercase;,&uppercase;)"/>
702
703   <xsl:apply-templates select="key('letter', $key)[&scope;][count(.|key('primary', &primary;)[&scope;][1]) = 1]"
704                        mode="index-primary-markup">
705     <xsl:with-param name="scope" select="$scope"/>
706     <xsl:with-param name="role" select="$role"/>
707     <xsl:with-param name="type" select="$type"/>
708     <xsl:sort select="translate(&primary;, &lowercase;, &uppercase;)"/>
709   </xsl:apply-templates>
710 </xsl:template>
711
712 <xsl:template match="indexterm" mode="index-primary-markup">
713   <xsl:param name="scope" select="."/>
714   <xsl:param name="role" select="''"/>
715   <xsl:param name="type" select="''"/>
716   <xsl:variable name="key" select="&primary;"/>
717   <xsl:variable name="refs" select="key('primary', $key)[&scope;]"/>
718   <xsl:variable name="pages" select="$refs[not(see) and not(seealso)]"/>
719
720   <xsl:text>&#10;&lt;indexentry&gt;&#10;</xsl:text>
721   <xsl:text>&lt;primaryie&gt;</xsl:text>
722   <xsl:text>&lt;phrase&gt;</xsl:text>
723   <xsl:call-template name="escape-text">
724     <xsl:with-param name="text" select="string(primary)"/>
725   </xsl:call-template>
726   <xsl:text>&lt;/phrase&gt;</xsl:text>
727   <xsl:if test="$pages">,</xsl:if>
728   <xsl:text>&#10;</xsl:text>
729
730   <xsl:for-each select="$pages">
731     <xsl:apply-templates select="." mode="reference-markup">
732       <xsl:with-param name="scope" select="$scope"/>
733       <xsl:with-param name="role" select="$role"/>
734       <xsl:with-param name="type" select="$type"/>
735     </xsl:apply-templates>
736   </xsl:for-each>
737
738   <xsl:text>&lt;/primaryie&gt;&#10;</xsl:text>
739
740   <xsl:if test="$refs/secondary or $refs[not(secondary)]/*[self::see or self::seealso]">
741     <xsl:apply-templates select="$refs[generate-id() = generate-id(key('see', concat(&primary;, &sep;, &sep;, &sep;, see))[&scope;][1])]"
742                          mode="index-see-markup">
743       <xsl:with-param name="scope" select="$scope"/>
744       <xsl:with-param name="role" select="$role"/>
745       <xsl:with-param name="type" select="$type"/>
746       <xsl:sort select="translate(see, &lowercase;, &uppercase;)"/>
747     </xsl:apply-templates>
748
749     <xsl:apply-templates select="$refs[generate-id() = generate-id(key('see-also', concat(&primary;, &sep;, &sep;, &sep;, seealso))[&scope;][1])]"
750                          mode="index-seealso-markup">
751       <xsl:with-param name="scope" select="$scope"/>
752       <xsl:with-param name="role" select="$role"/>
753       <xsl:with-param name="type" select="$type"/>
754       <xsl:sort select="translate(seealso, &lowercase;, &uppercase;)"/>
755     </xsl:apply-templates>
756
757     <xsl:apply-templates select="$refs[secondary and count(.|key('secondary', concat($key, &sep;, &secondary;))[&scope;][1]) = 1]"
758                          mode="index-secondary-markup">
759       <xsl:with-param name="scope" select="$scope"/>
760       <xsl:with-param name="role" select="$role"/>
761       <xsl:with-param name="type" select="$type"/>
762       <xsl:sort select="translate(&secondary;, &lowercase;, &uppercase;)"/>
763     </xsl:apply-templates>
764   </xsl:if>
765   <xsl:text>&lt;/indexentry&gt;&#10;</xsl:text>
766 </xsl:template>
767
768 <xsl:template match="indexterm" mode="index-secondary-markup">
769   <xsl:param name="scope" select="."/>
770   <xsl:param name="role" select="''"/>
771   <xsl:param name="type" select="''"/>
772   <xsl:variable name="key" select="concat(&primary;, &sep;, &secondary;)"/>
773   <xsl:variable name="refs" select="key('secondary', $key)[&scope;]"/>
774   <xsl:variable name="pages" select="$refs[not(see) and not(seealso)]"/>
775
776   <xsl:text>&lt;secondaryie&gt;</xsl:text>
777   <xsl:text>&lt;phrase&gt;</xsl:text>
778   <xsl:call-template name="escape-text">
779     <xsl:with-param name="text" select="string(secondary)"/>
780   </xsl:call-template>
781   <xsl:text>&lt;/phrase&gt;</xsl:text>
782   <xsl:if test="$pages">,</xsl:if>
783   <xsl:text>&#10;</xsl:text>
784
785   <xsl:for-each select="$pages">
786     <xsl:apply-templates select="." mode="reference-markup">
787       <xsl:with-param name="scope" select="$scope"/>
788       <xsl:with-param name="role" select="$role"/>
789       <xsl:with-param name="type" select="$type"/>
790     </xsl:apply-templates>
791   </xsl:for-each>
792
793   <xsl:text>&lt;/secondaryie&gt;&#10;</xsl:text>
794
795   <xsl:if test="$refs/tertiary or $refs[not(tertiary)]/*[self::see or self::seealso]">
796     <xsl:apply-templates select="$refs[generate-id() = generate-id(key('see', concat(&primary;, &sep;, &secondary;, &sep;, &sep;, see))[&scope;][1])]"
797                          mode="index-see-markup">
798       <xsl:with-param name="scope" select="$scope"/>
799       <xsl:with-param name="role" select="$role"/>
800       <xsl:with-param name="type" select="$type"/>
801       <xsl:sort select="translate(see, &lowercase;, &uppercase;)"/>
802     </xsl:apply-templates>
803     <xsl:apply-templates select="$refs[generate-id() = generate-id(key('see-also', concat(&primary;, &sep;, &secondary;, &sep;, &sep;, seealso))[&scope;][1])]"
804                          mode="index-seealso-markup">
805       <xsl:with-param name="scope" select="$scope"/>
806       <xsl:with-param name="role" select="$role"/>
807       <xsl:with-param name="type" select="$type"/>
808       <xsl:sort select="translate(seealso, &lowercase;, &uppercase;)"/>
809     </xsl:apply-templates>
810     <xsl:apply-templates select="$refs[tertiary and count(.|key('tertiary', concat($key, &sep;, &tertiary;))[&scope;][1]) = 1]"
811                          mode="index-tertiary-markup">
812       <xsl:with-param name="scope" select="$scope"/>
813       <xsl:with-param name="role" select="$role"/>
814       <xsl:with-param name="type" select="$type"/>
815       <xsl:sort select="translate(&tertiary;, &lowercase;, &uppercase;)"/>
816     </xsl:apply-templates>
817   </xsl:if>
818 </xsl:template>
819
820 <xsl:template match="indexterm" mode="index-tertiary-markup">
821   <xsl:param name="scope" select="."/>
822   <xsl:param name="role" select="''"/>
823   <xsl:param name="type" select="''"/>
824   <xsl:variable name="key" select="concat(&primary;, &sep;, &secondary;, &sep;, &tertiary;)"/>
825   <xsl:variable name="refs" select="key('tertiary', $key)[&scope;]"/>
826   <xsl:variable name="pages" select="$refs[not(see) and not(seealso)]"/>
827
828   <xsl:text>&lt;tertiaryie&gt;</xsl:text>
829   <xsl:text>&lt;phrase&gt;</xsl:text>
830   <xsl:call-template name="escape-text">
831     <xsl:with-param name="text" select="string(tertiary)"/>
832   </xsl:call-template>
833   <xsl:text>&lt;/phrase&gt;</xsl:text>
834   <xsl:if test="$pages">,</xsl:if>
835   <xsl:text>&#10;</xsl:text>
836
837   <xsl:for-each select="$pages">
838     <xsl:apply-templates select="." mode="reference-markup">
839       <xsl:with-param name="scope" select="$scope"/>
840       <xsl:with-param name="role" select="$role"/>
841       <xsl:with-param name="type" select="$type"/>
842     </xsl:apply-templates>
843   </xsl:for-each>
844
845   <xsl:text>&lt;/tertiaryie&gt;&#10;</xsl:text>
846
847   <xsl:variable name="see" select="$refs/see | $refs/seealso"/>
848   <xsl:if test="$see">
849     <xsl:apply-templates select="$refs[generate-id() = generate-id(key('see', concat(&primary;, &sep;, &secondary;, &sep;, &tertiary;, &sep;, see))[&scope;][1])]"
850                          mode="index-see-markup">
851       <xsl:with-param name="scope" select="$scope"/>
852       <xsl:with-param name="role" select="$role"/>
853       <xsl:with-param name="type" select="$type"/>
854       <xsl:sort select="translate(see, &lowercase;, &uppercase;)"/>
855     </xsl:apply-templates>
856     <xsl:apply-templates select="$refs[generate-id() = generate-id(key('see-also', concat(&primary;, &sep;, &secondary;, &sep;, &tertiary;, &sep;, seealso))[&scope;][1])]"
857                          mode="index-seealso-markup">
858       <xsl:with-param name="scope" select="$scope"/>
859       <xsl:with-param name="role" select="$role"/>
860       <xsl:with-param name="type" select="$type"/>
861       <xsl:sort select="translate(seealso, &lowercase;, &uppercase;)"/>
862     </xsl:apply-templates>
863   </xsl:if>
864 </xsl:template>
865
866 <xsl:template match="indexterm" mode="reference-markup">
867   <xsl:param name="scope" select="."/>
868   <xsl:param name="role" select="''"/>
869   <xsl:param name="type" select="''"/>
870
871   <xsl:choose>
872     <xsl:when test="@zone and string(@zone)">
873       <xsl:call-template name="reference-markup">
874         <xsl:with-param name="zones" select="normalize-space(@zone)"/>
875         <xsl:with-param name="scope" select="$scope"/>
876         <xsl:with-param name="role" select="$role"/>
877         <xsl:with-param name="type" select="$type"/>
878       </xsl:call-template>
879     </xsl:when>
880     <xsl:otherwise>
881       <xsl:variable name="id">
882         <xsl:call-template name="object.id"/>
883       </xsl:variable>
884
885
886       <xsl:choose>
887         <xsl:when test="@startref and @class='endofrange'">
888           <xsl:text>&lt;phrase role="pageno"&gt;</xsl:text>
889           <xsl:text>&lt;link linkend="</xsl:text>
890           <xsl:value-of select="@startref"/>
891           <xsl:text>"&gt;</xsl:text>
892           <fo:basic-link internal-destination="{@startref}">
893             <fo:page-number-citation ref-id="{@startref}"/>
894             <xsl:text>-</xsl:text>
895             <fo:page-number-citation ref-id="{$id}"/>
896           </fo:basic-link>
897           <xsl:text>&lt;/link&gt;</xsl:text>
898           <xsl:text>&lt;/phrase&gt;&#10;</xsl:text>
899         </xsl:when>
900         <xsl:otherwise>
901           <xsl:text>&lt;phrase role="pageno"&gt;</xsl:text>
902           <xsl:if test="@id">
903             <xsl:text>&lt;link linkend="</xsl:text>
904             <xsl:value-of select="$id"/>
905             <xsl:text>"&gt;</xsl:text>
906           </xsl:if>
907           <fo:basic-link internal-destination="{$id}">
908             <fo:page-number-citation ref-id="{$id}"/>
909           </fo:basic-link>
910           <xsl:if test="@id">
911             <xsl:text>&lt;/link&gt;</xsl:text>
912           </xsl:if>
913           <xsl:text>&lt;/phrase&gt;&#10;</xsl:text>
914         </xsl:otherwise>
915       </xsl:choose>
916     </xsl:otherwise>
917   </xsl:choose>
918 </xsl:template>
919
920 <xsl:template name="reference-markup">
921   <xsl:param name="scope" select="."/>
922   <xsl:param name="role" select="''"/>
923   <xsl:param name="type" select="''"/>
924   <xsl:param name="zones"/>
925   <xsl:choose>
926     <xsl:when test="contains($zones, ' ')">
927       <xsl:variable name="zone" select="substring-before($zones, ' ')"/>
928       <xsl:variable name="target" select="key('id', $zone)[&scope;]"/>
929
930       <xsl:variable name="id">
931         <xsl:call-template name="object.id">
932           <xsl:with-param name="object" select="$target[1]"/>
933         </xsl:call-template>
934       </xsl:variable>
935
936       <xsl:text>&lt;phrase fole="pageno"&gt;</xsl:text>
937       <xsl:if test="$target[1]/@id">
938         <xsl:text>&lt;link linkend="</xsl:text>
939         <xsl:value-of select="$id"/>
940         <xsl:text>"&gt;</xsl:text>
941       </xsl:if>
942       <fo:basic-link internal-destination="{$id}">
943         <fo:page-number-citation ref-id="{$id}"/>
944       </fo:basic-link>
945       <xsl:if test="$target[1]/@id">
946         <xsl:text>&lt;/link&gt;</xsl:text>
947       </xsl:if>
948       <xsl:text>&lt;/phrase&gt;&#10;</xsl:text>
949
950       <xsl:call-template name="reference">
951         <xsl:with-param name="zones" select="substring-after($zones, ' ')"/>
952         <xsl:with-param name="scope" select="$scope"/>
953         <xsl:with-param name="role" select="$role"/>
954         <xsl:with-param name="type" select="$type"/>
955       </xsl:call-template>
956     </xsl:when>
957     <xsl:otherwise>
958       <xsl:variable name="zone" select="$zones"/>
959       <xsl:variable name="target" select="key('id', $zone)[&scope;]"/>
960
961       <xsl:variable name="id">
962         <xsl:call-template name="object.id">
963           <xsl:with-param name="object" select="$target[1]"/>
964         </xsl:call-template>
965       </xsl:variable>
966
967       <xsl:text>&lt;phrase role="pageno"&gt;</xsl:text>
968       <xsl:if test="$target[1]/@id">
969         <xsl:text>&lt;link linkend="</xsl:text>
970         <xsl:value-of select="$id"/>
971         <xsl:text>"&gt;</xsl:text>
972       </xsl:if>
973       <fo:basic-link internal-destination="{$id}">
974         <fo:page-number-citation ref-id="{$id}"/>
975       </fo:basic-link>
976       <xsl:if test="$target[1]/@id">
977         <xsl:text>&lt;/link&gt;</xsl:text>
978       </xsl:if>
979       <xsl:text>&lt;/phrase&gt;&#10;</xsl:text>
980     </xsl:otherwise>
981   </xsl:choose>
982 </xsl:template>
983
984 <xsl:template match="indexterm" mode="index-see-markup">
985   <xsl:param name="scope" select="."/>
986   <xsl:param name="role" select="''"/>
987   <xsl:param name="type" select="''"/>
988   <fo:block>
989     <xsl:text>&lt;seeie&gt;</xsl:text>
990     <xsl:text>&lt;phrase&gt;</xsl:text>
991     <xsl:call-template name="escape-text">
992       <xsl:with-param name="text" select="string(see)"/>
993     </xsl:call-template>
994     <xsl:text>&lt;/phrase&gt;</xsl:text>
995     <xsl:text>&lt;/seeie&gt;&#10;</xsl:text>
996   </fo:block>
997 </xsl:template>
998
999 <xsl:template match="indexterm" mode="index-seealso-markup">
1000   <xsl:param name="scope" select="."/>
1001   <xsl:param name="role" select="''"/>
1002   <xsl:param name="type" select="''"/>
1003   <fo:block>
1004     <xsl:text>&lt;seealsoie&gt;</xsl:text>
1005     <xsl:text>&lt;phrase&gt;</xsl:text>
1006     <xsl:call-template name="escape-text">
1007       <xsl:with-param name="text" select="string(seealso)"/>
1008     </xsl:call-template>
1009     <xsl:text>&lt;/phrase&gt;</xsl:text>
1010     <xsl:text>&lt;/seealsoie&gt;&#10;</xsl:text>
1011   </fo:block>
1012 </xsl:template>
1013
1014 <xsl:template name="escape-text">
1015   <xsl:param name="text" select="''"/>
1016
1017   <xsl:variable name="ltpos" select="substring-before($text, '&lt;')"/>
1018   <xsl:variable name="amppos" select="substring-before($text, '&amp;')"/>
1019
1020   <xsl:choose>
1021     <xsl:when test="contains($text,'&lt;') and contains($text, '&amp;')
1022                     and string-length($ltpos) &lt; string-length($amppos)">
1023       <xsl:value-of select="$ltpos"/>
1024       <xsl:text>&amp;lt;</xsl:text>
1025       <xsl:call-template name="escape-text">
1026         <xsl:with-param name="text" select="substring-after($text, '&lt;')"/>
1027       </xsl:call-template>
1028     </xsl:when>
1029
1030     <xsl:when test="contains($text,'&lt;') and contains($text, '&amp;')
1031                     and string-length($amppos) &lt; string-length($ltpos)">
1032       <xsl:value-of select="$amppos"/>
1033       <xsl:text>&amp;amp;</xsl:text>
1034       <xsl:call-template name="escape-text">
1035         <xsl:with-param name="text" select="substring-after($text, '&amp;')"/>
1036       </xsl:call-template>
1037     </xsl:when>
1038
1039     <xsl:when test="contains($text, '&lt;')">
1040       <xsl:value-of select="$ltpos"/>
1041       <xsl:text>&amp;lt;</xsl:text>
1042       <xsl:call-template name="escape-text">
1043         <xsl:with-param name="text" select="substring-after($text, '&lt;')"/>
1044       </xsl:call-template>
1045     </xsl:when>
1046
1047     <xsl:when test="contains($text, '&amp;')">
1048       <xsl:value-of select="$amppos"/>
1049       <xsl:text>&amp;amp;</xsl:text>
1050       <xsl:call-template name="escape-text">
1051         <xsl:with-param name="text" select="substring-after($text, '&amp;')"/>
1052       </xsl:call-template>
1053     </xsl:when>
1054
1055     <xsl:otherwise>
1056       <xsl:value-of select="$text"/>
1057     </xsl:otherwise>
1058   </xsl:choose>
1059 </xsl:template>
1060
1061 </xsl:stylesheet>
Note: See TracBrowser for help on using the browser.