source: clfs-sysroot/BOOK/stylesheets/lfs-xsl/docbook-xsl-snapshot/fo/autoidx.xsl @ a18aefd

Last change on this file since a18aefd was a18aefd, checked in by Manuel Canales Esparcia <manuel@…>, 17 years ago

Added lfs-xsl stylesheets.

  • Property mode set to 100644
File size: 52.1 KB
Line 
1<?xml version="1.0"?>
2<!DOCTYPE xsl:stylesheet [
3<!ENTITY % common.entities SYSTEM "../common/entities.ent">
4%common.entities;
5]>
6<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
7                xmlns:fo="http://www.w3.org/1999/XSL/Format"
8                xmlns:rx="http://www.renderx.com/XSL/Extensions"
9                xmlns:axf="http://www.antennahouse.com/names/XSL/Extensions"
10                xmlns:exslt="http://exslt.org/common"
11                extension-element-prefixes="exslt"
12                exclude-result-prefixes="exslt"
13                version="1.0">
14
15<!-- ********************************************************************
16     $Id$
17     ********************************************************************
18
19     This file is part of the DocBook XSL Stylesheet distribution.
20     See ../README or http://docbook.sf.net/ for copyright
21     copyright and other information.
22
23     ******************************************************************** -->
24
25<!-- ==================================================================== -->
26<!-- The "basic" method derived from Jeni Tennison's work. -->
27<!-- The "kosek" method contributed by Jirka Kosek. -->
28<!-- The "kimber" method contributed by Eliot Kimber of Innodata Isogen. -->
29
30<!-- Importing module for kimber or kosek method overrides one of these -->
31<xsl:param name="kimber.imported" select="0"/>
32<xsl:param name="kosek.imported" select="0"/>
33
34<!-- These keys used primary in all methods -->
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;,
58                     &secondary;, &sep;,
59                     &tertiary;, &sep;, seealso)"/>
60
61<xsl:key name="see"
62         match="indexterm[see]"
63         use="concat(&primary;, &sep;,
64                     &secondary;, &sep;,
65                     &tertiary;, &sep;, see)"/>
66
67
68<xsl:template name="generate-index">
69  <xsl:param name="scope" select="(ancestor::book|/)[last()]"/>
70
71  <xsl:choose>
72    <xsl:when test="$index.method = 'kosek'">
73      <xsl:call-template name="generate-kosek-index">
74        <xsl:with-param name="scope" select="$scope"/>
75      </xsl:call-template>
76    </xsl:when>
77    <xsl:when test="$index.method = 'kimber'">
78      <xsl:call-template name="generate-kimber-index">
79        <xsl:with-param name="scope" select="$scope"/>
80      </xsl:call-template>
81    </xsl:when>
82
83    <xsl:otherwise>
84      <xsl:call-template name="generate-basic-index">
85        <xsl:with-param name="scope" select="$scope"/>
86      </xsl:call-template>
87    </xsl:otherwise>
88  </xsl:choose>
89</xsl:template>
90     
91<xsl:template name="generate-basic-index">
92  <xsl:param name="scope" select="NOTANODE"/>
93
94  <xsl:variable name="role">
95    <xsl:if test="$index.on.role != 0">
96      <xsl:value-of select="@role"/>
97    </xsl:if>
98  </xsl:variable>
99
100  <xsl:variable name="type">
101    <xsl:if test="$index.on.type != 0">
102      <xsl:value-of select="@type"/>
103    </xsl:if>
104  </xsl:variable>
105
106  <xsl:variable name="terms"
107                select="//indexterm
108                        [count(.|key('letter',
109                          translate(substring(&primary;, 1, 1),
110                             &lowercase;,
111                             &uppercase;))
112                          [&scope;][1]) = 1
113                          and not(@class = 'endofrange')]"/>
114
115  <xsl:variable name="alphabetical"
116                select="$terms[contains(concat(&lowercase;, &uppercase;),
117                                        substring(&primary;, 1, 1))]"/>
118
119  <xsl:variable name="others" select="$terms[not(contains(
120                                        concat(&lowercase;,
121                                        &uppercase;),
122                                        substring(&primary;, 1, 1)))]"/>
123  <fo:block>
124    <xsl:if test="$others">
125      <xsl:call-template name="indexdiv.title">
126        <xsl:with-param name="titlecontent">
127          <xsl:call-template name="gentext">
128            <xsl:with-param name="key" select="'index symbols'"/>
129          </xsl:call-template>
130        </xsl:with-param>
131      </xsl:call-template>
132
133      <fo:block>
134        <xsl:apply-templates select="$others[count(.|key('primary',
135                                     &primary;)[&scope;][1]) = 1]"
136                             mode="index-symbol-div">
137          <xsl:with-param name="scope" select="$scope"/>
138          <xsl:with-param name="role" select="$role"/>
139          <xsl:with-param name="type" select="$type"/>
140          <xsl:sort select="translate(&primary;, &lowercase;,
141                            &uppercase;)"/>
142        </xsl:apply-templates>
143      </fo:block>
144    </xsl:if>
145
146    <xsl:apply-templates select="$alphabetical[count(.|key('letter',
147                                 translate(substring(&primary;, 1, 1),
148                                           &lowercase;,&uppercase;))
149                                           [&scope;][1]) = 1]"
150                         mode="index-div-basic">
151      <xsl:with-param name="scope" select="$scope"/>
152      <xsl:with-param name="role" select="$role"/>
153      <xsl:with-param name="type" select="$type"/>
154      <xsl:sort select="translate(&primary;, &lowercase;, &uppercase;)"/>
155    </xsl:apply-templates>
156  </fo:block>
157</xsl:template>
158
159<!-- This template not used if fo/autoidx-kosek.xsl is imported -->
160<xsl:template name="generate-kosek-index">
161  <xsl:param name="scope" select="NOTANODE"/>
162
163  <xsl:variable name="vendor" select="system-property('xsl:vendor')"/>
164  <xsl:if test="contains($vendor, 'libxslt')">
165    <xsl:message terminate="yes">
166      <xsl:text>ERROR: the 'kosek' index method does not </xsl:text>
167      <xsl:text>work with the xsltproc XSLT processor.</xsl:text>
168    </xsl:message>
169  </xsl:if>
170
171
172  <xsl:if test="not(function-available('exslt:node-set') or
173                    function-available('exslt:nodeSet'))">
174    <xsl:message terminate="yes">
175      <xsl:text>ERROR: the 'kosek' index method requires the </xsl:text>
176      <xsl:text>exslt:node-set() function. Use a processor that </xsl:text>
177      <xsl:text>has it, or use a different index method.</xsl:text>
178    </xsl:message>
179  </xsl:if>
180
181  <xsl:if test="$kosek.imported = 0">
182    <xsl:message terminate="yes">
183      <xsl:text>ERROR: the 'kosek' index method requires the&#xA;</xsl:text>
184      <xsl:text>kosek index extensions be imported:&#xA;</xsl:text>
185      <xsl:text>  xsl:import href="fo/autoidx-kosek.xsl"</xsl:text>
186    </xsl:message>
187  </xsl:if>
188
189</xsl:template>
190
191
192<!-- This template not used if fo/autoidx-kimber.xsl is imported -->
193<xsl:template name="generate-kimber-index">
194  <xsl:param name="scope" select="NOTANODE"/>
195
196  <xsl:variable name="vendor" select="system-property('xsl:vendor')"/>
197  <xsl:if test="not(contains($vendor, 'SAXON '))">
198    <xsl:message terminate="yes">
199      <xsl:text>ERROR: the 'kimber' index method requires the </xsl:text>
200      <xsl:text>Saxon version 6 or 8 XSLT processor.</xsl:text>
201    </xsl:message>
202  </xsl:if>
203
204  <xsl:if test="$kimber.imported = 0">
205    <xsl:message terminate="yes">
206      <xsl:text>ERROR: the 'kimber' index method requires the&#xA;</xsl:text>
207      <xsl:text>kimber index extensions be imported:&#xA;</xsl:text>
208      <xsl:text>  xsl:import href="fo/autoidx-kimber.xsl"</xsl:text>
209    </xsl:message>
210  </xsl:if>
211
212</xsl:template>
213
214<xsl:template match="indexterm" mode="index-div-basic">
215  <xsl:param name="scope" select="."/>
216  <xsl:param name="role" select="''"/>
217  <xsl:param name="type" select="''"/>
218
219  <xsl:variable name="key"
220                select="translate(substring(&primary;, 1, 1),
221                         &lowercase;,&uppercase;)"/>
222
223  <xsl:if test="key('letter', $key)[&scope;]
224                [count(.|key('primary', &primary;)[&scope;][1]) = 1]">
225    <fo:block>
226      <xsl:if test="contains(concat(&lowercase;, &uppercase;), $key)">
227        <xsl:call-template name="indexdiv.title">
228          <xsl:with-param name="titlecontent">
229            <xsl:value-of select="translate($key, &lowercase;, &uppercase;)"/>
230          </xsl:with-param>
231        </xsl:call-template>
232      </xsl:if>
233      <fo:block xsl:use-attribute-sets="index.entry.properties">
234        <xsl:apply-templates select="key('letter', $key)[&scope;]
235                                     [count(.|key('primary', &primary;)
236                                     [&scope;][1])=1]"
237                             mode="index-primary">
238          <xsl:sort select="translate(&primary;, &lowercase;, &uppercase;)"/>
239          <xsl:with-param name="scope" select="$scope"/>
240          <xsl:with-param name="role" select="$role"/>
241          <xsl:with-param name="type" select="$type"/>
242        </xsl:apply-templates>
243      </fo:block>
244    </fo:block>
245  </xsl:if>
246</xsl:template>
247
248<xsl:template match="indexterm" mode="index-symbol-div">
249  <xsl:param name="scope" select="."/>
250  <xsl:param name="role" select="''"/>
251  <xsl:param name="type" select="''"/>
252
253  <xsl:variable name="key"
254                select="translate(substring(&primary;, 1, 1),&lowercase;,&uppercase;)"/>
255
256  <fo:block xsl:use-attribute-sets="index.entry.properties">
257    <xsl:apply-templates select="key('letter', $key)[&scope;][count(.|key('primary', &primary;)[&scope;][1]) = 1]"
258                         mode="index-primary">
259      <xsl:with-param name="scope" select="$scope"/>
260      <xsl:with-param name="role" select="$role"/>
261      <xsl:with-param name="type" select="$type"/>
262      <xsl:sort select="translate(&primary;, &lowercase;, &uppercase;)"/>
263    </xsl:apply-templates>
264  </fo:block>
265</xsl:template>
266
267<xsl:template match="indexterm" mode="index-primary">
268  <xsl:param name="scope" select="."/>
269  <xsl:param name="role" select="''"/>
270  <xsl:param name="type" select="''"/>
271
272  <xsl:variable name="key" select="&primary;"/>
273  <xsl:variable name="refs" select="key('primary', $key)[&scope;]"/>
274
275  <xsl:variable name="term.separator">
276    <xsl:call-template name="index.separator">
277      <xsl:with-param name="key" select="'index.term.separator'"/>
278    </xsl:call-template>
279  </xsl:variable>
280
281  <xsl:variable name="range.separator">
282    <xsl:call-template name="index.separator">
283      <xsl:with-param name="key" select="'index.range.separator'"/>
284    </xsl:call-template>
285  </xsl:variable>
286
287  <xsl:variable name="number.separator">
288    <xsl:call-template name="index.separator">
289      <xsl:with-param name="key" select="'index.number.separator'"/>
290    </xsl:call-template>
291  </xsl:variable>
292
293  <fo:block>
294    <xsl:if test="$axf.extensions != 0">
295      <xsl:attribute name="axf:suppress-duplicate-page-number">true</xsl:attribute>
296    </xsl:if>
297    <xsl:value-of select="primary"/>
298
299    <xsl:choose>
300      <xsl:when test="$xep.extensions != 0">
301        <xsl:if test="$refs[not(see) and not(secondary)]">
302          <xsl:copy-of select="$term.separator"/>
303          <xsl:variable name="primary" select="&primary;"/>
304          <xsl:variable name="primary.significant" select="concat(&primary;, $significant.flag)"/>
305          <rx:page-index list-separator="{$number.separator}"
306                         range-separator="{$range.separator}">
307            <xsl:if test="$refs[@significance='preferred'][not(see) and not(secondary)]">
308              <rx:index-item xsl:use-attribute-sets="index.preferred.page.properties xep.index.item.properties"
309                ref-key="{$primary.significant}"/>
310            </xsl:if>
311            <xsl:if test="$refs[not(@significance) or @significance!='preferred'][not(see) and not(secondary)]">
312              <rx:index-item xsl:use-attribute-sets="xep.index.item.properties"
313                ref-key="{$primary}"/>
314            </xsl:if>
315          </rx:page-index>       
316        </xsl:if>
317      </xsl:when>
318      <xsl:otherwise>
319        <xsl:variable name="page-number-citations">
320          <xsl:for-each select="$refs[not(see)
321                                and not(secondary)]">
322            <xsl:apply-templates select="." mode="reference">
323              <xsl:with-param name="scope" select="$scope"/>
324              <xsl:with-param name="role" select="$role"/>
325              <xsl:with-param name="type" select="$type"/>
326              <xsl:with-param name="position" select="position()"/>
327            </xsl:apply-templates>
328          </xsl:for-each>
329        </xsl:variable>
330
331        <xsl:choose>
332          <xsl:when test="$passivetex.extensions != '0'">
333            <fotex:sort xmlns:fotex="http://www.tug.org/fotex">
334              <xsl:copy-of select="$page-number-citations"/>
335            </fotex:sort>
336          </xsl:when>
337          <xsl:otherwise>
338            <xsl:copy-of select="$page-number-citations"/>
339          </xsl:otherwise>
340        </xsl:choose>
341      </xsl:otherwise>
342    </xsl:choose>
343
344    <xsl:if test="$refs[not(secondary)]/*[self::see]">
345      <xsl:apply-templates select="$refs[generate-id() = generate-id(key('see', concat(&primary;, &sep;, &sep;, &sep;, see))[&scope;][1])]"
346                           mode="index-see">
347         <xsl:with-param name="scope" select="$scope"/>
348         <xsl:with-param name="role" select="$role"/>
349         <xsl:with-param name="type" select="$type"/>
350         <xsl:sort select="translate(see, &lowercase;, &uppercase;)"/>
351      </xsl:apply-templates>
352    </xsl:if>
353
354  </fo:block>
355
356  <xsl:if test="$refs/secondary or $refs[not(secondary)]/*[self::seealso]">
357    <fo:block start-indent="1pc">
358      <xsl:apply-templates select="$refs[generate-id() = generate-id(key('see-also', concat(&primary;, &sep;, &sep;, &sep;, seealso))[&scope;][1])]"
359                           mode="index-seealso">
360         <xsl:with-param name="scope" select="$scope"/>
361         <xsl:with-param name="role" select="$role"/>
362         <xsl:with-param name="type" select="$type"/>
363         <xsl:sort select="translate(seealso, &lowercase;, &uppercase;)"/>
364      </xsl:apply-templates>
365      <xsl:apply-templates select="$refs[secondary and count(.|key('secondary', concat($key, &sep;, &secondary;))[&scope;][1]) = 1]"
366                           mode="index-secondary">
367       <xsl:with-param name="scope" select="$scope"/>
368       <xsl:with-param name="role" select="$role"/>
369       <xsl:with-param name="type" select="$type"/>
370       <xsl:sort select="translate(&secondary;, &lowercase;, &uppercase;)"/>
371      </xsl:apply-templates>
372    </fo:block>
373  </xsl:if>
374</xsl:template>
375
376<xsl:template match="indexterm" mode="index-secondary">
377  <xsl:param name="scope" select="."/>
378  <xsl:param name="role" select="''"/>
379  <xsl:param name="type" select="''"/>
380
381  <xsl:variable name="key" select="concat(&primary;, &sep;, &secondary;)"/>
382  <xsl:variable name="refs" select="key('secondary', $key)[&scope;]"/>
383
384  <xsl:variable name="term.separator">
385    <xsl:call-template name="index.separator">
386      <xsl:with-param name="key" select="'index.term.separator'"/>
387    </xsl:call-template>
388  </xsl:variable>
389
390  <xsl:variable name="range.separator">
391    <xsl:call-template name="index.separator">
392      <xsl:with-param name="key" select="'index.range.separator'"/>
393    </xsl:call-template>
394  </xsl:variable>
395
396  <xsl:variable name="number.separator">
397    <xsl:call-template name="index.separator">
398      <xsl:with-param name="key" select="'index.number.separator'"/>
399    </xsl:call-template>
400  </xsl:variable>
401
402  <fo:block>
403    <xsl:if test="$axf.extensions != 0">
404      <xsl:attribute name="axf:suppress-duplicate-page-number">true</xsl:attribute>
405    </xsl:if>
406    <xsl:value-of select="secondary"/>
407
408    <xsl:choose>
409      <xsl:when test="$xep.extensions != 0">
410        <xsl:if test="$refs[not(see) and not(tertiary)]">
411          <xsl:copy-of select="$term.separator"/>
412          <xsl:variable name="primary" select="&primary;"/>
413          <xsl:variable name="secondary" select="&secondary;"/>
414          <xsl:variable name="primary.significant" select="concat(&primary;, $significant.flag)"/>
415          <rx:page-index list-separator="{$number.separator}"
416                         range-separator="{$range.separator}">
417            <xsl:if test="$refs[@significance='preferred'][not(see) and not(tertiary)]">
418              <rx:index-item xsl:use-attribute-sets="index.preferred.page.properties xep.index.item.properties">
419                <xsl:attribute name="ref-key">
420                  <xsl:value-of select="$primary.significant"/>
421                  <xsl:text>, </xsl:text>
422                  <xsl:value-of select="$secondary"/>
423                </xsl:attribute>
424              </rx:index-item>
425            </xsl:if>
426            <xsl:if test="$refs[not(@significance) or @significance!='preferred'][not(see) and not(tertiary)]">
427              <rx:index-item xsl:use-attribute-sets="xep.index.item.properties">
428                <xsl:attribute name="ref-key">
429                  <xsl:value-of select="$primary"/>
430                  <xsl:text>, </xsl:text>
431                  <xsl:value-of select="$secondary"/>
432                </xsl:attribute>
433              </rx:index-item>
434            </xsl:if>
435          </rx:page-index>
436        </xsl:if>
437      </xsl:when>
438      <xsl:otherwise>
439        <xsl:variable name="page-number-citations">
440          <xsl:for-each select="$refs[not(see)
441                                and not(tertiary)]">
442            <xsl:apply-templates select="." mode="reference">
443              <xsl:with-param name="scope" select="$scope"/>
444              <xsl:with-param name="role" select="$role"/>
445              <xsl:with-param name="type" select="$type"/>
446              <xsl:with-param name="position" select="position()"/>
447            </xsl:apply-templates>
448          </xsl:for-each>
449        </xsl:variable>
450
451        <xsl:choose>
452          <xsl:when test="$passivetex.extensions != '0'">
453            <fotex:sort xmlns:fotex="http://www.tug.org/fotex">
454              <xsl:copy-of select="$page-number-citations"/>
455            </fotex:sort>
456          </xsl:when>
457          <xsl:otherwise>
458            <xsl:copy-of select="$page-number-citations"/>
459          </xsl:otherwise>
460        </xsl:choose>
461      </xsl:otherwise>
462    </xsl:choose>
463
464    <xsl:if test="$refs[not(tertiary)]/*[self::see]">
465      <xsl:apply-templates select="$refs[generate-id() = generate-id(key('see', concat(&primary;, &sep;, &secondary;, &sep;, &sep;, see))[&scope;][1])]"
466                           mode="index-see">
467        <xsl:with-param name="scope" select="$scope"/>
468        <xsl:with-param name="role" select="$role"/>
469        <xsl:with-param name="type" select="$type"/>
470        <xsl:sort select="translate(see, &lowercase;, &uppercase;)"/>
471      </xsl:apply-templates>
472    </xsl:if>
473
474  </fo:block>
475
476  <xsl:if test="$refs/tertiary or $refs[not(tertiary)]/*[self::seealso]">
477    <fo:block start-indent="2pc">
478      <xsl:apply-templates select="$refs[generate-id() = generate-id(key('see-also', concat(&primary;, &sep;, &secondary;, &sep;, &sep;, seealso))[&scope;][1])]"
479                           mode="index-seealso">
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:sort select="translate(seealso, &lowercase;, &uppercase;)"/>
484      </xsl:apply-templates>
485      <xsl:apply-templates select="$refs[tertiary and count(.|key('tertiary', concat($key, &sep;, &tertiary;))[&scope;][1]) = 1]" 
486                           mode="index-tertiary">
487          <xsl:with-param name="scope" select="$scope"/>
488          <xsl:with-param name="role" select="$role"/>
489          <xsl:with-param name="type" select="$type"/>
490          <xsl:sort select="translate(&tertiary;, &lowercase;, &uppercase;)"/>
491      </xsl:apply-templates>
492    </fo:block>
493  </xsl:if>
494</xsl:template>
495
496<xsl:template match="indexterm" mode="index-tertiary">
497  <xsl:param name="scope" select="."/>
498  <xsl:param name="role" select="''"/>
499  <xsl:param name="type" select="''"/>
500  <xsl:variable name="key" select="concat(&primary;, &sep;, &secondary;, &sep;, &tertiary;)"/>
501  <xsl:variable name="refs" select="key('tertiary', $key)[&scope;]"/>
502
503  <xsl:variable name="term.separator">
504    <xsl:call-template name="index.separator">
505      <xsl:with-param name="key" select="'index.term.separator'"/>
506    </xsl:call-template>
507  </xsl:variable>
508
509  <xsl:variable name="range.separator">
510    <xsl:call-template name="index.separator">
511      <xsl:with-param name="key" select="'index.range.separator'"/>
512    </xsl:call-template>
513  </xsl:variable>
514
515  <xsl:variable name="number.separator">
516    <xsl:call-template name="index.separator">
517      <xsl:with-param name="key" select="'index.number.separator'"/>
518    </xsl:call-template>
519  </xsl:variable>
520
521  <fo:block>
522    <xsl:if test="$axf.extensions != 0">
523      <xsl:attribute name="axf:suppress-duplicate-page-number">true</xsl:attribute>
524    </xsl:if>
525    <xsl:value-of select="tertiary"/>
526
527    <xsl:choose>
528      <xsl:when test="$xep.extensions != 0">
529        <xsl:if test="$refs[not(see)]">
530          <xsl:copy-of select="$term.separator"/>
531          <xsl:variable name="primary" select="&primary;"/>
532          <xsl:variable name="secondary" select="&secondary;"/>
533          <xsl:variable name="tertiary" select="&tertiary;"/>
534          <xsl:variable name="primary.significant" select="concat(&primary;, $significant.flag)"/>
535          <rx:page-index list-separator="{$number.separator}"
536                         range-separator="{$range.separator}">
537            <xsl:if test="$refs[@significance='preferred'][not(see)]">
538              <rx:index-item xsl:use-attribute-sets="index.preferred.page.properties xep.index.item.properties">
539                <xsl:attribute name="ref-key">
540                  <xsl:value-of select="$primary.significant"/>
541                  <xsl:text>, </xsl:text>
542                  <xsl:value-of select="$secondary"/>
543                  <xsl:text>, </xsl:text>
544                  <xsl:value-of select="$tertiary"/>
545                </xsl:attribute>
546              </rx:index-item>
547            </xsl:if>
548            <xsl:if test="$refs[not(@significance) or @significance!='preferred'][not(see)]">
549              <rx:index-item xsl:use-attribute-sets="xep.index.item.properties">
550                <xsl:attribute name="ref-key">
551                  <xsl:value-of select="$primary"/>
552                  <xsl:text>, </xsl:text>
553                  <xsl:value-of select="$secondary"/>
554                  <xsl:text>, </xsl:text>
555                  <xsl:value-of select="$tertiary"/>
556                </xsl:attribute>
557              </rx:index-item>
558            </xsl:if>
559          </rx:page-index>
560        </xsl:if>
561      </xsl:when>
562      <xsl:otherwise>
563        <xsl:variable name="page-number-citations">
564          <xsl:for-each select="$refs[not(see)]">
565            <xsl:apply-templates select="." mode="reference">
566              <xsl:with-param name="scope" select="$scope"/>
567              <xsl:with-param name="role" select="$role"/>
568              <xsl:with-param name="type" select="$type"/>
569              <xsl:with-param name="position" select="position()"/>
570            </xsl:apply-templates>
571          </xsl:for-each>
572        </xsl:variable>
573
574        <xsl:choose>
575          <xsl:when test="$passivetex.extensions != '0'">
576            <fotex:sort xmlns:fotex="http://www.tug.org/fotex">
577              <xsl:copy-of select="$page-number-citations"/>
578            </fotex:sort>
579          </xsl:when>
580          <xsl:otherwise>
581            <xsl:copy-of select="$page-number-citations"/>
582          </xsl:otherwise>
583        </xsl:choose>
584      </xsl:otherwise>
585    </xsl:choose>
586
587    <xsl:if test="$refs/see">
588      <xsl:apply-templates select="$refs[generate-id() = generate-id(key('see', concat(&primary;, &sep;, &secondary;, &sep;, &tertiary;, &sep;, see))[&scope;][1])]"
589                           mode="index-see">
590        <xsl:with-param name="scope" select="$scope"/>
591        <xsl:with-param name="role" select="$role"/>
592        <xsl:with-param name="type" select="$type"/>
593        <xsl:sort select="translate(see, &lowercase;, &uppercase;)"/>
594      </xsl:apply-templates>
595    </xsl:if>
596
597  </fo:block>
598
599  <xsl:if test="$refs/seealso">
600    <fo:block>
601      <xsl:apply-templates select="$refs[generate-id() = generate-id(key('see-also', concat(&primary;, &sep;, &secondary;, &sep;, &tertiary;, &sep;, seealso))[&scope;][1])]"
602                           mode="index-seealso">
603        <xsl:with-param name="scope" select="$scope"/>
604        <xsl:with-param name="role" select="$role"/>
605        <xsl:with-param name="type" select="$type"/>
606        <xsl:sort select="translate(seealso, &lowercase;, &uppercase;)"/>
607      </xsl:apply-templates>
608    </fo:block>
609  </xsl:if>
610</xsl:template>
611
612<xsl:template match="indexterm" mode="reference">
613  <xsl:param name="scope" select="."/>
614  <xsl:param name="role" select="''"/>
615  <xsl:param name="type" select="''"/>
616  <xsl:param name="position" select="0"/>
617  <xsl:param name="separator" select="''"/>
618
619  <xsl:variable name="term.separator">
620    <xsl:call-template name="index.separator">
621      <xsl:with-param name="key" select="'index.term.separator'"/>
622    </xsl:call-template>
623  </xsl:variable>
624
625  <xsl:variable name="range.separator">
626    <xsl:call-template name="index.separator">
627      <xsl:with-param name="key" select="'index.range.separator'"/>
628    </xsl:call-template>
629  </xsl:variable>
630
631  <xsl:variable name="number.separator">
632    <xsl:call-template name="index.separator">
633      <xsl:with-param name="key" select="'index.number.separator'"/>
634    </xsl:call-template>
635  </xsl:variable>
636
637  <xsl:choose>
638    <xsl:when test="$separator != ''">
639      <xsl:value-of select="$separator"/>
640    </xsl:when>
641    <xsl:when test="$position = 1">
642      <xsl:value-of select="$term.separator"/>
643    </xsl:when>
644    <xsl:otherwise>
645      <xsl:value-of select="$number.separator"/>
646    </xsl:otherwise>
647  </xsl:choose>
648
649  <xsl:choose>
650    <xsl:when test="@zone and string(@zone)">
651      <xsl:call-template name="reference">
652        <xsl:with-param name="zones" select="normalize-space(@zone)"/>
653        <xsl:with-param name="scope" select="$scope"/>
654        <xsl:with-param name="role" select="$role"/>
655        <xsl:with-param name="type" select="$type"/>
656      </xsl:call-template>
657    </xsl:when>
658    <xsl:when test="ancestor::*[contains(local-name(),'info') and not(starts-with(local-name(),'info'))]">
659      <xsl:call-template name="info.reference">
660        <xsl:with-param name="scope" select="$scope"/>
661        <xsl:with-param name="role" select="$role"/>
662        <xsl:with-param name="type" select="$type"/>
663      </xsl:call-template>
664    </xsl:when>
665    <xsl:otherwise>
666      <xsl:variable name="id">
667        <xsl:call-template name="object.id"/>
668      </xsl:variable>
669
670      <fo:basic-link internal-destination="{$id}"
671                     xsl:use-attribute-sets="index.page.number.properties">
672        <fo:page-number-citation ref-id="{$id}"/>
673      </fo:basic-link>
674
675      <xsl:if test="key('endofrange', $id)[&scope;]">
676        <xsl:apply-templates select="key('endofrange', $id)[&scope;][last()]"
677                             mode="reference">
678          <xsl:with-param name="scope" select="$scope"/>
679          <xsl:with-param name="role" select="$role"/>
680          <xsl:with-param name="type" select="$type"/>
681          <xsl:with-param name="separator" select="$range.separator"/>
682        </xsl:apply-templates>
683      </xsl:if>
684    </xsl:otherwise>
685  </xsl:choose>
686</xsl:template>
687
688<xsl:template name="reference">
689  <xsl:param name="scope" select="."/>
690  <xsl:param name="role" select="''"/>
691  <xsl:param name="type" select="''"/>
692  <xsl:param name="zones"/>
693
694  <xsl:variable name="number.separator">
695    <xsl:call-template name="index.separator">
696      <xsl:with-param name="key" select="'index.number.separator'"/>
697    </xsl:call-template>
698  </xsl:variable>
699
700  <xsl:choose>
701    <xsl:when test="contains($zones, ' ')">
702      <xsl:variable name="zone" select="substring-before($zones, ' ')"/>
703      <xsl:variable name="target" select="key('id', $zone)[&scope;]"/>
704
705      <xsl:variable name="id">
706        <xsl:call-template name="object.id">
707           <xsl:with-param name="object" select="$target[1]"/>
708        </xsl:call-template>
709      </xsl:variable>
710
711      <fo:basic-link internal-destination="{$id}"
712                     xsl:use-attribute-sets="index.page.number.properties">
713        <fo:page-number-citation ref-id="{$id}"/>
714      </fo:basic-link>
715
716      <xsl:if test="$passivetex.extensions = '0'">
717        <xsl:copy-of select="$number.separator"/>
718      </xsl:if>
719      <xsl:call-template name="reference">
720        <xsl:with-param name="zones" select="substring-after($zones, ' ')"/>
721        <xsl:with-param name="scope" select="$scope"/>
722        <xsl:with-param name="role" select="$role"/>
723        <xsl:with-param name="type" select="$type"/>
724      </xsl:call-template>
725    </xsl:when>
726    <xsl:otherwise>
727      <xsl:variable name="zone" select="$zones"/>
728      <xsl:variable name="target" select="key('id', $zone)[&scope;]"/>
729
730      <xsl:variable name="id">
731        <xsl:call-template name="object.id">
732          <xsl:with-param name="object" select="$target[1]"/>
733        </xsl:call-template>
734      </xsl:variable>
735
736      <fo:basic-link internal-destination="{$id}"
737                     xsl:use-attribute-sets="index.page.number.properties">
738        <fo:page-number-citation ref-id="{$id}"/>
739      </fo:basic-link>
740    </xsl:otherwise>
741  </xsl:choose>
742</xsl:template>
743
744<xsl:template name="info.reference">
745  <!-- This is not perfect. It doesn't treat indexterm inside info element as a range covering whole parent of info.
746       It also not work when there is no ID generated for parent element. But it works in the most common cases. -->
747  <xsl:param name="scope" select="."/>
748  <xsl:param name="role" select="''"/>
749  <xsl:param name="type" select="''"/>
750
751  <xsl:variable name="target" select="(ancestor::appendix|ancestor::article|ancestor::bibliography|ancestor::book|
752                                       ancestor::chapter|ancestor::glossary|ancestor::part|ancestor::preface|
753                                       ancestor::refentry|ancestor::reference|ancestor::refsect1|ancestor::refsect2|
754                                       ancestor::refsect3|ancestor::refsection|ancestor::refsynopsisdiv|
755                                       ancestor::sect1|ancestor::sect2|ancestor::sect3|ancestor::sect4|ancestor::sect5|
756                                       ancestor::section|ancestor::setindex|ancestor::set|ancestor::sidebar)[&scope;]"/>
757 
758  <xsl:variable name="id">
759    <xsl:call-template name="object.id">
760      <xsl:with-param name="object" select="$target[1]"/>
761    </xsl:call-template>
762  </xsl:variable>
763 
764  <fo:basic-link internal-destination="{$id}"
765                 xsl:use-attribute-sets="index.page.number.properties">
766    <fo:page-number-citation ref-id="{$id}"/>
767  </fo:basic-link>
768</xsl:template>
769
770<xsl:template match="indexterm" mode="index-see">
771   <xsl:param name="scope" select="."/>
772  <xsl:param name="role" select="''"/>
773  <xsl:param name="type" select="''"/>
774
775   <fo:inline>
776     <xsl:text> (</xsl:text>
777     <xsl:call-template name="gentext">
778       <xsl:with-param name="key" select="'see'"/>
779     </xsl:call-template>
780     <xsl:text> </xsl:text>
781     <xsl:value-of select="see"/>
782     <xsl:text>)</xsl:text>
783   </fo:inline>
784</xsl:template>
785
786<xsl:template match="indexterm" mode="index-seealso">
787   <xsl:param name="scope" select="."/>
788  <xsl:param name="role" select="''"/>
789  <xsl:param name="type" select="''"/>
790
791  <xsl:for-each select="seealso">
792    <xsl:sort select="translate(., &lowercase;, &uppercase;)"/>
793    <fo:block>
794      <xsl:text>(</xsl:text>
795      <xsl:call-template name="gentext">
796        <xsl:with-param name="key" select="'seealso'"/>
797      </xsl:call-template>
798      <xsl:text> </xsl:text>
799      <xsl:value-of select="."/>
800      <xsl:text>)</xsl:text>
801    </fo:block>
802  </xsl:for-each>
803
804</xsl:template>
805
806<!-- ====================================================================== -->
807
808<xsl:template name="generate-index-markup">
809  <xsl:param name="scope" select="(ancestor::book|/)[last()]"/>
810  <xsl:param name="role" select="@role"/>
811  <xsl:param name="type" select="@type"/>
812
813  <xsl:variable name="terms" select="$scope//indexterm[count(.|key('letter',
814                                     translate(substring(&primary;, 1, 1),&lowercase;,&uppercase;))[&scope;][1]) = 1]"/>
815  <xsl:variable name="alphabetical"
816                select="$terms[contains(concat(&lowercase;, &uppercase;),
817                                        substring(&primary;, 1, 1))]"/>
818  <xsl:variable name="others" select="$terms[not(contains(concat(&lowercase;,
819                                                 &uppercase;),
820                                             substring(&primary;, 1, 1)))]"/>
821
822  <xsl:text>&lt;index&gt;&#10;</xsl:text>
823  <xsl:if test="$others">
824    <xsl:text>&#10;&lt;indexdiv&gt;&#10;</xsl:text>
825    <xsl:text>&lt;title&gt;</xsl:text>
826    <xsl:call-template name="gentext">
827      <xsl:with-param name="key" select="'index symbols'"/>
828    </xsl:call-template>
829    <xsl:text>&lt;/title&gt;&#10;</xsl:text>
830    <xsl:apply-templates select="$others[count(.|key('primary',
831                                 &primary;)[&scope;][1]) = 1]"
832                         mode="index-symbol-div-markup">
833      <xsl:with-param name="scope" select="$scope"/>
834      <xsl:with-param name="role" select="$role"/>
835      <xsl:with-param name="type" select="$type"/>
836      <xsl:sort select="translate(&primary;, &lowercase;, &uppercase;)"/>
837    </xsl:apply-templates>
838    <xsl:text>&lt;/indexdiv&gt;&#10;</xsl:text>
839  </xsl:if>
840
841  <xsl:apply-templates select="$alphabetical[count(.|key('letter',
842                               translate(substring(&primary;, 1, 1),&lowercase;,&uppercase;))[&scope;][1]) = 1]"
843                       mode="index-div-markup">
844      <xsl:with-param name="scope" select="$scope"/>
845      <xsl:with-param name="role" select="$role"/>
846      <xsl:with-param name="type" select="$type"/>
847      <xsl:sort select="translate(&primary;, &lowercase;, &uppercase;)"/>
848  </xsl:apply-templates>
849  <xsl:text>&lt;/index&gt;&#10;</xsl:text>
850</xsl:template>
851
852<xsl:template match="*" mode="index-markup">
853  <xsl:param name="scope" select="."/>
854  <xsl:param name="role" select="''"/>
855  <xsl:param name="type" select="''"/>
856
857  <xsl:text>&lt;</xsl:text>
858  <xsl:value-of select="local-name(.)"/>
859  <xsl:text>&gt;&#10;</xsl:text>
860  <xsl:apply-templates mode="index-markup">
861    <xsl:with-param name="scope" select="$scope"/>
862    <xsl:with-param name="role" select="$role"/>
863    <xsl:with-param name="type" select="$type"/>
864  </xsl:apply-templates>
865</xsl:template>
866
867<xsl:template match="indexterm" mode="index-div-markup">
868  <xsl:param name="scope" select="."/>
869  <xsl:param name="role" select="''"/>
870  <xsl:param name="type" select="''"/>
871  <xsl:variable name="key" select="translate(substring(&primary;, 1, 1),&lowercase;,&uppercase;)"/>
872  <xsl:text>&#10;&lt;indexdiv&gt;&#10;</xsl:text>
873  <xsl:text>&lt;title&gt;</xsl:text>
874  <xsl:value-of select="translate($key, &lowercase;, &uppercase;)"/>
875  <xsl:text>&lt;/title&gt;&#10;</xsl:text>
876
877  <xsl:apply-templates select="key('letter', $key)[&scope;][count(.|key('primary', &primary;)[&scope;][1]) = 1]"
878                       mode="index-primary-markup">
879    <xsl:with-param name="scope" select="$scope"/>
880    <xsl:with-param name="role" select="$role"/>
881    <xsl:with-param name="type" select="$type"/>
882    <xsl:sort select="translate(&primary;, &lowercase;, &uppercase;)"/>
883  </xsl:apply-templates>
884  <xsl:text>&lt;/indexdiv&gt;&#10;</xsl:text>
885</xsl:template>
886
887<xsl:template match="indexterm" mode="index-symbol-div-markup">
888  <xsl:param name="scope" select="."/>
889  <xsl:param name="role" select="''"/>
890  <xsl:param name="type" select="''"/>
891  <xsl:variable name="key" select="translate(substring(&primary;, 1, 1),&lowercase;,&uppercase;)"/>
892
893  <xsl:apply-templates select="key('letter', $key)[&scope;][count(.|key('primary', &primary;)[&scope;][1]) = 1]"
894                       mode="index-primary-markup">
895    <xsl:with-param name="scope" select="$scope"/>
896    <xsl:with-param name="role" select="$role"/>
897    <xsl:with-param name="type" select="$type"/>
898    <xsl:sort select="translate(&primary;, &lowercase;, &uppercase;)"/>
899  </xsl:apply-templates>
900</xsl:template>
901
902<xsl:template match="indexterm" mode="index-primary-markup">
903  <xsl:param name="scope" select="."/>
904  <xsl:param name="role" select="''"/>
905  <xsl:param name="type" select="''"/>
906  <xsl:variable name="key" select="&primary;"/>
907  <xsl:variable name="refs" select="key('primary', $key)[&scope;]"/>
908  <xsl:variable name="pages" select="$refs[not(see) and not(seealso)]"/>
909
910  <xsl:text>&#10;&lt;indexentry&gt;&#10;</xsl:text>
911  <xsl:text>&lt;primaryie&gt;</xsl:text>
912  <xsl:text>&lt;phrase&gt;</xsl:text>
913  <xsl:call-template name="escape-text">
914    <xsl:with-param name="text" select="string(primary)"/>
915  </xsl:call-template>
916  <xsl:text>&lt;/phrase&gt;</xsl:text>
917  <xsl:if test="$pages">,</xsl:if>
918  <xsl:text>&#10;</xsl:text>
919
920  <xsl:for-each select="$pages">
921    <xsl:apply-templates select="." mode="reference-markup">
922      <xsl:with-param name="scope" select="$scope"/>
923      <xsl:with-param name="role" select="$role"/>
924      <xsl:with-param name="type" select="$type"/>
925    </xsl:apply-templates>
926  </xsl:for-each>
927
928  <xsl:text>&lt;/primaryie&gt;&#10;</xsl:text>
929
930  <xsl:if test="$refs/secondary or $refs[not(secondary)]/*[self::see or self::seealso]">
931    <xsl:apply-templates select="$refs[generate-id() = generate-id(key('see', concat(&primary;, &sep;, &sep;, &sep;, see))[&scope;][1])]"
932                         mode="index-see-markup">
933      <xsl:with-param name="scope" select="$scope"/>
934      <xsl:with-param name="role" select="$role"/>
935      <xsl:with-param name="type" select="$type"/>
936      <xsl:sort select="translate(see, &lowercase;, &uppercase;)"/>
937    </xsl:apply-templates>
938
939    <xsl:apply-templates select="$refs[generate-id() = generate-id(key('see-also', concat(&primary;, &sep;, &sep;, &sep;, seealso))[&scope;][1])]"
940                         mode="index-seealso-markup">
941      <xsl:with-param name="scope" select="$scope"/>
942      <xsl:with-param name="role" select="$role"/>
943      <xsl:with-param name="type" select="$type"/>
944      <xsl:sort select="translate(seealso, &lowercase;, &uppercase;)"/>
945    </xsl:apply-templates>
946
947    <xsl:apply-templates select="$refs[secondary and count(.|key('secondary', concat($key, &sep;, &secondary;))[&scope;][1]) = 1]" 
948                         mode="index-secondary-markup">
949      <xsl:with-param name="scope" select="$scope"/>
950      <xsl:with-param name="role" select="$role"/>
951      <xsl:with-param name="type" select="$type"/>
952      <xsl:sort select="translate(&secondary;, &lowercase;, &uppercase;)"/>
953    </xsl:apply-templates>
954  </xsl:if>
955  <xsl:text>&lt;/indexentry&gt;&#10;</xsl:text>
956</xsl:template>
957
958<xsl:template match="indexterm" mode="index-secondary-markup">
959  <xsl:param name="scope" select="."/>
960  <xsl:param name="role" select="''"/>
961  <xsl:param name="type" select="''"/>
962  <xsl:variable name="key" select="concat(&primary;, &sep;, &secondary;)"/>
963  <xsl:variable name="refs" select="key('secondary', $key)[&scope;]"/>
964  <xsl:variable name="pages" select="$refs[not(see) and not(seealso)]"/>
965
966  <xsl:text>&lt;secondaryie&gt;</xsl:text>
967  <xsl:text>&lt;phrase&gt;</xsl:text>
968  <xsl:call-template name="escape-text">
969    <xsl:with-param name="text" select="string(secondary)"/>
970  </xsl:call-template>
971  <xsl:text>&lt;/phrase&gt;</xsl:text>
972  <xsl:if test="$pages">,</xsl:if>
973  <xsl:text>&#10;</xsl:text>
974
975  <xsl:for-each select="$pages">
976    <xsl:apply-templates select="." mode="reference-markup">
977      <xsl:with-param name="scope" select="$scope"/>
978      <xsl:with-param name="role" select="$role"/>
979      <xsl:with-param name="type" select="$type"/>
980    </xsl:apply-templates>
981  </xsl:for-each>
982
983  <xsl:text>&lt;/secondaryie&gt;&#10;</xsl:text>
984
985  <xsl:if test="$refs/tertiary or $refs[not(tertiary)]/*[self::see or self::seealso]">
986    <xsl:apply-templates select="$refs[generate-id() = generate-id(key('see', concat(&primary;, &sep;, &secondary;, &sep;, &sep;, see))[&scope;][1])]"
987                         mode="index-see-markup">
988      <xsl:with-param name="scope" select="$scope"/>
989      <xsl:with-param name="role" select="$role"/>
990      <xsl:with-param name="type" select="$type"/>
991      <xsl:sort select="translate(see, &lowercase;, &uppercase;)"/>
992    </xsl:apply-templates>
993    <xsl:apply-templates select="$refs[generate-id() = generate-id(key('see-also', concat(&primary;, &sep;, &secondary;, &sep;, &sep;, seealso))[&scope;][1])]"
994                         mode="index-seealso-markup">
995      <xsl:with-param name="scope" select="$scope"/>
996      <xsl:with-param name="role" select="$role"/>
997      <xsl:with-param name="type" select="$type"/>
998      <xsl:sort select="translate(seealso, &lowercase;, &uppercase;)"/>
999    </xsl:apply-templates>
1000    <xsl:apply-templates select="$refs[tertiary and count(.|key('tertiary', concat($key, &sep;, &tertiary;))[&scope;][1]) = 1]" 
1001                         mode="index-tertiary-markup">
1002      <xsl:with-param name="scope" select="$scope"/>
1003      <xsl:with-param name="role" select="$role"/>
1004      <xsl:with-param name="type" select="$type"/>
1005      <xsl:sort select="translate(&tertiary;, &lowercase;, &uppercase;)"/>
1006    </xsl:apply-templates>
1007  </xsl:if>
1008</xsl:template>
1009
1010<xsl:template match="indexterm" mode="index-tertiary-markup">
1011  <xsl:param name="scope" select="."/>
1012  <xsl:param name="role" select="''"/>
1013  <xsl:param name="type" select="''"/>
1014  <xsl:variable name="key" select="concat(&primary;, &sep;, &secondary;, &sep;, &tertiary;)"/>
1015  <xsl:variable name="refs" select="key('tertiary', $key)[&scope;]"/>
1016  <xsl:variable name="pages" select="$refs[not(see) and not(seealso)]"/>
1017
1018  <xsl:text>&lt;tertiaryie&gt;</xsl:text>
1019  <xsl:text>&lt;phrase&gt;</xsl:text>
1020  <xsl:call-template name="escape-text">
1021    <xsl:with-param name="text" select="string(tertiary)"/>
1022  </xsl:call-template>
1023  <xsl:text>&lt;/phrase&gt;</xsl:text>
1024  <xsl:if test="$pages">,</xsl:if>
1025  <xsl:text>&#10;</xsl:text>
1026
1027  <xsl:for-each select="$pages">
1028    <xsl:apply-templates select="." mode="reference-markup">
1029      <xsl:with-param name="scope" select="$scope"/>
1030      <xsl:with-param name="role" select="$role"/>
1031      <xsl:with-param name="type" select="$type"/>
1032    </xsl:apply-templates>
1033  </xsl:for-each>
1034
1035  <xsl:text>&lt;/tertiaryie&gt;&#10;</xsl:text>
1036
1037  <xsl:variable name="see" select="$refs/see | $refs/seealso"/>
1038  <xsl:if test="$see">
1039    <xsl:apply-templates select="$refs[generate-id() = generate-id(key('see', concat(&primary;, &sep;, &secondary;, &sep;, &tertiary;, &sep;, see))[&scope;][1])]"
1040                         mode="index-see-markup">
1041      <xsl:with-param name="scope" select="$scope"/>
1042      <xsl:with-param name="role" select="$role"/>
1043      <xsl:with-param name="type" select="$type"/>
1044      <xsl:sort select="translate(see, &lowercase;, &uppercase;)"/>
1045    </xsl:apply-templates>
1046    <xsl:apply-templates select="$refs[generate-id() = generate-id(key('see-also', concat(&primary;, &sep;, &secondary;, &sep;, &tertiary;, &sep;, seealso))[&scope;][1])]"
1047                         mode="index-seealso-markup">
1048      <xsl:with-param name="scope" select="$scope"/>
1049      <xsl:with-param name="role" select="$role"/>
1050      <xsl:with-param name="type" select="$type"/>
1051      <xsl:sort select="translate(seealso, &lowercase;, &uppercase;)"/>
1052    </xsl:apply-templates>
1053  </xsl:if>
1054</xsl:template>
1055
1056<xsl:template match="indexterm" mode="reference-markup">
1057  <xsl:param name="scope" select="."/>
1058  <xsl:param name="role" select="''"/>
1059  <xsl:param name="type" select="''"/>
1060
1061  <xsl:choose>
1062    <xsl:when test="@zone and string(@zone)">
1063      <xsl:call-template name="reference-markup">
1064        <xsl:with-param name="zones" select="normalize-space(@zone)"/>
1065        <xsl:with-param name="scope" select="$scope"/>
1066        <xsl:with-param name="role" select="$role"/>
1067        <xsl:with-param name="type" select="$type"/>
1068      </xsl:call-template>
1069    </xsl:when>
1070    <xsl:otherwise>
1071      <xsl:variable name="id">
1072        <xsl:call-template name="object.id"/>
1073      </xsl:variable>
1074
1075
1076      <xsl:choose>
1077        <xsl:when test="@startref and @class='endofrange'">
1078          <xsl:text>&lt;phrase role="pageno"&gt;</xsl:text>
1079          <xsl:text>&lt;link linkend="</xsl:text>
1080          <xsl:value-of select="@startref"/>
1081          <xsl:text>"&gt;</xsl:text>
1082          <fo:basic-link internal-destination="{@startref}"
1083                     xsl:use-attribute-sets="index.page.number.properties">
1084            <fo:page-number-citation ref-id="{@startref}"/>
1085            <xsl:text>-</xsl:text>
1086            <fo:page-number-citation ref-id="{$id}"/>
1087          </fo:basic-link>
1088          <xsl:text>&lt;/link&gt;</xsl:text>
1089          <xsl:text>&lt;/phrase&gt;&#10;</xsl:text>
1090        </xsl:when>
1091        <xsl:otherwise>
1092          <xsl:text>&lt;phrase role="pageno"&gt;</xsl:text>
1093          <xsl:if test="$id">
1094            <xsl:text>&lt;link linkend="</xsl:text>
1095            <xsl:value-of select="$id"/>
1096            <xsl:text>"&gt;</xsl:text>
1097          </xsl:if>
1098          <fo:basic-link internal-destination="{$id}"
1099                     xsl:use-attribute-sets="index.page.number.properties">
1100            <fo:page-number-citation ref-id="{$id}"/>
1101          </fo:basic-link>
1102          <xsl:if test="$id">
1103            <xsl:text>&lt;/link&gt;</xsl:text>
1104          </xsl:if>
1105          <xsl:text>&lt;/phrase&gt;&#10;</xsl:text>
1106        </xsl:otherwise>
1107      </xsl:choose>
1108    </xsl:otherwise>
1109  </xsl:choose>
1110</xsl:template>
1111
1112<xsl:template name="reference-markup">
1113  <xsl:param name="scope" select="."/>
1114  <xsl:param name="role" select="''"/>
1115  <xsl:param name="type" select="''"/>
1116  <xsl:param name="zones"/>
1117  <xsl:choose>
1118    <xsl:when test="contains($zones, ' ')">
1119      <xsl:variable name="zone" select="substring-before($zones, ' ')"/>
1120      <xsl:variable name="target" select="key('id', $zone)[&scope;]"/>
1121
1122      <xsl:variable name="id">
1123        <xsl:call-template name="object.id">
1124          <xsl:with-param name="object" select="$target[1]"/>
1125        </xsl:call-template>
1126      </xsl:variable>
1127
1128      <xsl:text>&lt;phrase fole="pageno"&gt;</xsl:text>
1129      <xsl:if test="$target[1]/@id or $target[1]/@xml:id">
1130        <xsl:text>&lt;link linkend="</xsl:text>
1131        <xsl:value-of select="$id"/>
1132        <xsl:text>"&gt;</xsl:text>
1133      </xsl:if>
1134      <fo:basic-link internal-destination="{$id}"
1135                     xsl:use-attribute-sets="index.page.number.properties">
1136        <fo:page-number-citation ref-id="{$id}"/>
1137      </fo:basic-link>
1138      <xsl:if test="$target[1]/@id or $target[1]/@xml:id">
1139        <xsl:text>&lt;/link&gt;</xsl:text>
1140      </xsl:if>
1141      <xsl:text>&lt;/phrase&gt;&#10;</xsl:text>
1142
1143      <xsl:call-template name="reference">
1144        <xsl:with-param name="zones" select="substring-after($zones, ' ')"/>
1145        <xsl:with-param name="scope" select="$scope"/>
1146        <xsl:with-param name="role" select="$role"/>
1147        <xsl:with-param name="type" select="$type"/>
1148      </xsl:call-template>
1149    </xsl:when>
1150    <xsl:otherwise>
1151      <xsl:variable name="zone" select="$zones"/>
1152      <xsl:variable name="target" select="key('id', $zone)[&scope;]"/>
1153
1154      <xsl:variable name="id">
1155        <xsl:call-template name="object.id">
1156          <xsl:with-param name="object" select="$target[1]"/>
1157        </xsl:call-template>
1158      </xsl:variable>
1159
1160      <xsl:text>&lt;phrase role="pageno"&gt;</xsl:text>
1161      <xsl:if test="$target[1]/@id or target[1]/@xml:id">
1162        <xsl:text>&lt;link linkend="</xsl:text>
1163        <xsl:value-of select="$id"/>
1164        <xsl:text>"&gt;</xsl:text>
1165      </xsl:if>
1166      <fo:basic-link internal-destination="{$id}"
1167                     xsl:use-attribute-sets="index.page.number.properties">
1168        <fo:page-number-citation ref-id="{$id}"/>
1169      </fo:basic-link>
1170      <xsl:if test="$target[1]/@id or target[1]/@xml:id">
1171        <xsl:text>&lt;/link&gt;</xsl:text>
1172      </xsl:if>
1173      <xsl:text>&lt;/phrase&gt;&#10;</xsl:text>
1174    </xsl:otherwise>
1175  </xsl:choose>
1176</xsl:template>
1177
1178<xsl:template match="indexterm" mode="index-see-markup">
1179  <xsl:param name="scope" select="."/>
1180  <xsl:param name="role" select="''"/>
1181  <xsl:param name="type" select="''"/>
1182  <fo:block>
1183    <xsl:text>&lt;seeie&gt;</xsl:text>
1184    <xsl:text>&lt;phrase&gt;</xsl:text>
1185    <xsl:call-template name="escape-text">
1186      <xsl:with-param name="text" select="string(see)"/>
1187    </xsl:call-template>
1188    <xsl:text>&lt;/phrase&gt;</xsl:text>
1189    <xsl:text>&lt;/seeie&gt;&#10;</xsl:text>
1190  </fo:block>
1191</xsl:template>
1192
1193<xsl:template match="indexterm" mode="index-seealso-markup">
1194  <xsl:param name="scope" select="."/>
1195  <xsl:param name="role" select="''"/>
1196  <xsl:param name="type" select="''"/>
1197  <fo:block>
1198    <xsl:text>&lt;seealsoie&gt;</xsl:text>
1199    <xsl:text>&lt;phrase&gt;</xsl:text>
1200    <xsl:call-template name="escape-text">
1201      <xsl:with-param name="text" select="string(seealso)"/>
1202    </xsl:call-template>
1203    <xsl:text>&lt;/phrase&gt;</xsl:text>
1204    <xsl:text>&lt;/seealsoie&gt;&#10;</xsl:text>
1205  </fo:block>
1206</xsl:template>
1207
1208<xsl:template name="escape-text">
1209  <xsl:param name="text" select="''"/>
1210
1211  <xsl:variable name="ltpos" select="substring-before($text, '&lt;')"/>
1212  <xsl:variable name="amppos" select="substring-before($text, '&amp;')"/>
1213
1214  <xsl:choose>
1215    <xsl:when test="contains($text,'&lt;') and contains($text, '&amp;')
1216                    and string-length($ltpos) &lt; string-length($amppos)">
1217      <xsl:value-of select="$ltpos"/>
1218      <xsl:text>&amp;lt;</xsl:text>
1219      <xsl:call-template name="escape-text">
1220        <xsl:with-param name="text" select="substring-after($text, '&lt;')"/>
1221      </xsl:call-template>
1222    </xsl:when>
1223
1224    <xsl:when test="contains($text,'&lt;') and contains($text, '&amp;')
1225                    and string-length($amppos) &lt; string-length($ltpos)">
1226      <xsl:value-of select="$amppos"/>
1227      <xsl:text>&amp;amp;</xsl:text>
1228      <xsl:call-template name="escape-text">
1229        <xsl:with-param name="text" select="substring-after($text, '&amp;')"/>
1230      </xsl:call-template>
1231    </xsl:when>
1232
1233    <xsl:when test="contains($text, '&lt;')">
1234      <xsl:value-of select="$ltpos"/>
1235      <xsl:text>&amp;lt;</xsl:text>
1236      <xsl:call-template name="escape-text">
1237        <xsl:with-param name="text" select="substring-after($text, '&lt;')"/>
1238      </xsl:call-template>
1239    </xsl:when>
1240
1241    <xsl:when test="contains($text, '&amp;')">
1242      <xsl:value-of select="$amppos"/>
1243      <xsl:text>&amp;amp;</xsl:text>
1244      <xsl:call-template name="escape-text">
1245        <xsl:with-param name="text" select="substring-after($text, '&amp;')"/>
1246      </xsl:call-template>
1247    </xsl:when>
1248
1249    <xsl:otherwise>
1250      <xsl:value-of select="$text"/>
1251    </xsl:otherwise>
1252  </xsl:choose>
1253</xsl:template>
1254
1255<xsl:template name="index.separator">
1256  <xsl:param name="key" select="''"/>
1257  <xsl:param name="lang">
1258    <xsl:call-template name="l10n.language"/>
1259  </xsl:param>
1260
1261  <xsl:choose>
1262    <xsl:when test="$key = 'index.term.separator'">
1263      <xsl:choose>
1264        <!-- Use the override if not blank -->
1265        <xsl:when test="$index.term.separator != ''">
1266          <xsl:copy-of select="$index.term.separator"/>
1267        </xsl:when>
1268        <xsl:otherwise>
1269          <xsl:call-template name="gentext.template">
1270            <xsl:with-param name="lang" select="$lang"/>
1271            <xsl:with-param name="context">index</xsl:with-param>
1272            <xsl:with-param name="name">term-separator</xsl:with-param>
1273          </xsl:call-template>
1274        </xsl:otherwise>
1275      </xsl:choose>
1276    </xsl:when>
1277    <xsl:when test="$key = 'index.number.separator'">
1278      <xsl:choose>
1279        <!-- Use the override if not blank -->
1280        <xsl:when test="$index.number.separator != ''">
1281          <xsl:copy-of select="$index.number.separator"/>
1282        </xsl:when>
1283        <xsl:otherwise>
1284          <xsl:call-template name="gentext.template">
1285            <xsl:with-param name="lang" select="$lang"/>
1286            <xsl:with-param name="context">index</xsl:with-param>
1287            <xsl:with-param name="name">number-separator</xsl:with-param>
1288          </xsl:call-template>
1289        </xsl:otherwise>
1290      </xsl:choose>
1291    </xsl:when>
1292    <xsl:when test="$key = 'index.range.separator'">
1293      <xsl:choose>
1294        <!-- Use the override if not blank -->
1295        <xsl:when test="$index.range.separator != ''">
1296          <xsl:copy-of select="$index.range.separator"/>
1297        </xsl:when>
1298        <xsl:otherwise>
1299          <xsl:call-template name="gentext.template">
1300            <xsl:with-param name="lang" select="$lang"/>
1301            <xsl:with-param name="context">index</xsl:with-param>
1302            <xsl:with-param name="name">range-separator</xsl:with-param>
1303          </xsl:call-template>
1304        </xsl:otherwise>
1305      </xsl:choose>
1306    </xsl:when>
1307  </xsl:choose>
1308</xsl:template>
1309
1310</xsl:stylesheet>
Note: See TracBrowser for help on using the repository browser.