]> git.stg.codes - stg.git/blob - doc/xslt/html/glossary.xsl
Added functional test framework.
[stg.git] / doc / xslt / html / glossary.xsl
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:xlink='http://www.w3.org/1999/xlink'
8                 exclude-result-prefixes="xlink"
9                 version='1.0'>
10
11 <!-- ********************************************************************
12      $Id: glossary.xsl 8421 2009-05-04 07:49:49Z bobstayton $
13      ********************************************************************
14
15      This file is part of the XSL DocBook Stylesheet distribution.
16      See ../README or http://docbook.sf.net/release/xsl/current/ for
17      copyright and other information.
18
19      ******************************************************************** -->
20
21 <!-- ==================================================================== -->
22
23 <xsl:template match="glossary">
24   &setup-language-variable;
25   <xsl:call-template name="id.warning"/>
26
27   <div>
28     <xsl:apply-templates select="." mode="common.html.attributes"/>
29     <xsl:if test="$generate.id.attributes != 0">
30       <xsl:attribute name="id">
31         <xsl:call-template name="object.id"/>
32       </xsl:attribute>
33     </xsl:if>
34
35     <xsl:call-template name="glossary.titlepage"/>
36
37     <xsl:choose>
38       <xsl:when test="glossdiv">
39         <xsl:apply-templates select="(glossdiv[1]/preceding-sibling::*)"/>
40       </xsl:when>
41       <xsl:when test="glossentry">
42         <xsl:apply-templates select="(glossentry[1]/preceding-sibling::*)"/>
43       </xsl:when>
44       <xsl:otherwise>
45         <xsl:apply-templates/>
46       </xsl:otherwise>
47     </xsl:choose>
48
49     <xsl:choose>
50       <xsl:when test="glossdiv">
51         <xsl:apply-templates select="glossdiv"/>
52       </xsl:when>
53       <xsl:when test="glossentry">
54         <dl>
55           <xsl:choose>
56             <xsl:when test="$glossary.sort != 0">
57               <xsl:apply-templates select="glossentry">
58                                 <xsl:sort lang="{$language}" select="normalize-space(translate(concat(@sortas, glossterm[not(parent::glossentry/@sortas) or parent::glossentry/@sortas = '']), &lowercase;, &uppercase;))"/>
59               </xsl:apply-templates>
60             </xsl:when>
61             <xsl:otherwise>
62               <xsl:apply-templates select="glossentry"/>
63             </xsl:otherwise>
64           </xsl:choose>
65         </dl>
66       </xsl:when>
67       <xsl:otherwise>
68         <!-- empty glossary -->
69       </xsl:otherwise>
70     </xsl:choose>
71
72     <xsl:if test="not(parent::article)">
73       <xsl:call-template name="process.footnotes"/>
74     </xsl:if>
75   </div>
76 </xsl:template>
77
78 <xsl:template match="glossary/glossaryinfo"></xsl:template>
79 <xsl:template match="glossary/info"></xsl:template>
80 <xsl:template match="glossary/title"></xsl:template>
81 <xsl:template match="glossary/subtitle"></xsl:template>
82 <xsl:template match="glossary/titleabbrev"></xsl:template>
83
84 <!-- ==================================================================== -->
85
86 <xsl:template match="glosslist">
87   &setup-language-variable;
88   <div>
89     <xsl:apply-templates select="." mode="common.html.attributes"/>
90     <xsl:call-template name="anchor"/>
91     <xsl:if test="blockinfo/title|info/title|title">
92       <xsl:call-template name="formal.object.heading"/>
93     </xsl:if>
94     <dl>
95       <xsl:choose>
96         <xsl:when test="$glossary.sort != 0">
97           <xsl:apply-templates select="glossentry">
98                                 <xsl:sort lang="{$language}" select="normalize-space(translate(concat(@sortas, glossterm[not(parent::glossentry/@sortas) or parent::glossentry/@sortas = '']), &lowercase;, &uppercase;))"/>
99           </xsl:apply-templates>
100         </xsl:when>
101         <xsl:otherwise>
102           <xsl:apply-templates select="glossentry"/>
103         </xsl:otherwise>
104       </xsl:choose>
105     </dl>
106   </div>
107 </xsl:template>
108
109 <!-- ==================================================================== -->
110
111 <xsl:template match="glossdiv">
112   &setup-language-variable;
113   <xsl:call-template name="id.warning"/>
114
115   <div>
116     <xsl:apply-templates select="." mode="common.html.attributes"/>
117     <xsl:apply-templates select="(glossentry[1]/preceding-sibling::*)"/>
118
119     <dl>
120       <xsl:choose>
121         <xsl:when test="$glossary.sort != 0">
122           <xsl:apply-templates select="glossentry">
123             <xsl:sort lang="{$language}"
124                       select="translate(glossterm, $lowercase, 
125                                         $uppercase)"/>
126           </xsl:apply-templates>
127         </xsl:when>
128         <xsl:otherwise>
129           <xsl:apply-templates select="glossentry"/>
130         </xsl:otherwise>
131       </xsl:choose>
132     </dl>
133   </div>
134 </xsl:template>
135
136 <xsl:template match="glossdiv/title">
137   <h3>
138     <xsl:apply-templates select="." mode="common.html.attributes"/>
139     <xsl:apply-templates/>
140   </h3>
141 </xsl:template>
142
143 <!-- ==================================================================== -->
144
145 <!--
146 GlossEntry ::=
147   GlossTerm, Acronym?, Abbrev?,
148   (IndexTerm)*,
149   RevHistory?,
150   (GlossSee | GlossDef+)
151 -->
152
153 <xsl:template match="glossentry">
154   <xsl:choose>
155     <xsl:when test="$glossentry.show.acronym = 'primary'">
156       <dt>
157         <xsl:call-template name="anchor">
158           <xsl:with-param name="conditional">
159             <xsl:choose>
160               <xsl:when test="$glossterm.auto.link != 0">0</xsl:when>
161               <xsl:otherwise>1</xsl:otherwise>
162             </xsl:choose>
163           </xsl:with-param>
164         </xsl:call-template>
165
166         <xsl:choose>
167           <xsl:when test="acronym|abbrev">
168             <xsl:apply-templates select="acronym|abbrev"/>
169             <xsl:text> (</xsl:text>
170             <xsl:apply-templates select="glossterm"/>
171             <xsl:text>)</xsl:text>
172           </xsl:when>
173           <xsl:otherwise>
174             <xsl:apply-templates select="glossterm"/>
175           </xsl:otherwise>
176         </xsl:choose>
177       </dt>
178     </xsl:when>
179     <xsl:when test="$glossentry.show.acronym = 'yes'">
180       <dt>
181         <xsl:call-template name="anchor">
182           <xsl:with-param name="conditional">
183             <xsl:choose>
184               <xsl:when test="$glossterm.auto.link != 0">0</xsl:when>
185               <xsl:otherwise>1</xsl:otherwise>
186             </xsl:choose>
187           </xsl:with-param>
188         </xsl:call-template>
189
190         <xsl:apply-templates select="glossterm"/>
191
192         <xsl:if test="acronym|abbrev">
193           <xsl:text> (</xsl:text>
194           <xsl:apply-templates select="acronym|abbrev"/>
195           <xsl:text>)</xsl:text>
196         </xsl:if>
197       </dt>
198     </xsl:when>
199     <xsl:otherwise>
200       <dt>
201         <xsl:call-template name="anchor">
202           <xsl:with-param name="conditional">
203             <xsl:choose>
204               <xsl:when test="$glossterm.auto.link != 0">0</xsl:when>
205               <xsl:otherwise>1</xsl:otherwise>
206             </xsl:choose>
207           </xsl:with-param>
208         </xsl:call-template>
209
210         <xsl:apply-templates select="glossterm"/>
211       </dt>
212     </xsl:otherwise>
213   </xsl:choose>
214
215   <xsl:apply-templates select="indexterm|revhistory|glosssee|glossdef"/>
216 </xsl:template>
217
218 <xsl:template match="glossentry/glossterm">
219   <xsl:apply-templates/>
220   <xsl:if test="following-sibling::glossterm">, </xsl:if>
221 </xsl:template>
222
223 <xsl:template match="glossentry/acronym">
224   <xsl:apply-templates/>
225   <xsl:if test="following-sibling::acronym|following-sibling::abbrev">, </xsl:if>
226 </xsl:template>
227
228 <xsl:template match="glossentry/abbrev">
229   <xsl:apply-templates/>
230   <xsl:if test="following-sibling::acronym|following-sibling::abbrev">, </xsl:if>
231 </xsl:template>
232
233 <xsl:template match="glossentry/revhistory">
234 </xsl:template>
235
236 <xsl:template match="glossentry/glosssee">
237   <xsl:variable name="otherterm" select="@otherterm"/>
238   <xsl:variable name="targets" select="key('id', $otherterm)"/>
239   <xsl:variable name="target" select="$targets[1]"/>
240   <xsl:variable name="xlink" select="@xlink:href"/>
241
242   <dd>
243     <p>
244       <xsl:variable name="template">
245         <xsl:call-template name="gentext.template">
246           <xsl:with-param name="context" select="'glossary'"/>
247           <xsl:with-param name="name" select="'see'"/>
248         </xsl:call-template>
249       </xsl:variable>
250
251       <xsl:variable name="title">
252         <xsl:choose>
253           <xsl:when test="$target">
254             <a>
255               <xsl:apply-templates select="." mode="common.html.attributes"/>
256               <xsl:attribute name="href">
257                 <xsl:call-template name="href.target">
258                   <xsl:with-param name="object" select="$target"/>
259                 </xsl:call-template>
260               </xsl:attribute>
261               <xsl:apply-templates select="$target" mode="xref-to"/>
262             </a>
263           </xsl:when>
264           <xsl:when test="$xlink">
265             <xsl:call-template name="simple.xlink">
266               <xsl:with-param name="content">
267                 <xsl:apply-templates/>
268               </xsl:with-param>
269             </xsl:call-template>
270           </xsl:when>
271           <xsl:when test="$otherterm != '' and not($target)">
272             <xsl:message>
273               <xsl:text>Warning: glosssee @otherterm reference not found: </xsl:text>
274               <xsl:value-of select="$otherterm"/>
275             </xsl:message>
276             <xsl:apply-templates/>
277           </xsl:when>
278           <xsl:otherwise>
279             <xsl:apply-templates/>
280           </xsl:otherwise>
281         </xsl:choose>
282       </xsl:variable>
283
284       <xsl:call-template name="substitute-markup">
285         <xsl:with-param name="template" select="$template"/>
286         <xsl:with-param name="title" select="$title"/>
287       </xsl:call-template>
288     </p>
289   </dd>
290 </xsl:template>
291
292 <xsl:template match="glossentry/glossdef">
293   <dd>
294     <xsl:apply-templates select="*[local-name(.) != 'glossseealso']"/>
295     <xsl:if test="glossseealso">
296       <p>
297         <xsl:variable name="template">
298           <xsl:call-template name="gentext.template">
299             <xsl:with-param name="context" select="'glossary'"/>
300             <xsl:with-param name="name" select="'seealso'"/>
301           </xsl:call-template>
302         </xsl:variable>
303         <xsl:variable name="title">
304           <xsl:apply-templates select="glossseealso"/>
305         </xsl:variable>
306         <xsl:call-template name="substitute-markup">
307           <xsl:with-param name="template" select="$template"/>
308           <xsl:with-param name="title" select="$title"/>
309         </xsl:call-template>
310       </p>
311     </xsl:if>
312   </dd>
313 </xsl:template>
314
315 <xsl:template match="glossseealso">
316   <xsl:variable name="otherterm" select="@otherterm"/>
317   <xsl:variable name="targets" select="key('id', $otherterm)"/>
318   <xsl:variable name="target" select="$targets[1]"/>
319   <xsl:variable name="xlink" select="@xlink:href"/>
320
321   <xsl:choose>
322     <xsl:when test="$target">
323       <a>
324         <xsl:apply-templates select="." mode="common.html.attributes"/>
325         <xsl:attribute name="href">
326           <xsl:call-template name="href.target">
327             <xsl:with-param name="object" select="$target"/>
328           </xsl:call-template>
329         </xsl:attribute>
330         <xsl:apply-templates select="$target" mode="xref-to"/>
331       </a>
332     </xsl:when>
333     <xsl:when test="$xlink">
334       <xsl:call-template name="simple.xlink">
335         <xsl:with-param name="content">
336           <xsl:apply-templates/>
337         </xsl:with-param>
338       </xsl:call-template>
339     </xsl:when>
340     <xsl:when test="$otherterm != '' and not($target)">
341       <xsl:message>
342         <xsl:text>Warning: glossseealso @otherterm reference not found: </xsl:text>
343         <xsl:value-of select="$otherterm"/>
344       </xsl:message>
345       <xsl:apply-templates/>
346     </xsl:when>
347     <xsl:otherwise>
348       <xsl:apply-templates/>
349     </xsl:otherwise>
350   </xsl:choose>
351
352   <xsl:choose>
353     <xsl:when test="position() = last()"/>
354     <xsl:otherwise>
355                 <xsl:call-template name="gentext.template">
356                   <xsl:with-param name="context" select="'glossary'"/>
357                   <xsl:with-param name="name" select="'seealso-separator'"/>
358                 </xsl:call-template>
359     </xsl:otherwise>
360   </xsl:choose>
361 </xsl:template>
362
363 <!-- ==================================================================== -->
364
365 <!-- Glossary collection -->
366
367 <xsl:template match="glossary[@role='auto']" priority="2">
368   &setup-language-variable;
369   <xsl:variable name="terms" 
370                 select="//glossterm[not(parent::glossdef)]|//firstterm"/>
371   <xsl:variable name="collection" select="document($glossary.collection, .)"/>
372
373   <xsl:call-template name="id.warning"/>
374
375   <xsl:if test="$glossary.collection = ''">
376     <xsl:message>
377       <xsl:text>Warning: processing automatic glossary </xsl:text>
378       <xsl:text>without a glossary.collection file.</xsl:text>
379     </xsl:message>
380   </xsl:if>
381
382   <xsl:if test="not($collection) and $glossary.collection != ''">
383     <xsl:message>
384       <xsl:text>Warning: processing automatic glossary but unable to </xsl:text>
385       <xsl:text>open glossary.collection file '</xsl:text>
386       <xsl:value-of select="$glossary.collection"/>
387       <xsl:text>'</xsl:text>
388     </xsl:message>
389   </xsl:if>
390
391   <div>
392     <xsl:apply-templates select="." mode="common.html.attributes"/>
393     <xsl:if test="$generate.id.attributes != 0">
394       <xsl:attribute name="id">
395         <xsl:call-template name="object.id"/>
396       </xsl:attribute>
397     </xsl:if>
398
399     <xsl:call-template name="glossary.titlepage"/>
400
401     <xsl:choose>
402       <xsl:when test="glossdiv and $collection//glossdiv">
403         <xsl:for-each select="$collection//glossdiv">
404           <!-- first see if there are any in this div -->
405           <xsl:variable name="exist.test">
406             <xsl:for-each select="glossentry">
407               <xsl:variable name="cterm" select="glossterm"/>
408               <xsl:if test="$terms[@baseform = $cterm or . = $cterm]">
409                 <xsl:value-of select="glossterm"/>
410               </xsl:if>
411             </xsl:for-each>
412           </xsl:variable>
413
414           <xsl:if test="$exist.test != ''">
415             <xsl:apply-templates select="." mode="auto-glossary">
416               <xsl:with-param name="terms" select="$terms"/>
417             </xsl:apply-templates>
418           </xsl:if>
419         </xsl:for-each>
420       </xsl:when>
421       <xsl:otherwise>
422         <dl>
423           <xsl:choose>
424             <xsl:when test="$glossary.sort != 0">
425               <xsl:for-each select="$collection//glossentry">
426                                 <xsl:sort lang="{$language}" select="normalize-space(translate(concat(@sortas, glossterm[not(parent::glossentry/@sortas) or parent::glossentry/@sortas = '']), &lowercase;, &uppercase;))"/>
427                 <xsl:variable name="cterm" select="glossterm"/>
428                 <xsl:if test="$terms[@baseform = $cterm or . = $cterm]">
429                   <xsl:apply-templates select="." mode="auto-glossary"/>
430                 </xsl:if>
431               </xsl:for-each>
432             </xsl:when>
433             <xsl:otherwise>
434               <xsl:for-each select="$collection//glossentry">
435                 <xsl:variable name="cterm" select="glossterm"/>
436                 <xsl:if test="$terms[@baseform = $cterm or . = $cterm]">
437                   <xsl:apply-templates select="." mode="auto-glossary"/>
438                 </xsl:if>
439               </xsl:for-each>
440             </xsl:otherwise>
441           </xsl:choose>
442         </dl>
443       </xsl:otherwise>
444     </xsl:choose>
445
446     <xsl:if test="not(parent::article)">
447       <xsl:call-template name="process.footnotes"/>
448     </xsl:if>
449   </div>
450 </xsl:template>
451
452 <xsl:template match="*" mode="auto-glossary">
453   <!-- pop back out to the default mode for most elements -->
454   <xsl:apply-templates select="."/>
455 </xsl:template>
456
457 <xsl:template match="glossdiv" mode="auto-glossary">
458   <xsl:param name="terms" select="."/>
459
460   &setup-language-variable;
461
462   <div>
463     <xsl:apply-templates select="." mode="common.html.attributes"/>
464     <xsl:apply-templates select="(glossentry[1]/preceding-sibling::*)"/>
465
466     <dl>
467       <xsl:choose>
468         <xsl:when test="$glossary.sort != 0">
469           <xsl:for-each select="glossentry">
470                                 <xsl:sort lang="{$language}" select="normalize-space(translate(concat(@sortas, glossterm[not(parent::glossentry/@sortas) or parent::glossentry/@sortas = '']), &lowercase;, &uppercase;))"/>!
471             <xsl:variable name="cterm" select="glossterm"/>
472             <xsl:if test="$terms[@baseform = $cterm or . = $cterm]">
473               <xsl:apply-templates select="." mode="auto-glossary"/>
474             </xsl:if>
475           </xsl:for-each>
476         </xsl:when>
477         <xsl:otherwise>
478           <xsl:for-each select="glossentry">
479             <xsl:variable name="cterm" select="glossterm"/>
480             <xsl:if test="$terms[@baseform = $cterm or . = $cterm]">
481               <xsl:apply-templates select="." mode="auto-glossary"/>
482             </xsl:if>
483           </xsl:for-each>
484         </xsl:otherwise>
485       </xsl:choose>
486     </dl>
487   </div>
488 </xsl:template>
489
490 <!-- ==================================================================== -->
491
492 </xsl:stylesheet>