source: rfc2629xslt/rfc2629toFO.xslt @ 729

Last change on this file since 729 was 704, checked in by julian.reschke@…, 10 years ago

Bump up document dates, update to latest versions of rfc2629.xslt and xml2rfc.tcl

  • Property svn:eol-style set to native
File size: 105.4 KB
Line 
1<!--
2    XSLT transformation from RFC2629 XML format to XSL-FO
3     
4    Copyright (c) 2006-2009, Julian Reschke (julian.reschke@greenbytes.de)
5    All rights reserved.
6
7    Redistribution and use in source and binary forms, with or without
8    modification, are permitted provided that the following conditions are met:
9
10    * Redistributions of source code must retain the above copyright notice,
11      this list of conditions and the following disclaimer.
12    * Redistributions in binary form must reproduce the above copyright notice,
13      this list of conditions and the following disclaimer in the documentation
14      and/or other materials provided with the distribution.
15    * Neither the name of Julian Reschke nor the names of its contributors
16      may be used to endorse or promote products derived from this software
17      without specific prior written permission.
18
19    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
20    AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21    IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
22    ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
23    LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
24    CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
25    SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
26    INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
27    CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
28    ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
29    POSSIBILITY OF SUCH DAMAGE.
30-->
31
32<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
33    version="1.0"
34
35    xmlns:ed="http://greenbytes.de/2002/rfcedit"
36    xmlns:exslt="http://exslt.org/common"
37    xmlns:fo="http://www.w3.org/1999/XSL/Format"
38    xmlns:msxsl="urn:schemas-microsoft-com:xslt"
39    xmlns:myns="mailto:julian.reschke@greenbytes.de?subject=rcf2629.xslt"
40    xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
41    xmlns:x="http://purl.org/net/xml2rfc/ext"
42
43    exclude-result-prefixes="ed exslt msxsl myns rdf x"
44>
45
46<xsl:import href="rfc2629.xslt" />
47
48<xsl:output method="xml" version="1.0" encoding="UTF-8" indent="no"/>
49
50<!-- page sizes as per <http://tools.ietf.org/html/draft-rfc-editor-rfc2223bis-08#section-3.2> -->
51<xsl:attribute-set name="page">
52  <xsl:attribute name="margin-left">1in</xsl:attribute>
53  <xsl:attribute name="margin-right">1in</xsl:attribute>
54  <xsl:attribute name="page-height">11in</xsl:attribute>
55  <xsl:attribute name="page-width">8.5in</xsl:attribute>
56</xsl:attribute-set>
57
58<xsl:attribute-set name="base">
59  <xsl:attribute name="font-family">serif</xsl:attribute>
60  <xsl:attribute name="font-size">10pt</xsl:attribute>
61</xsl:attribute-set> 
62
63<xsl:attribute-set name="h1">
64  <xsl:attribute name="font-weight">bold</xsl:attribute>
65  <xsl:attribute name="font-size">14pt</xsl:attribute>
66  <xsl:attribute name="keep-with-next">always</xsl:attribute>
67  <xsl:attribute name="space-before">14pt</xsl:attribute>
68  <xsl:attribute name="space-after">7pt</xsl:attribute>
69</xsl:attribute-set> 
70
71<xsl:attribute-set name="h2">
72  <xsl:attribute name="font-weight">bold</xsl:attribute>
73  <xsl:attribute name="font-size">12pt</xsl:attribute>
74  <xsl:attribute name="keep-with-next">always</xsl:attribute>
75  <xsl:attribute name="space-before">12pt</xsl:attribute>
76  <xsl:attribute name="space-after">6pt</xsl:attribute>
77</xsl:attribute-set> 
78
79<xsl:attribute-set name="h3">
80  <xsl:attribute name="font-weight">bold</xsl:attribute>
81  <xsl:attribute name="font-size">11pt</xsl:attribute>
82  <xsl:attribute name="keep-with-next">always</xsl:attribute>
83  <xsl:attribute name="space-before">11pt</xsl:attribute>
84  <xsl:attribute name="space-after">3pt</xsl:attribute>
85</xsl:attribute-set> 
86
87<xsl:attribute-set name="comment">
88  <xsl:attribute name="font-weight">bold</xsl:attribute>
89  <xsl:attribute name="background-color">yellow</xsl:attribute>
90</xsl:attribute-set> 
91
92<xsl:attribute-set name="external-link">
93  <xsl:attribute name="color">blue</xsl:attribute>
94  <xsl:attribute name="text-decoration">underline</xsl:attribute>
95</xsl:attribute-set>
96
97<xsl:attribute-set name="index">
98  <xsl:attribute name="font-size">9pt</xsl:attribute>
99</xsl:attribute-set> 
100
101<xsl:attribute-set name="internal-link">
102  <xsl:attribute name="color">#000080</xsl:attribute>
103</xsl:attribute-set>
104
105<xsl:attribute-set name="newpage">
106  <xsl:attribute name="page-break-before">
107    <xsl:choose>
108      <xsl:when test="$xml2rfc-ext-duplex='yes'">right</xsl:when>
109      <xsl:otherwise>always</xsl:otherwise>
110    </xsl:choose>
111  </xsl:attribute>
112</xsl:attribute-set> 
113
114<xsl:attribute-set name="title">
115  <xsl:attribute name="text-align">center</xsl:attribute>
116  <xsl:attribute name="font-weight">bold</xsl:attribute>
117  <xsl:attribute name="font-size">18pt</xsl:attribute>
118  <xsl:attribute name="space-before">3em</xsl:attribute>
119  <xsl:attribute name="space-after">3em</xsl:attribute>
120</xsl:attribute-set>
121
122<xsl:template match="abstract">
123  <fo:block xsl:use-attribute-sets="h1" id="{concat($anchor-prefix,'.abstract')}">Abstract</fo:block>
124  <xsl:apply-templates />
125</xsl:template>
126
127<!-- optimize empty lines starting artwork -->
128<xsl:template match="artwork/text()[0=count(preceding-sibling::node())]">
129  <xsl:choose>
130    <xsl:when test="substring(.,1,1)='&#10;'">
131      <xsl:value-of select="substring(.,2)" />
132    </xsl:when>
133    <xsl:otherwise>
134      <xsl:value-of select="." />
135    </xsl:otherwise>
136  </xsl:choose>
137</xsl:template>
138
139<xsl:template name="add-artwork-attr">
140  <xsl:choose>
141    <xsl:when test="@type='abnf' or @type='abnf2045' or @type='abnf2616' or @type='application/xml-dtd' or @type='application/relax-ng-compact-syntax'">
142      <!-- just display inline -->
143    </xsl:when>
144
145    <xsl:when test="starts-with(@type,'message/http') and contains(@type,'msgtype=&quot;request&quot;')">
146      <xsl:attribute name="background-color">#f0f0f0</xsl:attribute>
147      <xsl:attribute name="border-style">dotted</xsl:attribute>
148      <xsl:attribute name="border-width">thin</xsl:attribute>
149    </xsl:when>
150
151    <xsl:when test="starts-with(@type,'message/http')">
152      <xsl:attribute name="background-color">#f8f8f8</xsl:attribute>
153      <xsl:attribute name="border-style">dotted</xsl:attribute>
154      <xsl:attribute name="border-width">thin</xsl:attribute>
155    </xsl:when>
156
157    <xsl:when test="starts-with(@type,'text/plain') or @type='example' or @type='code'">
158      <xsl:attribute name="background-color">#f8f8f8</xsl:attribute>
159      <xsl:attribute name="border-style">dotted</xsl:attribute>
160      <xsl:attribute name="border-width">thin</xsl:attribute>
161    </xsl:when>
162
163    <xsl:otherwise>
164      <xsl:attribute name="background-color">#dddddd</xsl:attribute>
165      <xsl:attribute name="font-size">9pt</xsl:attribute>
166    </xsl:otherwise>
167  </xsl:choose>
168 
169  <xsl:choose>
170    <xsl:when test="@align='center'">
171      <xsl:attribute name="text-align">center</xsl:attribute>
172    </xsl:when>
173    <xsl:when test="@align='right'">
174      <xsl:attribute name="text-align">right</xsl:attribute>
175    </xsl:when>
176    <xsl:otherwise/>
177  </xsl:choose>
178</xsl:template>
179
180<xsl:template match="artwork">
181  <xsl:if test="@x:isCodeComponent='yes'">
182    <fo:block font-family="monospace" color="gray">&lt;CODE BEGINS></fo:block>
183  </xsl:if>
184  <fo:block font-family="monospace" padding=".5em"
185    white-space-treatment="preserve" linefeed-treatment="preserve"
186    white-space-collapse="false" page-break-inside="avoid">
187    <xsl:call-template name="add-artwork-attr"/>
188    <xsl:apply-templates/>
189  </fo:block>
190  <xsl:if test="@x:isCodeComponent='yes'">
191    <fo:block font-family="monospace" color="gray">&lt;CODE ENDS></fo:block>
192  </xsl:if>
193</xsl:template>
194
195<xsl:template match="artwork[@src and starts-with(@type,'image/')]">
196  <fo:block>
197    <xsl:choose>
198      <xsl:when test="@align='center'">
199        <xsl:attribute name="text-align">center</xsl:attribute>
200      </xsl:when>
201      <xsl:when test="@align='right'">
202        <xsl:attribute name="text-align">right</xsl:attribute>
203      </xsl:when>
204      <xsl:otherwise/>
205    </xsl:choose>
206    <fo:external-graphic scaling-method="integer-pixels" src="url({@src})">
207    </fo:external-graphic>
208  </fo:block>
209</xsl:template>
210
211<xsl:template match="author">
212  <fo:block start-indent="2em" space-before=".5em" space-after=".5em">
213    <fo:block>
214      <fo:wrapper font-weight="bold"><xsl:value-of select="@fullname" /></fo:wrapper>
215      <xsl:if test="@role">
216        <fo:wrapper> (<xsl:value-of select="@role" />)</fo:wrapper>
217      </xsl:if>
218    </fo:block>
219    <fo:block><xsl:value-of select="organization" /></fo:block>
220    <xsl:for-each select="address/postal/street">
221      <fo:block><xsl:value-of select="." /></fo:block>
222    </xsl:for-each>
223    <xsl:if test="address/postal/city">
224      <fo:block><xsl:value-of select="concat(address/postal/city,', ',address/postal/region,' ',address/postal/code)" /></fo:block>
225    </xsl:if>
226    <xsl:if test="address/postal/country">
227      <fo:block><xsl:value-of select="address/postal/country" /></fo:block>
228    </xsl:if>
229    <xsl:if test="address/phone">
230      <fo:block>Phone:&#0160;<fo:basic-link external-destination="url('tel:{translate(address/phone,' ','')}')" xsl:use-attribute-sets="external-link"><xsl:value-of select="address/phone" /></fo:basic-link></fo:block>
231    </xsl:if>
232    <xsl:if test="address/facsimile">
233      <fo:block>Fax:&#0160;<fo:basic-link external-destination="url('tel:{translate(address/facsimile,' ','')}')" xsl:use-attribute-sets="external-link"><xsl:value-of select="address/facsimile" /></fo:basic-link></fo:block>
234    </xsl:if>
235    <xsl:for-each select="address/email">
236      <xsl:variable name="email">
237        <xsl:call-template name="extract-email"/>
238      </xsl:variable>
239      <fo:block>EMail:&#0160;
240        <xsl:choose>
241          <xsl:when test="$xml2rfc-linkmailto='no'">
242              <xsl:value-of select="$email" />
243          </xsl:when>
244          <xsl:otherwise>
245            <fo:basic-link external-destination="url('mailto:{$email}')" xsl:use-attribute-sets="external-link"><xsl:value-of select="$email" /></fo:basic-link>
246          </xsl:otherwise>
247        </xsl:choose>
248      </fo:block>
249    </xsl:for-each>
250    <xsl:for-each select="address/uri">
251      <xsl:variable name="uri">
252        <xsl:call-template name="extract-uri"/>
253      </xsl:variable>
254      <fo:block>URI:&#0160;<fo:basic-link external-destination="url('{$uri}')" xsl:use-attribute-sets="external-link"><xsl:value-of select="$uri" /></fo:basic-link></fo:block>
255    </xsl:for-each>
256  </fo:block>
257</xsl:template>
258
259<xsl:template match="back">
260  <!-- done in parent template -->
261</xsl:template>
262
263
264<xsl:template match="figure">
265
266  <xsl:variable name="anch">
267    <xsl:call-template name="get-figure-anchor"/>
268  </xsl:variable>
269
270  <fo:block space-before=".5em" space-after=".5em" id="{$anch}" page-break-inside="avoid">
271    <xsl:if test="not(ancestor::t)">
272      <xsl:attribute name="start-indent">2em</xsl:attribute>
273    </xsl:if>
274    <xsl:call-template name="add-anchor"/>
275    <xsl:apply-templates />
276    <xsl:if test="(@title!='' or @anchor!='') and not(@suppress-title='true')">
277      <xsl:variable name="n"><xsl:number level="any" count="figure[(@title!='' or @anchor!='') and not(@suppress-title='true')]" /></xsl:variable>
278      <fo:block text-align="center" space-before=".5em" space-after="1em">Figure <xsl:value-of select="$n"/><xsl:if test="@title!=''">: <xsl:value-of select="@title" /></xsl:if></fo:block>
279    </xsl:if>
280  </fo:block>
281</xsl:template>
282           
283<xsl:template match="front">
284
285  <xsl:if test="$xml2rfc-topblock!='no'">
286    <!-- collect information for left column -->
287     
288    <xsl:variable name="leftColumn">
289      <xsl:call-template name="collectLeftHeaderColumn" /> 
290    </xsl:variable>
291 
292    <!-- collect information for right column -->
293     
294    <xsl:variable name="rightColumn">
295      <xsl:call-template name="collectRightHeaderColumn" />   
296    </xsl:variable>
297     
298      <!-- insert the collected information -->
299     
300    <fo:table width="100%" table-layout="fixed">
301      <fo:table-column column-width="proportional-column-width(1)" />
302      <fo:table-column column-width="proportional-column-width(1)" />
303      <fo:table-body>
304        <xsl:choose>
305          <xsl:when test="function-available('exslt:node-set')">
306             <xsl:call-template name="emitheader">
307               <xsl:with-param name="lc" select="exslt:node-set($leftColumn)" />   
308               <xsl:with-param name="rc" select="exslt:node-set($rightColumn)" />   
309            </xsl:call-template>
310          </xsl:when>   
311          <xsl:otherwise>   
312             <xsl:call-template name="emitheader">
313               <xsl:with-param name="lc" select="$leftColumn" />   
314               <xsl:with-param name="rc" select="$rightColumn" />   
315            </xsl:call-template>
316          </xsl:otherwise>   
317        </xsl:choose>
318      </fo:table-body>
319    </fo:table>
320  </xsl:if>
321     
322  <fo:block xsl:use-attribute-sets="title">
323    <xsl:apply-templates select="/rfc/front/title" mode="get-text-content" />
324    <xsl:if test="/rfc/@docName">
325      <fo:block font-size="80%"><xsl:value-of select="/rfc/@docName" /></fo:block>
326    </xsl:if>
327  </fo:block>
328 
329  <xsl:if test="$xml2rfc-private='' and not($abstract-first)">
330    <xsl:call-template name="emit-ietf-preamble"/>
331  </xsl:if>
332 
333  <xsl:apply-templates select="x:boilerplate"/>
334  <xsl:apply-templates select="abstract" />
335  <xsl:apply-templates select="note" />
336
337  <xsl:if test="$xml2rfc-private='' and $abstract-first">
338    <xsl:call-template name="emit-ietf-preamble"/>
339  </xsl:if>
340
341  <xsl:if test="$xml2rfc-toc='yes'">
342    <xsl:apply-templates select="/" mode="toc" />
343    <!--<xsl:call-template name="insertTocAppendix" />-->
344  </xsl:if>
345
346</xsl:template>
347   
348<xsl:template match="eref[node()]">
349  <fo:basic-link external-destination="url('{@target}')" xsl:use-attribute-sets="external-link">
350    <xsl:apply-templates />
351  </fo:basic-link>
352  <fo:footnote>
353    <fo:inline font-size="6pt" vertical-align="super"><xsl:number level="any" count="eref[node()]" /></fo:inline>
354    <fo:footnote-body>
355      <fo:block font-size="8pt" start-indent="2em" text-align="left">
356        <fo:inline font-size="6pt" vertical-align="super"><xsl:number level="any" count="eref[node()]" /></fo:inline>
357        <xsl:text> </xsl:text>
358        <xsl:value-of select="@target" />
359      </fo:block>
360    </fo:footnote-body>
361  </fo:footnote>
362</xsl:template>
363
364<xsl:template match="eref[not(node())]">
365  <xsl:text>&lt;</xsl:text>
366  <fo:basic-link external-destination="url('{@target}')" xsl:use-attribute-sets="external-link">
367    <xsl:call-template name="format-uri">
368      <xsl:with-param name="s" select="@target"/>
369    </xsl:call-template>
370  </fo:basic-link>
371  <xsl:text>&gt;</xsl:text>
372</xsl:template>
373
374<!-- processed in a later stage -->
375<xsl:template match="iref[not(ancestor::t) and not(parent::section)]">
376  <fo:block>
377    <xsl:attribute name="id"><xsl:value-of select="$anchor-prefix" />.iref.<xsl:number level="any"/></xsl:attribute>
378    <xsl:choose>
379      <xsl:when test="@primary='true'">
380        <xsl:attribute name="index-key">
381          <xsl:value-of select="concat('item=',@item,',subitem=',@subitem,',primary')"/>
382        </xsl:attribute>
383      </xsl:when>
384      <xsl:otherwise>
385        <xsl:attribute name="index-key">
386          <xsl:value-of select="concat('item=',@item,',subitem=',@subitem)"/>
387        </xsl:attribute>
388      </xsl:otherwise>
389    </xsl:choose>
390  </fo:block>
391</xsl:template>
392
393<xsl:template match="iref[parent::section]">
394  <!-- processed on section level -->
395</xsl:template>
396
397<xsl:template match="iref[ancestor::t and not(parent::section)]">
398  <fo:inline>
399    <xsl:attribute name="id"><xsl:value-of select="$anchor-prefix" />.iref.<xsl:number level="any"/></xsl:attribute>
400    <xsl:choose>
401      <xsl:when test="@primary='true'">
402        <xsl:attribute name="index-key">
403          <xsl:value-of select="concat('item=',@item,',subitem=',@subitem,',primary')"/>
404        </xsl:attribute>
405      </xsl:when>
406      <xsl:otherwise>
407        <xsl:attribute name="index-key">
408          <xsl:value-of select="concat('item=',@item,',subitem=',@subitem)"/>
409        </xsl:attribute>
410      </xsl:otherwise>
411    </xsl:choose>
412  </fo:inline>
413</xsl:template>
414
415<xsl:template match="iref" mode="iref-start">
416  <fo:index-range-begin>
417    <xsl:attribute name="id"><xsl:value-of select="$anchor-prefix" />.iref.<xsl:number level="any"/></xsl:attribute>
418    <xsl:choose>
419      <xsl:when test="@primary='true'">
420        <xsl:attribute name="index-key">
421          <xsl:value-of select="concat('item=',@item,',subitem=',@subitem,',primary')"/>
422        </xsl:attribute>
423      </xsl:when>
424      <xsl:otherwise>
425        <xsl:attribute name="index-key">
426          <xsl:value-of select="concat('item=',@item,',subitem=',@subitem)"/>
427        </xsl:attribute>
428      </xsl:otherwise>
429    </xsl:choose>
430  </fo:index-range-begin>
431</xsl:template>
432
433<xsl:template match="iref" mode="iref-end">
434  <fo:index-range-end>
435    <xsl:attribute name="ref-id"><xsl:value-of select="$anchor-prefix" />.iref.<xsl:number level="any"/></xsl:attribute>
436  </fo:index-range-end>
437</xsl:template>
438
439<xsl:template match="list[@style='hanging']" priority="1">
440
441  <xsl:variable name="width">
442    <xsl:choose>
443      <xsl:when test="@x:indent">
444        <xsl:value-of select="@x:indent"/>
445      </xsl:when>
446      <xsl:otherwise>
447        <!-- find longest label and use it to calculate indentation-->
448        <xsl:variable name="l">
449          <xsl:for-each select="t">
450            <xsl:sort select="string-length(@hangText)" order="descending" data-type="number"/>
451            <xsl:if test="position()=1">
452              <xsl:value-of select="@hangText" />
453            </xsl:if>
454          </xsl:for-each>
455        </xsl:variable>
456        <xsl:value-of select="concat(format-number(string-length($l) * 0.8, '#.0'),'em')"/>
457      </xsl:otherwise>
458    </xsl:choose>
459  </xsl:variable>
460
461  <fo:list-block provisional-distance-between-starts="{$width}">
462    <xsl:apply-templates />
463  </fo:list-block>
464</xsl:template>
465
466<xsl:template match="list[@style='hanging']/x:lt" priority="1">
467  <fo:list-item space-before=".25em" space-after=".25em">
468    <xsl:call-template name="copy-anchor"/>
469    <fo:list-item-label end-indent="label-end()"><fo:block><xsl:value-of select="@hangText" /></fo:block></fo:list-item-label>
470    <fo:list-item-body start-indent="body-start()">
471      <xsl:for-each select="t">
472        <fo:block>
473          <xsl:if test="position()!=1">
474            <xsl:attribute name="space-before">.25em</xsl:attribute>
475          </xsl:if>
476          <xsl:apply-templates />
477        </fo:block>
478      </xsl:for-each>
479    </fo:list-item-body>
480  </fo:list-item>
481</xsl:template>
482
483<xsl:template match="list[@style='hanging']/t | list[@style='hanging']/ed:replace/ed:ins/t" priority="1">
484  <fo:list-item space-before=".25em" space-after=".25em">
485    <xsl:call-template name="copy-anchor"/>
486    <fo:list-item-label end-indent="label-end()"><fo:block><xsl:value-of select="@hangText" /></fo:block></fo:list-item-label>
487    <fo:list-item-body start-indent="body-start()"><fo:block><xsl:apply-templates /></fo:block></fo:list-item-body>
488  </fo:list-item>
489</xsl:template>
490
491<xsl:template match="list[@style='symbols']" priority="1">
492  <fo:list-block provisional-distance-between-starts="1.5em">
493    <xsl:apply-templates />
494  </fo:list-block>
495</xsl:template>
496
497<xsl:template match="list[@style='symbols']/t" priority="1">
498  <fo:list-item space-before=".25em" space-after=".25em">
499    <xsl:call-template name="copy-anchor"/>
500    <fo:list-item-label end-indent="label-end()"><fo:block>&#x2022;</fo:block></fo:list-item-label>
501    <fo:list-item-body start-indent="body-start()"><fo:block><xsl:apply-templates /></fo:block></fo:list-item-body>
502  </fo:list-item>
503</xsl:template>
504
505<xsl:template match="list[@style='symbols']/x:lt" priority="1">
506  <fo:list-item space-before=".25em" space-after=".25em">
507    <xsl:call-template name="copy-anchor"/>
508    <fo:list-item-label end-indent="label-end()"><fo:block>&#x2022;</fo:block></fo:list-item-label>
509    <fo:list-item-body start-indent="body-start()">
510      <xsl:for-each select="t">
511        <fo:block>
512          <xsl:if test="position()!=1">
513            <xsl:attribute name="space-before">.25em</xsl:attribute>
514          </xsl:if>
515          <xsl:apply-templates />
516        </fo:block>
517      </xsl:for-each>
518    </fo:list-item-body>
519  </fo:list-item>
520</xsl:template>
521
522<xsl:template match="list">
523  <xsl:if test="@style!='' and @style!='empty' and @style">
524    <xsl:call-template name="warning">
525      <xsl:with-param name="inline" select="'no'"/>
526      <xsl:with-param name="msg">unknown style '<xsl:value-of select="@style"/>' for list, continueing with default format.</xsl:with-param>
527    </xsl:call-template>
528  </xsl:if>
529  <fo:list-block provisional-distance-between-starts="2em">
530    <xsl:apply-templates />
531  </fo:list-block>
532</xsl:template>
533
534<xsl:template match="list/t">
535  <fo:list-item space-before=".25em" space-after=".25em">
536    <xsl:call-template name="copy-anchor"/>
537    <fo:list-item-label end-indent="label-end()"><fo:block></fo:block></fo:list-item-label>
538    <fo:list-item-body start-indent="body-start()"><fo:block><xsl:apply-templates /></fo:block></fo:list-item-body>
539  </fo:list-item>
540</xsl:template>
541
542<xsl:template match="list[@style='numbers' or @style='letters']" priority="1">
543  <fo:list-block provisional-distance-between-starts="1.5em">
544    <xsl:apply-templates />
545  </fo:list-block>
546</xsl:template>
547
548<xsl:template match="list[@style='numbers' or @style='letters']/t" priority="1">
549  <fo:list-item space-before=".25em" space-after=".25em">
550    <xsl:call-template name="copy-anchor"/>
551    <fo:list-item-label end-indent="label-end()">
552      <fo:block>
553        <xsl:choose>
554          <xsl:when test="ancestor::list/@style='numbers'"><xsl:number/>.</xsl:when>
555          <xsl:when test="ancestor::list/@style='letters'"><xsl:number format="a"/>.</xsl:when>
556          <xsl:otherwise>???</xsl:otherwise>
557        </xsl:choose>
558      </fo:block>
559    </fo:list-item-label>
560    <fo:list-item-body start-indent="body-start()"><fo:block><xsl:apply-templates /></fo:block></fo:list-item-body>
561  </fo:list-item>
562</xsl:template>
563
564<xsl:template match="list[@style='numbers' or @style='letters']/x:lt" priority="1">
565  <fo:list-item space-before=".25em" space-after=".25em">
566    <xsl:call-template name="copy-anchor"/>
567    <fo:list-item-label end-indent="label-end()">
568      <fo:block>
569        <xsl:choose>
570          <xsl:when test="ancestor::list/@style='numbers'"><xsl:number/>.</xsl:when>
571          <xsl:when test="ancestor::list/@style='letters'"><xsl:number format="a"/>.</xsl:when>
572          <xsl:otherwise>???</xsl:otherwise>
573        </xsl:choose>
574      </fo:block>
575    </fo:list-item-label>
576    <fo:list-item-body start-indent="body-start()">
577      <xsl:for-each select="t">
578        <fo:block>
579          <xsl:if test="position()!=1">
580            <xsl:attribute name="space-before">.25em</xsl:attribute>
581          </xsl:if>
582          <xsl:apply-templates />
583        </fo:block>
584      </xsl:for-each>
585    </fo:list-item-body>
586  </fo:list-item>
587</xsl:template>
588
589<!-- special case: nested -->
590<xsl:template match="list//t//list[@style='letters']/t" priority="9">
591  <fo:list-item space-before=".25em" space-after=".25em">
592    <xsl:call-template name="copy-anchor"/>
593    <fo:list-item-label end-indent="label-end()"><fo:block><xsl:number format="A"/>.</fo:block></fo:list-item-label>
594    <fo:list-item-body start-indent="body-start()"><fo:block><xsl:apply-templates /></fo:block></fo:list-item-body>
595  </fo:list-item>
596</xsl:template>
597
598<xsl:template match="list[starts-with(@style,'format ')]" priority="1">
599  <fo:list-block provisional-distance-between-starts="{string-length(@style) - string-length('format ')}em">
600    <xsl:apply-templates />
601  </fo:list-block>
602</xsl:template>
603
604<xsl:template match="list[starts-with(@style,'format ') and (contains(@style,'%c') or contains(@style,'%d'))]/t" priority="1">
605  <xsl:variable name="list" select=".." />
606  <xsl:variable name="format" select="substring-after(../@style,'format ')" />
607  <xsl:variable name="pos">
608    <xsl:choose>
609      <xsl:when test="$list/@counter">
610        <xsl:number level="any" count="list[@counter=$list/@counter or (not(@counter) and @style=concat('format ',$list/@counter))]/t" />
611      </xsl:when>
612      <xsl:otherwise>
613        <xsl:number level="any" count="list[concat('format ',@counter)=$list/@style or (not(@counter) and @style=$list/@style)]/t" />
614      </xsl:otherwise>
615    </xsl:choose>
616  </xsl:variable>
617  <fo:list-item space-before=".25em" space-after=".25em">
618    <xsl:call-template name="copy-anchor"/>
619    <fo:list-item-label end-indent="label-end()">
620      <fo:block>
621        <xsl:choose>
622          <xsl:when test="contains($format,'%c')">
623            <xsl:value-of select="substring-before($format,'%c')"/><xsl:number value="$pos" format="a" /><xsl:value-of select="substring-after($format,'%c')"/>
624          </xsl:when>
625          <xsl:otherwise>
626            <xsl:value-of select="substring-before($format,'%d')"/><xsl:number value="$pos" format="1" /><xsl:value-of select="substring-after($format,'%d')"/>
627          </xsl:otherwise>
628        </xsl:choose>
629      </fo:block>
630    </fo:list-item-label>
631    <fo:list-item-body start-indent="body-start()">
632      <fo:block>
633        <xsl:apply-templates />
634      </fo:block>
635    </fo:list-item-body>
636  </fo:list-item>
637</xsl:template>
638
639<xsl:template match="middle">
640  <xsl:apply-templates />
641</xsl:template>
642               
643<xsl:template match="note">
644  <xsl:variable name="num"><xsl:number count="note"/></xsl:variable>
645  <fo:block xsl:use-attribute-sets="h1" id="{concat($anchor-prefix,'.note.',$num)}"><xsl:value-of select="@title" /></fo:block>
646  <xsl:apply-templates />
647</xsl:template>
648
649<xsl:template match="preamble">
650  <fo:block space-after=".5em">
651    <xsl:call-template name="copy-anchor"/>
652    <xsl:apply-templates />
653  </fo:block>
654</xsl:template>
655
656<xsl:template match="postamble">
657  <fo:block space-before=".5em"><xsl:apply-templates /></fo:block>
658</xsl:template>
659
660<xsl:template match="reference">
661
662  <xsl:variable name="target">
663    <xsl:choose>
664      <xsl:when test="@target"><xsl:value-of select="@target" /></xsl:when>
665      <xsl:when test="seriesInfo/@name='RFC'"><xsl:value-of select="concat($rfcUrlPrefix,seriesInfo[@name='RFC']/@value,'.txt')" /></xsl:when>
666      <xsl:when test="seriesInfo[starts-with(.,'RFC')]">
667        <xsl:variable name="rfcRef" select="seriesInfo[starts-with(.,'RFC')]" />
668        <xsl:value-of select="concat($rfcUrlPrefix,substring-after (normalize-space($rfcRef), ' '),'.txt')" />
669      </xsl:when>
670      <xsl:otherwise />
671    </xsl:choose>
672  </xsl:variable>
673
674  <fo:list-item space-after=".5em">
675    <fo:list-item-label end-indent="label-end()">
676      <fo:block id="{@anchor}">
677        <xsl:if test="$xml2rfc-ext-include-references-in-index='yes'">
678          <xsl:attribute name="index-key">
679            <xsl:value-of select="concat('xrefitem=',@anchor)"/>
680          </xsl:attribute>
681        </xsl:if>
682        <xsl:call-template name="referencename">
683          <xsl:with-param name="node" select="." />
684        </xsl:call-template>
685      </fo:block>
686    </fo:list-item-label>
687   
688    <fo:list-item-body start-indent="body-start()"><fo:block>
689
690      <xsl:for-each select="front/author">
691        <xsl:variable name="initials">
692          <xsl:call-template name="format-initials"/>
693        </xsl:variable>
694        <xsl:choose>
695          <xsl:when test="@surname and @surname!=''">
696            <xsl:choose>
697              <xsl:when test="@surname and position()=last() and position()!=1">
698                <xsl:value-of select="concat($initials,' ',@surname)" />
699              </xsl:when>
700              <xsl:when test="@surname">
701                <xsl:value-of select="concat(@surname,', ',$initials)" />
702              </xsl:when>
703              <xsl:when test="organization/text()">
704                <xsl:value-of select="organization" />
705              </xsl:when>
706              <xsl:otherwise />
707            </xsl:choose>
708            <xsl:if test="@role='editor'">
709              <xsl:text>, Ed.</xsl:text>
710            </xsl:if>
711            <xsl:choose>
712              <xsl:when test="position()=last() - 1">
713                <xsl:if test="last() &gt; 2">,</xsl:if>
714                <xsl:text> and </xsl:text>
715              </xsl:when>
716              <xsl:otherwise>
717                <xsl:text>, </xsl:text>
718              </xsl:otherwise>
719            </xsl:choose>
720          </xsl:when>
721          <xsl:when test="organization/text()">
722            <xsl:value-of select="organization" />
723            <xsl:choose>
724              <xsl:when test="position()=last() - 1">
725                <xsl:if test="last() &gt; 2">,</xsl:if>
726                <xsl:text> and </xsl:text>
727              </xsl:when>
728              <xsl:otherwise>
729                <xsl:text>, </xsl:text>
730              </xsl:otherwise>
731            </xsl:choose>
732          </xsl:when>
733          <xsl:otherwise />
734        </xsl:choose>
735      </xsl:for-each>
736
737      <xsl:text>"</xsl:text>
738      <xsl:choose>
739        <xsl:when test="string-length($target) &gt; 0">
740          <fo:basic-link external-destination="url('{$target}')" xsl:use-attribute-sets="external-link"><xsl:value-of select="normalize-space(front/title)" /></fo:basic-link>
741        </xsl:when>
742        <xsl:otherwise>
743          <xsl:value-of select="normalize-space(front/title)" />
744        </xsl:otherwise>
745      </xsl:choose>
746      <xsl:text>"</xsl:text>
747     
748      <xsl:for-each select="seriesInfo">
749        <xsl:text>, </xsl:text>
750        <xsl:choose>
751          <xsl:when test="not(@name) and not(@value) and ./text()"><xsl:value-of select="." /></xsl:when>
752          <xsl:otherwise>
753            <xsl:value-of select="@name" />
754            <xsl:if test="@value!=''">&#0160;<xsl:value-of select="@value" /></xsl:if>
755            <xsl:if test="translate(@name,$ucase,$lcase)='internet-draft'"> (work in progress)</xsl:if>
756          </xsl:otherwise>
757        </xsl:choose>
758      </xsl:for-each>
759
760      <xsl:if test="front/date/@year!=''">
761        <xsl:text>, </xsl:text>
762        <xsl:value-of select="front/date/@month" />&#0160;<xsl:value-of select="front/date/@year" />
763      </xsl:if>
764     
765      <xsl:if test="@target">
766        <xsl:text>, &lt;</xsl:text>
767        <xsl:call-template name="format-uri">
768          <xsl:with-param name="s" select="@target"/>
769        </xsl:call-template>
770        <xsl:text>&gt;</xsl:text>
771      </xsl:if>
772
773      <xsl:text>.</xsl:text>
774     
775      <xsl:for-each select="annotation">
776        <fo:block><xsl:apply-templates /></fo:block>
777      </xsl:for-each>
778     
779    </fo:block></fo:list-item-body>
780  </fo:list-item>
781</xsl:template>
782
783<xsl:template match="references">
784
785  <xsl:variable name="name">
786    <xsl:number/>     
787  </xsl:variable>
788
789  <!-- insert pseudo section when needed -->
790  <xsl:if test="$name='1' and count(/*/back/references)!=1">
791    <fo:block id="{$anchor-prefix}.references" xsl:use-attribute-sets="h1">
792      <xsl:if test="$name='1'">
793        <xsl:attribute name="page-break-before">always</xsl:attribute>
794      </xsl:if>
795      <xsl:variable name="sectionNumber">
796        <xsl:call-template name="get-references-section-number"/>
797      </xsl:variable>
798      <xsl:call-template name="emit-section-number">
799        <xsl:with-param name="no" select="$sectionNumber"/>
800      </xsl:call-template>
801      <xsl:text>&#160;&#160;</xsl:text>
802      <xsl:value-of select="$xml2rfc-refparent"/>
803    </fo:block>
804  </xsl:if>
805
806  <xsl:choose>
807    <xsl:when test="count(/*/back/references)=1">
808      <fo:block id="{$anchor-prefix}.references" xsl:use-attribute-sets="h1 newpage">
809        <xsl:variable name="sectionNumber">
810          <xsl:call-template name="get-section-number"/>
811        </xsl:variable>
812        <xsl:call-template name="emit-section-number">
813          <xsl:with-param name="no" select="$sectionNumber"/>
814        </xsl:call-template>
815        <xsl:text>&#160;&#160;</xsl:text>
816        <xsl:choose>
817          <xsl:when test="@title!=''"><xsl:value-of select="@title"/></xsl:when>
818          <xsl:otherwise><xsl:value-of select="$xml2rfc-refparent"/></xsl:otherwise>
819        </xsl:choose>
820      </fo:block>
821    </xsl:when>
822    <xsl:otherwise>
823      <fo:block id="{$anchor-prefix}.references.{$name}" xsl:use-attribute-sets="h2">
824        <xsl:variable name="sectionNumber">
825          <xsl:call-template name="get-section-number"/>
826        </xsl:variable>
827        <xsl:call-template name="emit-section-number">
828          <xsl:with-param name="no" select="$sectionNumber"/>
829        </xsl:call-template>
830        <xsl:text>&#160;&#160;</xsl:text>
831        <xsl:choose>
832          <xsl:when test="@title!=''"><xsl:value-of select="@title"/></xsl:when>
833          <xsl:otherwise><xsl:value-of select="$xml2rfc-refparent"/></xsl:otherwise>
834        </xsl:choose>
835      </fo:block>
836    </xsl:otherwise>
837  </xsl:choose>
838
839  <!-- find longest label and use it to calculate indentation-->
840  <xsl:variable name="l">
841    <xsl:choose>
842      <xsl:when test="$xml2rfc-symrefs='no'">[99]</xsl:when>
843      <xsl:otherwise>
844        <xsl:for-each select="//reference">
845          <xsl:sort select="string-length(@anchor)" order="descending" data-type="number"/>
846          <xsl:if test="position()=1">
847            <xsl:value-of select="@anchor" />
848          </xsl:if>
849        </xsl:for-each>
850      </xsl:otherwise>
851    </xsl:choose>
852  </xsl:variable>
853
854  <fo:list-block provisional-distance-between-starts="{string-length($l) * 0.8}em">
855    <xsl:choose>
856      <xsl:when test="$xml2rfc-sortrefs='yes'">
857        <xsl:apply-templates>
858          <xsl:sort select="@anchor" />
859        </xsl:apply-templates>
860      </xsl:when>
861      <xsl:otherwise>
862        <xsl:apply-templates />
863      </xsl:otherwise>
864    </xsl:choose>
865  </fo:list-block>
866</xsl:template>
867
868<xsl:template match="rfc">
869  <fo:root xsl:use-attribute-sets="base">
870   
871    <fo:layout-master-set>
872      <fo:simple-page-master master-name="first-page" xsl:use-attribute-sets="page">
873        <fo:region-body margin-bottom="1in" margin-top="1in"/>
874         <fo:region-after extent="1cm" region-name="footer"/>
875      </fo:simple-page-master>
876      <fo:simple-page-master master-name="other-pages-right" xsl:use-attribute-sets="page">
877        <fo:region-body margin-bottom="1in" margin-top="1in" />
878        <fo:region-before extent="1cm" region-name="header-right"/>
879        <fo:region-after extent="1cm" region-name="footer-right"/>
880      </fo:simple-page-master>
881      <fo:simple-page-master master-name="other-pages-left" xsl:use-attribute-sets="page">
882        <fo:region-body margin-bottom="1in" margin-top="1in" />
883        <fo:region-before extent="1cm" region-name="header-left"/>
884        <fo:region-after extent="1cm" region-name="footer-left"/>
885      </fo:simple-page-master>
886      <fo:simple-page-master master-name="other-pages-dc-right" xsl:use-attribute-sets="page">
887        <fo:region-body margin-bottom="1in" margin-top="1in" column-count="2"/>
888        <fo:region-before extent="1cm" region-name="header-right"/>
889        <fo:region-after extent="1cm" region-name="footer-right"/>
890      </fo:simple-page-master>
891      <fo:simple-page-master master-name="other-pages-dc-left" xsl:use-attribute-sets="page">
892        <fo:region-body margin-bottom="1in" margin-top="1in" column-count="2"/>
893        <fo:region-before extent="1cm" region-name="header-left"/>
894        <fo:region-after extent="1cm" region-name="footer-left"/>
895      </fo:simple-page-master>
896      <fo:page-sequence-master master-name="sequence"> 
897        <fo:single-page-master-reference master-reference="first-page" />
898        <xsl:choose>
899          <xsl:when test="$xml2rfc-ext-duplex='yes'">
900            <fo:repeatable-page-master-alternatives>
901              <fo:conditional-page-master-reference odd-or-even="even" master-reference="other-pages-left"/>
902              <fo:conditional-page-master-reference odd-or-even="odd" master-reference="other-pages-right"/>
903            </fo:repeatable-page-master-alternatives>
904          </xsl:when>
905          <xsl:otherwise>
906            <fo:repeatable-page-master-reference master-reference="other-pages-right" /> 
907          </xsl:otherwise>
908        </xsl:choose>
909      </fo:page-sequence-master> 
910      <fo:page-sequence-master master-name="sequence-dc"> 
911        <xsl:choose>
912          <xsl:when test="$xml2rfc-ext-duplex='yes'">
913            <fo:repeatable-page-master-alternatives>
914              <fo:conditional-page-master-reference odd-or-even="even" master-reference="other-pages-dc-left"/>
915              <fo:conditional-page-master-reference odd-or-even="odd" master-reference="other-pages-dc-right"/>
916            </fo:repeatable-page-master-alternatives>
917          </xsl:when>
918          <xsl:otherwise>
919            <fo:repeatable-page-master-reference master-reference="other-pages-dc-right" /> 
920          </xsl:otherwise>
921        </xsl:choose>
922      </fo:page-sequence-master> 
923    </fo:layout-master-set>
924
925    <fo:declarations>
926      <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
927        <rdf:Description rdf:about="" xmlns:dc="http://purl.org/dc/elements/1.1/">
928          <dc:title><xsl:value-of select="/rfc/front/title"/></dc:title>
929          <dc:creator><xsl:call-template name="get-author-summary" /></dc:creator>
930          <dc:description><xsl:value-of select="normalize-space(/rfc/front/abstract)"/></dc:description>
931          <xsl:if test="/rfc/@number">
932            <dc:isPartOf>urn:ISSN:2070-1721</dc:isPartOf>
933          </xsl:if>     
934          <xsl:if test="/rfc/front/keyword" xmlns:pdf="http://ns.adobe.com/pdf/1.3/">
935            <pdf:Keywords>
936              <xsl:for-each select="/rfc/front/keyword">
937                <xsl:value-of select="."/>
938                <xsl:if test="position()!=last()">, </xsl:if>
939              </xsl:for-each>
940            </pdf:Keywords>
941          </xsl:if>
942        </rdf:Description>
943      </rdf:RDF>
944    </fo:declarations>
945   
946    <fo:bookmark-tree>
947      <xsl:apply-templates select="." mode="bookmarks" />
948    </fo:bookmark-tree>
949
950    <xsl:variable name="lang"><xsl:call-template name="get-lang"/></xsl:variable>
951
952    <fo:page-sequence master-reference="sequence" language="{$lang}">
953      <xsl:if test="$xml2rfc-ext-duplex='yes'">
954        <xsl:attribute name="force-page-count">even</xsl:attribute>
955      </xsl:if>
956
957      <xsl:call-template name="insertHeader" />
958      <xsl:call-template name="insertFooter" />
959     
960      <fo:flow flow-name="xsl-region-body">
961       
962        <!-- process front & middle section, but not back -->
963        <xsl:apply-templates />
964       
965        <!-- because it requires multiple page masters -->
966        <!-- references first -->
967        <xsl:apply-templates select="back/references" />
968       
969        <xsl:if test="$xml2rfc-ext-authors-section!='end'">
970          <xsl:call-template name="insertAuthors" />
971        </xsl:if>
972       
973        <!-- add all other top-level sections under <back> -->
974        <xsl:apply-templates select="back/*[not(self::references)]" />
975     
976      </fo:flow>
977    </fo:page-sequence>
978   
979    <xsl:if test="$has-index">
980      <fo:page-sequence master-reference="sequence-dc" language="{$lang}">
981        <xsl:if test="$xml2rfc-ext-duplex='yes'">
982          <xsl:attribute name="force-page-count">even</xsl:attribute>
983        </xsl:if>
984        <xsl:call-template name="insertHeader" />
985        <xsl:call-template name="insertFooter" />
986        <fo:flow flow-name="xsl-region-body" xsl:use-attribute-sets="index">
987          <xsl:call-template name="insertIndex" />   
988        </fo:flow>
989      </fo:page-sequence>
990    </xsl:if>
991
992    <xsl:if test="$xml2rfc-ext-authors-section='end' or ($xml2rfc-private='' and not($no-copylong))">
993      <fo:page-sequence master-reference="sequence" language="{$lang}">
994        <xsl:if test="$xml2rfc-ext-duplex='yes'">
995          <xsl:attribute name="force-page-count">even</xsl:attribute>
996        </xsl:if>
997 
998        <xsl:call-template name="insertHeader" />
999        <xsl:call-template name="insertFooter" />
1000       
1001        <fo:flow flow-name="xsl-region-body">
1002         
1003          <xsl:if test="$xml2rfc-ext-authors-section='end'">
1004            <xsl:call-template name="insertAuthors" />
1005          </xsl:if>
1006 
1007          <xsl:if test="$xml2rfc-private=''">
1008            <!-- copyright statements -->
1009            <xsl:variable name="copyright">
1010              <xsl:call-template name="insertCopyright" />
1011            </xsl:variable>
1012         
1013            <!-- emit it -->
1014            <xsl:choose>
1015              <xsl:when test="function-available('exslt:node-set')">
1016                <xsl:apply-templates select="exslt:node-set($copyright)/node()" />
1017              </xsl:when>
1018              <xsl:otherwise> <!--proceed with fingers crossed-->
1019                <xsl:variable name="temp" select="$copyright"/>
1020                <xsl:apply-templates select="$temp/node()" />
1021              </xsl:otherwise>
1022            </xsl:choose>
1023          </xsl:if>
1024         
1025        </fo:flow>
1026      </fo:page-sequence>
1027    </xsl:if>
1028   
1029  </fo:root>
1030</xsl:template>
1031
1032
1033<xsl:template name="section-maker">
1034  <xsl:variable name="sectionNumber">
1035    <xsl:choose>
1036      <xsl:when test="@myns:unnumbered"></xsl:when>
1037      <xsl:when test="ancestor::x:boilerplate"></xsl:when>
1038      <xsl:otherwise><xsl:call-template name="get-section-number" /></xsl:otherwise>
1039    </xsl:choose>
1040  </xsl:variable>
1041
1042  <xsl:if test="$sectionNumber!=''">
1043    <xsl:attribute name="id"><xsl:value-of select="concat($anchor-prefix,'.section.',$sectionNumber)"/>
1044  </xsl:attribute></xsl:if>
1045 
1046  <xsl:call-template name="add-anchor" />
1047 
1048  <xsl:if test="$sectionNumber!='' and not(contains($sectionNumber,'unnumbered-'))">
1049    <xsl:call-template name="emit-section-number">
1050      <xsl:with-param name="no" select="$sectionNumber"/>
1051    </xsl:call-template>
1052    <xsl:text>&#0160;&#0160;</xsl:text>
1053  </xsl:if>
1054  <xsl:value-of select="@title" />
1055
1056</xsl:template>
1057
1058<xsl:template match="section[count(ancestor::section) = 0 and (@myns:notoclink or ancestor::x:boilerplate)]">
1059
1060  <fo:block xsl:use-attribute-sets="h1">
1061    <xsl:call-template name="section-maker" />
1062  </fo:block>
1063
1064  <xsl:apply-templates select="iref" mode="iref-start"/>
1065  <xsl:apply-templates />
1066  <xsl:apply-templates select="iref" mode="iref-end"/>
1067</xsl:template>
1068
1069<xsl:template match="section[count(ancestor::section) = 0 and not(@myns:notoclink or ancestor::x:boilerplate)]">
1070
1071  <fo:block xsl:use-attribute-sets="h1 newpage">
1072    <xsl:call-template name="section-maker" />
1073  </fo:block>
1074
1075  <xsl:apply-templates select="iref" mode="iref-start"/>
1076  <xsl:apply-templates />
1077  <xsl:apply-templates select="iref" mode="iref-end"/>
1078</xsl:template>
1079
1080<xsl:template match="section[count(ancestor::section) = 1]">
1081  <fo:block xsl:use-attribute-sets="h2">
1082    <xsl:call-template name="section-maker" />
1083  </fo:block>
1084
1085  <xsl:apply-templates select="iref" mode="iref-start"/>
1086  <xsl:apply-templates />
1087  <xsl:apply-templates select="iref" mode="iref-end"/>
1088</xsl:template>
1089
1090<xsl:template match="section[count(ancestor::section) &gt; 1]">
1091  <fo:block xsl:use-attribute-sets="h3">
1092    <xsl:call-template name="section-maker" />
1093  </fo:block>
1094
1095  <xsl:apply-templates select="iref" mode="iref-start"/>
1096  <xsl:apply-templates />
1097  <xsl:apply-templates select="iref" mode="iref-end"/>
1098</xsl:template>
1099
1100<xsl:template match="spanx[@style='emph' or not(@style)]">
1101  <fo:wrapper font-style="italic">
1102    <xsl:call-template name="copy-anchor"/>
1103    <xsl:apply-templates />
1104  </fo:wrapper>
1105</xsl:template>
1106
1107<xsl:template match="spanx[@style='strong']">
1108  <fo:wrapper font-weight="bold">
1109    <xsl:call-template name="copy-anchor"/>
1110    <xsl:apply-templates />
1111  </fo:wrapper>
1112</xsl:template>
1113
1114<xsl:template match="spanx[@style='verb']">
1115  <fo:wrapper font-family="monospace">
1116    <xsl:call-template name="copy-anchor"/>
1117    <xsl:apply-templates/>
1118  </fo:wrapper>
1119</xsl:template>
1120
1121<xsl:template match="t">
1122  <fo:block space-before=".5em" space-after=".5em">
1123    <xsl:call-template name="insert-justification"/>
1124    <xsl:choose>
1125      <xsl:when test="parent::x:blockquote">
1126        <xsl:attribute name="start-indent">4em</xsl:attribute>
1127      </xsl:when>
1128      <xsl:when test="parent::x:note">
1129        <xsl:attribute name="start-indent">4em</xsl:attribute>
1130      </xsl:when>
1131      <xsl:otherwise>
1132        <xsl:attribute name="start-indent">2em</xsl:attribute>
1133      </xsl:otherwise>
1134    </xsl:choose>
1135    <xsl:call-template name="copy-anchor"/>
1136    <xsl:apply-templates />
1137  </fo:block>
1138</xsl:template>
1139               
1140<xsl:template match="vspace">
1141  <fo:block/>
1142</xsl:template>
1143
1144<xsl:template name="render-section-ref">
1145  <xsl:param name="from" />
1146  <xsl:param name="to" />
1147  <xsl:variable name="target" select="$from/@target" />
1148
1149  <xsl:variable name="refname">
1150    <xsl:for-each select="$to">
1151      <xsl:call-template name="get-section-type">
1152        <xsl:with-param name="prec" select="$from/preceding-sibling::node()[1]" />
1153      </xsl:call-template>
1154    </xsl:for-each>
1155  </xsl:variable>
1156  <xsl:variable name="refnum">
1157    <xsl:for-each select="$to">
1158      <xsl:call-template name="get-section-number" />
1159    </xsl:for-each>
1160  </xsl:variable>
1161  <xsl:choose>
1162    <xsl:when test="@format='counter'">
1163      <xsl:value-of select="$refnum"/>
1164    </xsl:when>
1165    <xsl:when test="@format='title'">
1166      <xsl:value-of select="$to/@title"/>
1167    </xsl:when>
1168    <xsl:otherwise>
1169      <xsl:value-of select="normalize-space(concat($refname,'&#160;',$refnum))"/>
1170    </xsl:otherwise>
1171  </xsl:choose>
1172</xsl:template>
1173
1174<xsl:template match="xref[node()]">
1175  <xsl:variable name="target" select="@target" />
1176  <xsl:variable name="node" select="//*[@anchor=$target]" />
1177  <xsl:variable name="anchor"><xsl:value-of select="$anchor-prefix"/>.xref.<xsl:value-of select="@target"/>.<xsl:number level="any" count="xref[@target=$target]"/></xsl:variable>
1178  <xsl:choose>
1179    <xsl:when test="@x:fmt='none'">
1180      <fo:basic-link internal-destination="{$target}" xsl:use-attribute-sets="internal-link">
1181        <xsl:if test="$node/self::reference and $xml2rfc-ext-include-references-in-index='yes'">
1182          <xsl:attribute name="id">
1183            <xsl:value-of select="$anchor"/>
1184          </xsl:attribute>
1185          <xsl:attribute name="index-key">
1186            <xsl:value-of select="concat('xrefitem=',@target)"/>
1187          </xsl:attribute>
1188        </xsl:if>
1189        <!-- insert id when a backlink to this xref is needed in the index -->
1190        <xsl:variable name="ireftargets" select="//iref[@x:for-anchor=$target] | //iref[@x:for-anchor='' and ../@anchor=$target]"/>
1191        <xsl:if test="$ireftargets">
1192          <xsl:attribute name="id"><xsl:value-of select="$anchor"/></xsl:attribute>
1193        </xsl:if>
1194        <xsl:for-each select="$ireftargets">
1195          <fo:wrapper index-key="{concat('item=',@item,',subitem=',@subitem)}" />
1196        </xsl:for-each>
1197        <xsl:apply-templates/>
1198      </fo:basic-link>
1199    </xsl:when>
1200   
1201    <xsl:when test="$node/self::section or $node/self::appendix">
1202      <xsl:choose>
1203        <xsl:when test="@format='none'">
1204          <fo:basic-link internal-destination="{$target}" xsl:use-attribute-sets="internal-link">
1205            <!-- insert id when a backlink to this xref is needed in the index -->
1206            <xsl:variable name="ireftargets" select="//iref[@x:for-anchor=$target] | //iref[@x:for-anchor='' and ../@anchor=$target]"/>
1207            <xsl:if test="$ireftargets">
1208              <xsl:attribute name="id"><xsl:value-of select="$anchor"/></xsl:attribute>
1209            </xsl:if>
1210            <xsl:for-each select="$ireftargets">
1211              <fo:wrapper index-key="{concat('item=',@item,',subitem=',@subitem)}" />
1212            </xsl:for-each>
1213            <xsl:apply-templates/>
1214          </fo:basic-link>
1215        </xsl:when>
1216        <xsl:otherwise>
1217          <xsl:apply-templates/>
1218          <xsl:text> (</xsl:text>
1219          <fo:basic-link internal-destination="{$target}" xsl:use-attribute-sets="internal-link">
1220            <!-- insert id when a backlink to this xref is needed in the index -->
1221            <xsl:variable name="ireftargets" select="//iref[@x:for-anchor=$target] | //iref[@x:for-anchor='' and ../@anchor=$target]"/>
1222            <xsl:if test="$ireftargets">
1223              <xsl:attribute name="id"><xsl:value-of select="$anchor"/></xsl:attribute>
1224            </xsl:if>
1225            <xsl:for-each select="$ireftargets">
1226              <fo:wrapper index-key="{concat('item=',@item,',subitem=',@subitem)}" />
1227            </xsl:for-each>
1228            <xsl:call-template name="render-section-ref">
1229              <xsl:with-param name="from" select="."/>
1230              <xsl:with-param name="to" select="$node"/>
1231            </xsl:call-template>
1232          </fo:basic-link>
1233          <xsl:text>)</xsl:text>
1234        </xsl:otherwise>
1235      </xsl:choose>
1236    </xsl:when>
1237   
1238    <xsl:otherwise>
1239      <fo:basic-link internal-destination="{$target}" xsl:use-attribute-sets="internal-link">
1240        <xsl:value-of select="." />
1241      </fo:basic-link>
1242      <xsl:if test="not(@format='none')">
1243        <xsl:for-each select="//reference[@anchor=$target]">
1244          &#160;<xsl:call-template name="referencename"><xsl:with-param name="node" select="." /></xsl:call-template>
1245        </xsl:for-each>
1246      </xsl:if>
1247    </xsl:otherwise>
1248  </xsl:choose>
1249
1250</xsl:template>
1251
1252<xsl:template match="xref[not(node())]">
1253
1254  <xsl:variable name="target" select="@target" />
1255  <xsl:variable name="anchor"><xsl:value-of select="$anchor-prefix"/>.xref.<xsl:value-of select="@target"/>.<xsl:number level="any" count="xref[@target=$target]"/></xsl:variable>
1256  <xsl:variable name="node" select="//*[@anchor=$target]" />
1257  <xsl:if test="count($node)=0 and not(ancestor::ed:del)">
1258    <xsl:message>Undefined target: <xsl:value-of select="@target" /></xsl:message>
1259    <span class="error">Undefined target: <xsl:value-of select="@target" /></span>
1260  </xsl:if>
1261
1262  <xsl:choose>
1263
1264    <!-- Section links -->
1265    <xsl:when test="$node/self::section or $node/self::appendix">
1266      <fo:basic-link internal-destination="{$target}" xsl:use-attribute-sets="internal-link">
1267        <!-- insert id when a backlink to this xref is needed in the index -->
1268        <xsl:variable name="ireftargets" select="//iref[@x:for-anchor=$target] | //iref[@x:for-anchor='' and ../@anchor=$target]"/>
1269        <xsl:if test="$ireftargets">
1270          <xsl:attribute name="id"><xsl:value-of select="$anchor"/></xsl:attribute>
1271        </xsl:if>
1272        <xsl:for-each select="$ireftargets">
1273          <fo:wrapper index-key="{concat('item=',@item,',subitem=',@subitem)}" />
1274        </xsl:for-each>
1275        <xsl:call-template name="render-section-ref">
1276          <xsl:with-param name="from" select="."/>
1277          <xsl:with-param name="to" select="$node"/>
1278        </xsl:call-template>
1279      </fo:basic-link>
1280    </xsl:when>
1281
1282    <!-- Figure links -->
1283    <xsl:when test="$node//self::figure">
1284      <fo:basic-link internal-destination="{$target}" xsl:use-attribute-sets="internal-link">
1285        <xsl:variable name="figcnt">
1286          <xsl:for-each select="$node">
1287            <xsl:number level="any" count="figure[(@title!='' or @anchor!='') and not(@suppress-title='true')]" />
1288          </xsl:for-each>
1289        </xsl:variable>
1290        <xsl:choose>
1291          <xsl:when test="@format='counter'">
1292            <xsl:value-of select="$figcnt" />
1293          </xsl:when>
1294          <xsl:when test="@format='title'">
1295            <xsl:value-of select="$node/@title" />
1296          </xsl:when>
1297          <xsl:otherwise>
1298            <xsl:value-of select="normalize-space(concat('Figure&#160;',$figcnt))"/>
1299          </xsl:otherwise>
1300        </xsl:choose>
1301      </fo:basic-link>
1302    </xsl:when>
1303
1304    <!-- Table links -->
1305    <xsl:when test="$node/self::texttable">
1306      <fo:basic-link internal-destination="{$target}" xsl:use-attribute-sets="internal-link">
1307        <xsl:variable name="tabcnt">
1308          <xsl:for-each select="$node">
1309            <xsl:number level="any" count="texttable[(@title!='' or @anchor!='') and not(@suppress-title='true')]" />
1310          </xsl:for-each>
1311        </xsl:variable>
1312        <xsl:choose>
1313          <xsl:when test="@format='counter'">
1314            <xsl:value-of select="$tabcnt" />
1315          </xsl:when>
1316          <xsl:when test="@format='title'">
1317            <xsl:value-of select="$node/@title" />
1318          </xsl:when>
1319          <xsl:otherwise>
1320            <xsl:value-of select="normalize-space(concat('Table&#160;',$tabcnt))"/>
1321          </xsl:otherwise>
1322        </xsl:choose>
1323      </fo:basic-link>
1324    </xsl:when>
1325
1326    <!-- Paragraph links -->
1327    <xsl:when test="$node/self::t">
1328      <fo:basic-link internal-destination="{$target}" xsl:use-attribute-sets="internal-link">
1329        <xsl:variable name="tcnt">
1330          <xsl:for-each select="$node">
1331            <xsl:call-template name="get-paragraph-number" />
1332          </xsl:for-each>
1333        </xsl:variable>
1334        <xsl:choose>
1335          <xsl:when test="@format='counter'">
1336            <xsl:value-of select="$tcnt" />
1337          </xsl:when>
1338          <xsl:when test="@format='title'">
1339            <xsl:value-of select="$node/@title" />
1340          </xsl:when>
1341          <xsl:otherwise>
1342            <xsl:value-of select="normalize-space(concat('Paragraph&#160;',substring-after($tcnt,'p.')))"/>
1343          </xsl:otherwise>
1344        </xsl:choose>
1345      </fo:basic-link>
1346    </xsl:when>
1347
1348    <!-- Comment links -->
1349    <xsl:when test="$node/self::cref">
1350      <fo:basic-link internal-destination="{$target}" xsl:use-attribute-sets="internal-link">
1351        <xsl:variable name="name">
1352          <xsl:for-each select="$node">
1353            <xsl:call-template name="get-comment-name" />
1354          </xsl:for-each>
1355        </xsl:variable>
1356        <xsl:choose>
1357          <xsl:when test="@format='counter'">
1358            <xsl:value-of select="$name" />
1359          </xsl:when>
1360          <xsl:when test="@format='title'">
1361            <xsl:value-of select="$node/@title" />
1362          </xsl:when>
1363          <xsl:otherwise>
1364            <xsl:value-of select="normalize-space(concat('Comment&#160;',$name))"/>
1365          </xsl:otherwise>
1366        </xsl:choose>
1367      </fo:basic-link>
1368    </xsl:when>
1369
1370    <!-- Reference links -->
1371    <xsl:when test="$node/self::reference">
1372      <!--
1373      Formats:
1374     
1375        ()      [XXXX] (Section SS)
1376        ,       [XXXX], Section SS
1377        of      Section SS of [XXXX]
1378        sec     Section SS
1379        number  SS
1380      -->
1381
1382      <xsl:variable name="sec">
1383        <xsl:choose>
1384          <xsl:when test="starts-with(@x:rel,'#') and not(@x:sec) and $node/x:source/@href">
1385            <xsl:variable name="extdoc" select="document($node/x:source/@href)"/>
1386            <xsl:for-each select="$extdoc//*[@anchor=substring-after(current()/@x:rel,'#')]">
1387              <xsl:call-template name="get-section-number"/>
1388            </xsl:for-each>
1389          </xsl:when>
1390          <xsl:otherwise>
1391            <xsl:value-of select="@x:sec"/>
1392          </xsl:otherwise>
1393        </xsl:choose>
1394      </xsl:variable>
1395
1396      <xsl:variable name="fmt">
1397        <xsl:choose>
1398          <xsl:when test="@x:fmt!=''"><xsl:value-of select="@x:fmt"/></xsl:when>
1399          <xsl:when test="ancestor::artwork">,</xsl:when>
1400          <xsl:otherwise>of</xsl:otherwise>
1401        </xsl:choose>
1402      </xsl:variable>
1403
1404      <xsl:if test="$sec!=''">
1405        <xsl:choose>
1406          <xsl:when test="$fmt='of' or $fmt='sec'">
1407            <xsl:text>Section </xsl:text>
1408            <xsl:value-of select="$sec"/>
1409            <xsl:if test="$fmt='of'">
1410              <xsl:text> of </xsl:text>
1411            </xsl:if>
1412          </xsl:when>
1413          <xsl:when test="$fmt='number'">
1414            <xsl:value-of select="$sec"/>
1415          </xsl:when>
1416          <xsl:when test="$fmt=','"/>
1417          <xsl:when test="$fmt='()'"/>
1418          <xsl:otherwise>
1419            <xsl:message>UNKNOWN xref x:fmt: <xsl:value-of select="$fmt"/></xsl:message>
1420          </xsl:otherwise>
1421        </xsl:choose>
1422      </xsl:if>
1423     
1424      <!-- anchor for index -->
1425      <xsl:if test="$xml2rfc-ext-include-references-in-index='yes' and $sec!='' and ($fmt='sec' or $fmt='number')">
1426        <fo:wrapper>
1427          <xsl:attribute name="id">
1428            <xsl:value-of select="$anchor"/>
1429          </xsl:attribute>
1430          <xsl:attribute name="index-key">
1431            <xsl:value-of select="concat('xrefitem=',@target)"/>
1432          </xsl:attribute>
1433          <xsl:if test="$sec!=''">
1434            <fo:wrapper>
1435              <xsl:attribute name="index-key">
1436                <xsl:value-of select="concat('xrefitem=',@target,'#',$sec)"/>
1437              </xsl:attribute>
1438            </fo:wrapper>
1439          </xsl:if>
1440        </fo:wrapper>
1441      </xsl:if>
1442
1443      <xsl:if test="$sec='' or ($fmt!='sec' and $fmt!='number')">
1444        <fo:basic-link internal-destination="{$target}" xsl:use-attribute-sets="internal-link">
1445          <xsl:if test="$xml2rfc-ext-include-references-in-index='yes'">
1446            <xsl:attribute name="id">
1447              <xsl:value-of select="$anchor"/>
1448            </xsl:attribute>
1449            <xsl:attribute name="index-key">
1450              <xsl:value-of select="concat('xrefitem=',@target)"/>
1451            </xsl:attribute>
1452            <xsl:if test="$sec!=''">
1453              <fo:wrapper>
1454                <xsl:attribute name="index-key">
1455                  <xsl:value-of select="concat('xrefitem=',@target,'#',$sec)"/>
1456                </xsl:attribute>
1457              </fo:wrapper>
1458            </xsl:if>
1459          </xsl:if>
1460          <xsl:variable name="val">
1461            <xsl:call-template name="referencename">
1462              <xsl:with-param name="node" select="$node" />
1463            </xsl:call-template>
1464          </xsl:variable>
1465          <xsl:choose>
1466            <xsl:when test="$fmt='anchor'">
1467              <!-- remove brackets -->
1468              <xsl:value-of select="substring($val,2,string-length($val)-2)"/>
1469            </xsl:when>
1470            <xsl:otherwise>
1471              <xsl:value-of select="$val"/>
1472            </xsl:otherwise>
1473          </xsl:choose>
1474        </fo:basic-link>
1475      </xsl:if>
1476
1477      <xsl:if test="$sec!=''">
1478        <xsl:choose>
1479          <xsl:when test="$fmt='()'">
1480            <xsl:text> (Section </xsl:text>
1481            <xsl:value-of select="$sec"/>
1482            <xsl:text>)</xsl:text>
1483          </xsl:when>
1484          <xsl:when test="$fmt=','">
1485            <xsl:text>, Section </xsl:text>
1486            <xsl:value-of select="$sec"/>
1487          </xsl:when>
1488          <xsl:otherwise/>
1489        </xsl:choose>
1490      </xsl:if>
1491
1492    </xsl:when>
1493   
1494    <xsl:otherwise>
1495      <xsl:call-template name="error">
1496        <xsl:with-param name="msg" select="concat('xref to unknown element: ',name($node))"/>
1497      </xsl:call-template>
1498    </xsl:otherwise>
1499  </xsl:choose>
1500</xsl:template>
1501
1502<xsl:template match="/">
1503  <xsl:apply-templates />
1504</xsl:template>
1505
1506<xsl:template match="*">
1507  <xsl:message terminate="yes">ERROR: unknown or unexpected element: {<xsl:value-of select="namespace-uri()" />}<xsl:value-of select="local-name()" /><xsl:call-template name="lineno"/>: '<xsl:value-of select="."/>'</xsl:message>
1508</xsl:template>
1509
1510<xsl:template match="text()">
1511  <xsl:copy-of select="."/>
1512</xsl:template>
1513
1514<xsl:template name="emitheader">
1515  <xsl:param name="lc" />
1516  <xsl:param name="rc" />
1517
1518  <xsl:for-each select="$lc/myns:item | $rc/myns:item">
1519    <xsl:variable name="pos" select="position()" />
1520    <xsl:if test="$pos &lt; count($lc/myns:item) + 1 or $pos &lt; count($rc/myns:item) + 1"> 
1521      <fo:table-row>
1522        <fo:table-cell>
1523          <fo:block>
1524            <xsl:apply-templates select="$lc/myns:item[$pos]/node()" mode="simple-html" /> 
1525          </fo:block>
1526        </fo:table-cell>
1527        <fo:table-cell>
1528          <fo:block text-align="right">
1529            <xsl:apply-templates select="$rc/myns:item[$pos]/node()" mode="simple-html" /> 
1530          </fo:block>
1531        </fo:table-cell>
1532      </fo:table-row>
1533    </xsl:if>
1534  </xsl:for-each>
1535</xsl:template>
1536
1537
1538<xsl:template match="text()" mode="simple-html">
1539  <xsl:apply-templates select="." />
1540</xsl:template>
1541
1542<xsl:template match="a" mode="simple-html">
1543  <fo:basic-link external-destination="url('{@href}')" xsl:use-attribute-sets="external-link">
1544    <xsl:apply-templates />
1545  </fo:basic-link>
1546</xsl:template>
1547
1548
1549<!-- produce back section with author information -->
1550<xsl:template name="insertAuthors">
1551
1552  <xsl:variable name="sectionNumber">
1553    <xsl:call-template name="get-authors-section-number"/>
1554  </xsl:variable>
1555
1556  <xsl:if test="$sectionNumber!='suppress'">
1557    <fo:block id="{$anchor-prefix}.authors" xsl:use-attribute-sets="h1 newpage">
1558      <xsl:if test="$sectionNumber != ''">
1559        <xsl:call-template name="emit-section-number">
1560          <xsl:with-param name="no" select="$sectionNumber"/>
1561        </xsl:call-template>
1562        <xsl:text>&#0160;&#0160;</xsl:text>
1563      </xsl:if>
1564      <xsl:call-template name="get-authors-section-title"/>
1565    </fo:block>
1566   
1567    <xsl:apply-templates select="/rfc/front/author" />
1568  </xsl:if>
1569</xsl:template>
1570
1571
1572<!-- generate the index section -->
1573
1574<xsl:template name="insertIndex">
1575
1576  <fo:block xsl:use-attribute-sets="h1 newpage" id="{$anchor-prefix}.index">
1577    <xsl:text>Index</xsl:text>
1578  </fo:block>
1579
1580  <xsl:variable name="irefs" select="//iref[generate-id(.) = generate-id(key('index-first-letter',translate(substring(@item,1,1),$lcase,$ucase)))]"/>
1581  <xsl:variable name="xrefs" select="//reference[generate-id(.) = generate-id(key('index-first-letter',translate(substring(@anchor,1,1),$lcase,$ucase)))]"/>
1582
1583  <xsl:for-each select="$irefs | $xrefs">
1584    <xsl:sort select="translate(concat(@item,@anchor),$lcase,$ucase)" />
1585    <xsl:variable name="letter" select="translate(substring(concat(@item,@anchor),1,1),$lcase,$ucase)"/>
1586           
1587    <xsl:variable name="showit">
1588      <xsl:choose>
1589        <xsl:when test="$xml2rfc-ext-include-references-in-index!='yes'">
1590          <xsl:if test="$irefs[starts-with(translate(@item,$lcase,$ucase),$letter)]">
1591            <xsl:text>yes</xsl:text>
1592          </xsl:if>
1593        </xsl:when>
1594        <xsl:otherwise>
1595          <xsl:text>yes</xsl:text>
1596        </xsl:otherwise>
1597      </xsl:choose>
1598    </xsl:variable>
1599
1600    <xsl:if test="$showit='yes'">
1601      <fo:block space-before="1em" font-weight="bold">
1602        <xsl:value-of select="$letter" />
1603      </fo:block>
1604           
1605      <xsl:for-each select="key('index-first-letter',translate(substring(concat(@item,@anchor),1,1),$lcase,$ucase))">
1606 
1607      <xsl:sort select="translate(concat(@item,@anchor),$lcase,$ucase)" />
1608     
1609        <xsl:choose>
1610          <xsl:when test="self::reference">
1611            <xsl:if test="$xml2rfc-ext-include-references-in-index='yes'">
1612           
1613              <xsl:variable name="entries" select="//xref[@target=current()/@anchor and not(ancestor::ed:del)]" />
1614             
1615              <xsl:if test="$entries">
1616                <fo:block start-indent="1em" hyphenate="true">
1617                  <fo:wrapper font-style="italic"><xsl:value-of select="concat(@anchor,' ')" /></fo:wrapper>
1618 
1619                  <fo:index-page-citation-list merge-sequential-page-numbers="merge">
1620                    <fo:index-key-reference page-number-treatment="link" ref-index-key="{concat('xrefitem=',@anchor,',primary')}" font-weight="bold"/>
1621                    <fo:index-key-reference page-number-treatment="link" ref-index-key="{concat('xrefitem=',@anchor)}"/>
1622                  </fo:index-page-citation-list>
1623
1624                  <xsl:variable name="rs2" select="$entries[@x:sec]"/>
1625
1626                  <xsl:if test="$rs2">
1627                    <xsl:for-each select="$rs2">
1628                      <xsl:sort select="substring-before(concat(@x:sec,'.'),'.')" data-type="number"/>
1629                      <xsl:sort select="substring(@x:sec,2+string-length(substring-before(@x:sec,'.')))" data-type="number"/>
1630                      <xsl:if test="generate-id(.) = generate-id(key('index-xref-by-sec',concat(@target,'..',@x:sec)))">
1631                        <fo:block start-indent="2em" hyphenate="true">
1632                          <fo:wrapper font-style="italic">
1633                            <xsl:choose>
1634                              <xsl:when test="translate(substring(@x:sec,1,1),$ucase,'')=''">
1635                                <xsl:text>Appendix </xsl:text>
1636                              </xsl:when>
1637                              <xsl:otherwise>
1638                                <xsl:text>Section </xsl:text>
1639                              </xsl:otherwise>
1640                            </xsl:choose>
1641                            <xsl:value-of select="@x:sec"/>
1642                            <xsl:text> </xsl:text>
1643                          </fo:wrapper>
1644                          <fo:index-page-citation-list merge-sequential-page-numbers="merge">
1645                            <fo:index-key-reference page-number-treatment="link" ref-index-key="{concat('xrefitem=',@target,'#',@x:sec)}"/>
1646                          </fo:index-page-citation-list>
1647                        </fo:block>
1648                      </xsl:if>
1649                    </xsl:for-each>
1650                  </xsl:if>
1651
1652                  <xsl:if test="current()/x:source/@href">
1653                    <xsl:variable name="rs3" select="$entries[not(@x:sec) and @x:rel]"/>
1654                    <xsl:if test="$rs3">
1655                      <xsl:variable name="doc" select="document(current()/x:source/@href)"/>
1656                      <xsl:for-each select="$rs3">
1657                        <xsl:sort select="count($doc//*[@anchor and following::*/@anchor=substring-after(current()/@x:rel,'#')])" order="ascending" data-type="number"/>
1658                        <xsl:if test="generate-id(.) = generate-id(key('index-xref-by-anchor',concat(@target,'..',@x:rel)))">
1659                          <fo:block start-indent="2em" hyphenate="true">
1660                            <xsl:variable name="sec">
1661                              <xsl:for-each select="$doc//*[@anchor=substring-after(current()/@x:rel,'#')]">
1662                                <xsl:call-template name="get-section-number"/>
1663                              </xsl:for-each>
1664                            </xsl:variable>
1665                            <fo:wrapper font-style="italic">
1666                              <xsl:choose>
1667                                <xsl:when test="translate(substring($sec,1,1),$ucase,'')=''">
1668                                  <xsl:text>Appendix </xsl:text>
1669                                </xsl:when>
1670                                <xsl:otherwise>
1671                                  <xsl:text>Section </xsl:text>
1672                                </xsl:otherwise>
1673                              </xsl:choose>
1674                              <xsl:value-of select="$sec"/>
1675                              <xsl:text> </xsl:text>
1676                            </fo:wrapper>
1677                            <fo:index-page-citation-list merge-sequential-page-numbers="merge">
1678                              <fo:index-key-reference page-number-treatment="link" ref-index-key="{concat('xrefitem=',@target,'#',$sec)}"/>
1679                            </fo:index-page-citation-list>
1680                          </fo:block>
1681                        </xsl:if>
1682                      </xsl:for-each>
1683                    </xsl:if>
1684                  </xsl:if>
1685
1686                </fo:block>
1687              </xsl:if>
1688
1689            </xsl:if>
1690          </xsl:when>
1691          <xsl:otherwise>
1692            <xsl:if test="generate-id(.) = generate-id(key('index-item',@item))">
1693           
1694              <xsl:variable name="item" select="@item"/>
1695              <xsl:variable name="in-artwork" select="count(//iref[@item=$item and @primary='true' and ancestor::artwork])!=0"/>
1696       
1697              <fo:block start-indent="1em" hyphenate="true">
1698                <xsl:choose>
1699                  <xsl:when test="$in-artwork">
1700                    <fo:wrapper font-family="monospace"><xsl:value-of select="concat(@item,' ')" /></fo:wrapper>
1701                  </xsl:when>
1702                  <xsl:otherwise>
1703                    <xsl:value-of select="concat(@item,' ')" />
1704                  </xsl:otherwise>
1705                </xsl:choose>
1706               
1707                <xsl:variable name="entries" select="key('index-item',@item)[not(@subitem) or @subitem='']"/>
1708                                       
1709                <xsl:if test="$entries">
1710                  <fo:index-page-citation-list merge-sequential-page-numbers="merge">
1711                    <fo:index-key-reference page-number-treatment="link" ref-index-key="{concat('item=',@item,',subitem=',@subitem,',primary')}" font-weight="bold"/>
1712                    <fo:index-key-reference page-number-treatment="link" ref-index-key="{concat('item=',@item,',subitem=',@subitem)}"/>
1713                  </fo:index-page-citation-list>
1714                </xsl:if>
1715     
1716              </fo:block>
1717                   
1718              <xsl:for-each select="key('index-item',@item)[@subitem and @subitem!='']">
1719              <xsl:sort select="translate(@subitem,$lcase,$ucase)" />
1720           
1721                <xsl:if test="generate-id(.) = generate-id(key('index-item-subitem',concat(@item,'..',@subitem)))">
1722               
1723                  <xsl:variable name="itemsubitem" select="concat(@item,'..',@subitem)"/>
1724                  <xsl:variable name="in-artwork2" select="count(//iref[concat(@item,'..',@subitem)=$itemsubitem and @primary='true' and ancestor::artwork])!=0"/>
1725                             
1726                  <fo:block start-indent="2em" hyphenate="true">
1727                 
1728                    <xsl:choose>
1729                      <xsl:when test="$in-artwork2">
1730                        <fo:wrapper font-family="monospace"><xsl:value-of select="concat(@subitem,' ')" /></fo:wrapper>
1731                      </xsl:when>
1732                      <xsl:otherwise>
1733                        <xsl:value-of select="concat(@subitem,' ')" />
1734                      </xsl:otherwise>
1735                    </xsl:choose>
1736     
1737                    <xsl:variable name="entries2" select="key('index-item-subitem',concat(@item,'..',@subitem))" />
1738                   
1739                    <xsl:if test="$entries2">
1740                      <fo:index-page-citation-list merge-sequential-page-numbers="merge">
1741                        <fo:index-key-reference page-number-treatment="link" ref-index-key="{concat('item=',@item,',subitem=',@subitem,',primary')}" font-weight="bold"/>
1742                        <fo:index-key-reference page-number-treatment="link" ref-index-key="{concat('item=',@item,',subitem=',@subitem)}" />
1743                      </fo:index-page-citation-list>
1744                    </xsl:if>
1745     
1746                  </fo:block>
1747                </xsl:if>
1748              </xsl:for-each>
1749                     
1750            </xsl:if>
1751          </xsl:otherwise>
1752        </xsl:choose>
1753   
1754                 
1755      </xsl:for-each>           
1756    </xsl:if>
1757  </xsl:for-each>
1758</xsl:template>
1759
1760
1761
1762<xsl:template match="/" mode="toc">
1763  <fo:block xsl:use-attribute-sets="h1 newpage" id="{concat($anchor-prefix,'.toc')}">
1764    <xsl:text>Table of Contents</xsl:text>
1765  </fo:block>
1766
1767  <xsl:apply-templates mode="toc" />
1768</xsl:template>
1769
1770<xsl:template match="back" mode="toc">
1771
1772  <xsl:apply-templates select="references" mode="toc" />
1773
1774  <xsl:if test="$xml2rfc-ext-authors-section!='end'">
1775    <xsl:apply-templates select="/rfc/front" mode="toc" />
1776  </xsl:if>
1777
1778  <xsl:apply-templates select="*[not(self::references)]" mode="toc" />
1779
1780  <!-- insert the index if index entries exist -->
1781  <xsl:if test="$has-index">
1782    <xsl:call-template name="insert-toc-line">
1783      <xsl:with-param name="target" select="concat($anchor-prefix,'.index')"/>
1784      <xsl:with-param name="title" select="'Index'"/>
1785    </xsl:call-template>
1786  </xsl:if>
1787
1788  <xsl:if test="$xml2rfc-ext-authors-section='end'">
1789    <xsl:apply-templates select="/rfc/front" mode="toc" />
1790  </xsl:if>
1791
1792  <!-- copyright statements -->
1793  <xsl:if test="$xml2rfc-private='' and not($no-copylong)">
1794    <xsl:call-template name="insert-toc-line">
1795      <xsl:with-param name="target" select="concat($anchor-prefix,'.ipr')"/>
1796      <xsl:with-param name="title" select="'Intellectual Property and Copyright Statements'"/>
1797    </xsl:call-template>
1798  </xsl:if>
1799 
1800</xsl:template>
1801
1802<xsl:template match="front" mode="toc">
1803 
1804  <xsl:variable name="authors-title">
1805    <xsl:call-template name="get-authors-section-title"/>
1806  </xsl:variable>
1807  <xsl:variable name="authors-number">
1808    <xsl:call-template name="get-authors-section-number"/>
1809  </xsl:variable>
1810  <xsl:if test="$authors-number!='suppress'">
1811    <xsl:call-template name="insert-toc-line">
1812      <xsl:with-param name="target" select="concat($anchor-prefix,'.authors')"/>
1813      <xsl:with-param name="title" select="$authors-title"/>
1814      <xsl:with-param name="number" select="$authors-number"/>
1815    </xsl:call-template>
1816  </xsl:if>
1817
1818</xsl:template>
1819
1820<xsl:template name="references-toc">
1821
1822  <!-- distinguish two cases: (a) single references element (process
1823  as toplevel section; (b) multiple references sections (add one toplevel
1824  container with subsection) -->
1825
1826  <xsl:choose>
1827    <xsl:when test="count(/*/back/references) = 0">
1828      <!-- nop -->
1829    </xsl:when>
1830    <xsl:when test="count(/*/back/references) = 1">
1831      <xsl:for-each select="/*/back/references">
1832        <xsl:variable name="title">
1833          <xsl:choose>
1834            <xsl:when test="@title!=''"><xsl:value-of select="@title" /></xsl:when>
1835            <xsl:otherwise><xsl:value-of select="$xml2rfc-refparent"/></xsl:otherwise>
1836          </xsl:choose>
1837        </xsl:variable>
1838     
1839        <xsl:call-template name="insert-toc-line">
1840          <xsl:with-param name="number">
1841            <xsl:call-template name="get-references-section-number"/>
1842          </xsl:with-param>
1843          <xsl:with-param name="target" select="concat($anchor-prefix,'.references')"/>
1844          <xsl:with-param name="title" select="$title"/>
1845        </xsl:call-template>
1846      </xsl:for-each>
1847    </xsl:when>
1848    <xsl:otherwise>
1849      <!-- insert pseudo container -->   
1850      <xsl:call-template name="insert-toc-line">
1851        <xsl:with-param name="number">
1852          <xsl:call-template name="get-references-section-number"/>
1853        </xsl:with-param>
1854        <xsl:with-param name="target" select="concat($anchor-prefix,'.references')"/>
1855        <xsl:with-param name="title" select="$xml2rfc-refparent"/>
1856      </xsl:call-template>
1857 
1858      <!-- ...with subsections... -->   
1859      <xsl:for-each select="/*/back/references">
1860        <xsl:variable name="title">
1861          <xsl:choose>
1862            <xsl:when test="@title!=''"><xsl:value-of select="@title" /></xsl:when>
1863            <xsl:otherwise><xsl:value-of select="$xml2rfc-refparent"/></xsl:otherwise>
1864          </xsl:choose>
1865        </xsl:variable>
1866     
1867        <xsl:variable name="sectionNumber">
1868          <xsl:call-template name="get-section-number" />
1869        </xsl:variable>
1870
1871        <xsl:variable name="num">
1872          <xsl:number/>
1873        </xsl:variable>
1874
1875        <xsl:call-template name="insert-toc-line">
1876          <xsl:with-param name="number" select="$sectionNumber"/>
1877          <xsl:with-param name="target" select="concat($anchor-prefix,'.references','.',$num)"/>
1878          <xsl:with-param name="title" select="$title"/>
1879        </xsl:call-template>
1880      </xsl:for-each>
1881    </xsl:otherwise>
1882  </xsl:choose>
1883</xsl:template>
1884
1885<xsl:template match="section" mode="toc">
1886  <xsl:variable name="sectionNumber">
1887    <xsl:call-template name="get-section-number" />
1888  </xsl:variable>
1889
1890  <xsl:variable name="target">
1891    <xsl:choose>
1892      <xsl:when test="@anchor"><xsl:value-of select="@anchor" /></xsl:when>
1893       <xsl:otherwise><xsl:value-of select="$anchor-prefix"/>.section.<xsl:value-of select="$sectionNumber" /></xsl:otherwise>
1894    </xsl:choose>
1895  </xsl:variable>
1896
1897  <xsl:call-template name="insert-toc-line">
1898    <xsl:with-param name="number" select="$sectionNumber"/>
1899    <xsl:with-param name="target" select="$target"/>
1900    <xsl:with-param name="title" select="@title"/>
1901    <xsl:with-param name="tocparam" select="@toc"/>
1902  </xsl:call-template>
1903 
1904  <xsl:if test=".//section">
1905    <xsl:apply-templates mode="toc" />
1906  </xsl:if>
1907</xsl:template>
1908
1909<xsl:template name="insert-toc-line">
1910  <xsl:param name="number" />
1911  <xsl:param name="target" />
1912  <xsl:param name="title" />
1913  <xsl:param name="tocparam" />
1914 
1915  <xsl:variable name="depth" select="string-length(translate($number,'.ABCDEFGHIJKLMNOPQRSTUVWXYZ01234567890&#167;','.'))" />
1916 
1917  <!-- handle tocdepth parameter -->
1918  <xsl:choose>
1919    <xsl:when test="($tocparam='' or $tocparam='default') and string-length(translate($number,'.ABCDEFGHIJKLMNOPQRSTUVWXYZ01234567890&#167;','.')) &gt;= $parsedTocDepth">
1920      <!-- dropped entry because of depth-->
1921    </xsl:when>
1922    <xsl:when test="$tocparam='exclude'">
1923      <!-- dropped entry because excluded -->
1924    </xsl:when>
1925    <xsl:when test="$depth = 0">
1926      <fo:block space-before="1em" font-weight="bold" text-align-last="justify">
1927        <xsl:if test="$number!='' and not(contains($number,'unnumbered-'))">
1928          <xsl:value-of select="$number" />
1929          <xsl:if test="$xml2rfc-ext-sec-no-trailing-dots='yes'">.</xsl:if>
1930          <xsl:text>&#0160;&#0160;</xsl:text>
1931        </xsl:if>
1932        <fo:basic-link internal-destination="{$target}" xsl:use-attribute-sets="internal-link"><xsl:value-of select="$title"/></fo:basic-link>
1933        <fo:leader leader-pattern="dots"/>
1934        <fo:page-number-citation ref-id="{$target}"/>
1935      </fo:block>
1936    </xsl:when>
1937    <xsl:when test="$depth = 1">
1938      <fo:block space-before="0.5em" text-align-last="justify">
1939        <xsl:if test="$number!='' and not(contains($number,'unnumbered-'))">
1940          <xsl:value-of select="$number" />
1941          <xsl:if test="$xml2rfc-ext-sec-no-trailing-dots='yes'">.</xsl:if>
1942          <xsl:text>&#0160;&#0160;&#0160;&#0160;</xsl:text>
1943        </xsl:if>
1944        <fo:basic-link internal-destination="{$target}" xsl:use-attribute-sets="internal-link"><xsl:value-of select="$title"/></fo:basic-link>
1945        <fo:leader leader-pattern="dots"/>
1946        <fo:page-number-citation ref-id="{$target}"/>
1947      </fo:block>
1948    </xsl:when>
1949    <xsl:otherwise>
1950      <fo:block text-align-last="justify">
1951        <xsl:text>&#0160;&#0160;</xsl:text>
1952        <xsl:if test="$number!='' and not(contains($number,'unnumbered-'))">
1953          <xsl:value-of select="$number" />
1954          <xsl:if test="$xml2rfc-ext-sec-no-trailing-dots='yes'">.</xsl:if>
1955          <xsl:text>&#0160;&#0160;&#0160;&#0160;</xsl:text>
1956        </xsl:if>
1957        <fo:basic-link internal-destination="{$target}" xsl:use-attribute-sets="internal-link"><xsl:value-of select="$title"/></fo:basic-link>
1958        <fo:leader leader-pattern="dots"/>
1959        <fo:page-number-citation ref-id="{$target}"/>
1960      </fo:block>
1961    </xsl:otherwise>
1962  </xsl:choose>
1963
1964</xsl:template>
1965
1966
1967<!--
1968<xsl:template name="rfclist">
1969  <xsl:param name="list" />
1970  <xsl:choose>
1971      <xsl:when test="contains($list,',')">
1972          <xsl:variable name="rfcNo" select="substring-before($list,',')" />
1973          <a href="{concat($rfcUrlPrefix,$rfcNo,'.txt')}"><xsl:value-of select="$rfcNo" /></a>,
1974          <xsl:call-template name="rfclist">
1975              <xsl:with-param name="list" select="normalize-space(substring-after($list,','))" />
1976            </xsl:call-template>
1977        </xsl:when>
1978        <xsl:otherwise>
1979          <xsl:variable name="rfcNo" select="$list" />
1980          <a href="{concat($rfcUrlPrefix,$rfcNo,'.txt')}"><xsl:value-of select="$rfcNo" /></a>
1981         </xsl:otherwise>
1982    </xsl:choose>
1983</xsl:template>
1984-->
1985
1986<xsl:template name="insertHeader">
1987  <xsl:variable name="left">
1988    <xsl:call-template name="get-header-left" />
1989  </xsl:variable>
1990  <xsl:variable name="center">
1991    <xsl:call-template name="get-header-center" />
1992  </xsl:variable>
1993  <xsl:variable name="right">
1994    <xsl:call-template name="get-header-right" />
1995  </xsl:variable>
1996
1997  <fo:static-content flow-name="header-right">
1998    <fo:block space-after=".5cm" />
1999    <fo:table width="100%" text-align="center" table-layout="fixed">
2000      <fo:table-column column-width="proportional-column-width({(string-length($left)+string-length($right)) div 2})" />
2001      <fo:table-column column-width="proportional-column-width({string-length($center)})" />
2002      <fo:table-column column-width="proportional-column-width({(string-length($left)+string-length($right)) div 2})" />
2003      <fo:table-body>
2004        <fo:table-row>
2005          <fo:table-cell>
2006            <fo:block text-align="start">
2007              <xsl:value-of select="$left" />
2008             </fo:block>
2009          </fo:table-cell>
2010          <fo:table-cell text-align="center">
2011            <fo:block>
2012              <xsl:value-of select="$center" />
2013             </fo:block>
2014          </fo:table-cell>
2015          <fo:table-cell text-align="end">
2016            <fo:block>
2017              <xsl:value-of select="$right" />
2018             </fo:block>
2019          </fo:table-cell>
2020        </fo:table-row>
2021      </fo:table-body>
2022    </fo:table>
2023  </fo:static-content>
2024
2025  <fo:static-content flow-name="header-left">
2026    <fo:block space-after=".5cm" />
2027    <fo:table width="100%" text-align="center" table-layout="fixed">
2028      <fo:table-column column-width="proportional-column-width({(string-length($left)+string-length($right)) div 2})" />
2029      <fo:table-column column-width="proportional-column-width({string-length($center)})" />
2030      <fo:table-column column-width="proportional-column-width({(string-length($left)+string-length($right)) div 2})" />
2031      <fo:table-body>
2032        <fo:table-row>
2033          <fo:table-cell text-align="start">
2034            <fo:block>
2035              <xsl:value-of select="$right" />
2036             </fo:block>
2037          </fo:table-cell>
2038          <fo:table-cell text-align="center">
2039            <fo:block>
2040              <xsl:value-of select="$center" />
2041             </fo:block>
2042          </fo:table-cell>
2043          <fo:table-cell>
2044            <fo:block text-align="end">
2045              <xsl:value-of select="$left" />
2046             </fo:block>
2047          </fo:table-cell>
2048        </fo:table-row>
2049      </fo:table-body>
2050    </fo:table>
2051  </fo:static-content>
2052
2053</xsl:template>
2054
2055<xsl:template name="insertFooter">
2056  <xsl:variable name="left">
2057    <xsl:call-template name="get-author-summary" />
2058  </xsl:variable>
2059  <xsl:variable name="center">
2060    <xsl:call-template name="get-category-long" />
2061  </xsl:variable>
2062  <xsl:variable name="right">[Page 999]</xsl:variable>
2063
2064  <fo:static-content flow-name="footer-right">
2065    <fo:table text-align="center" width="100%" table-layout="fixed">
2066      <fo:table-column column-width="proportional-column-width({(string-length($left)+string-length($right)) div 2})" />
2067      <fo:table-column column-width="proportional-column-width({string-length($center)})" />
2068      <fo:table-column column-width="proportional-column-width({(string-length($left)+string-length($right)) div 2})" />
2069      <fo:table-body>
2070        <fo:table-row>
2071          <fo:table-cell>
2072            <fo:block text-align="start">
2073              <xsl:value-of select="$left" />
2074             </fo:block>
2075          </fo:table-cell>
2076          <fo:table-cell>
2077            <fo:block text-align="center">
2078              <xsl:value-of select="$center" />
2079             </fo:block>
2080          </fo:table-cell>
2081          <fo:table-cell>
2082            <fo:block text-align="end">[Page <fo:page-number />]</fo:block>
2083          </fo:table-cell>
2084        </fo:table-row>
2085      </fo:table-body>
2086    </fo:table>
2087  </fo:static-content>
2088
2089  <fo:static-content flow-name="footer-left">
2090    <fo:table text-align="center" width="100%" table-layout="fixed">
2091      <fo:table-column column-width="proportional-column-width({(string-length($left)+string-length($right)) div 2})" />
2092      <fo:table-column column-width="proportional-column-width({string-length($center)})" />
2093      <fo:table-column column-width="proportional-column-width({(string-length($left)+string-length($right)) div 2})" />
2094      <fo:table-body>
2095        <fo:table-row>
2096          <fo:table-cell>
2097            <fo:block text-align="start">[Page <fo:page-number />]</fo:block>
2098          </fo:table-cell>
2099          <fo:table-cell>
2100            <fo:block text-align="center">
2101              <xsl:value-of select="$center" />
2102             </fo:block>
2103          </fo:table-cell>
2104          <fo:table-cell>
2105            <fo:block text-align="end">
2106              <xsl:value-of select="$left" />
2107             </fo:block>
2108          </fo:table-cell>
2109        </fo:table-row>
2110      </fo:table-body>
2111    </fo:table>
2112  </fo:static-content>
2113
2114</xsl:template>
2115
2116<!-- change tracking -->
2117
2118<xsl:template match="ed:annotation" />
2119<xsl:template match="ed:del" />
2120<xsl:template match="ed:issue" />
2121<xsl:template match="ed:ins">
2122  <xsl:apply-templates />
2123</xsl:template>
2124<xsl:template match="ed:issueref">
2125  <xsl:apply-templates />
2126</xsl:template>
2127
2128<xsl:template match="ed:replace">
2129  <!--<xsl:variable name="no">change<xsl:number level="any"/></xsl:variable>
2130  <fo:change-bar-begin change-bar-class="{$no}" change-bar-style="solid" change-bar-color="red" change-bar-offset="2mm"/>-->
2131  <xsl:apply-templates />
2132  <!--<fo:change-bar-end change-bar-class="{$no}"/>-->
2133</xsl:template>
2134
2135<!-- extensions -->
2136
2137<xsl:template match="ed:link" />
2138
2139
2140<xsl:template match="node()" mode="bookmarks">
2141  <xsl:apply-templates mode="bookmarks"/>
2142</xsl:template>
2143
2144<xsl:template match="abstract" mode="bookmarks">
2145  <fo:bookmark internal-destination="{concat($anchor-prefix,'.abstract')}">
2146    <fo:bookmark-title>Abstract</fo:bookmark-title>
2147    <xsl:apply-templates mode="bookmarks"/>
2148  </fo:bookmark>
2149</xsl:template>
2150
2151<xsl:template match="note" mode="bookmarks">
2152  <xsl:variable name="num">
2153    <xsl:number count="note" />
2154  </xsl:variable>
2155  <fo:bookmark internal-destination="{concat($anchor-prefix,'.note.',$num)}">
2156    <fo:bookmark-title><xsl:value-of select="@title"/></fo:bookmark-title>
2157    <xsl:apply-templates mode="bookmarks"/>
2158  </fo:bookmark>
2159</xsl:template>
2160
2161<xsl:template match="section[not(@myns:unnumbered)]" mode="bookmarks">
2162  <xsl:variable name="sectionNumber"><xsl:call-template name="get-section-number" /></xsl:variable>
2163  <fo:bookmark internal-destination="{$anchor-prefix}.section.{$sectionNumber}">
2164    <fo:bookmark-title>
2165      <xsl:if test="$sectionNumber!='' and not(contains($sectionNumber,'unnumbered-'))">
2166        <xsl:value-of select="$sectionNumber"/>
2167        <xsl:if test="$xml2rfc-ext-sec-no-trailing-dots='yes'">.</xsl:if>
2168        <xsl:text> </xsl:text>
2169      </xsl:if>
2170      <xsl:value-of select="@title"/>
2171    </fo:bookmark-title>
2172    <xsl:apply-templates mode="bookmarks"/>
2173  </fo:bookmark>
2174</xsl:template>
2175
2176<xsl:template match="section[@myns:unnumbered]" mode="bookmarks">
2177  <fo:bookmark internal-destination="{@anchor}">
2178    <fo:bookmark-title><xsl:value-of select="@title"/></fo:bookmark-title>
2179    <xsl:apply-templates mode="bookmarks"/>
2180  </fo:bookmark>
2181</xsl:template>
2182
2183<xsl:template match="back" mode="bookmarks">
2184
2185  <xsl:call-template name="references-bookmarks" />
2186
2187  <xsl:if test="$xml2rfc-ext-authors-section!='end'">
2188    <xsl:apply-templates select="/rfc/front" mode="bookmarks" />
2189  </xsl:if>
2190 
2191  <xsl:apply-templates select="*[not(self::references)]" mode="bookmarks" />
2192
2193  <!-- insert the index if index entries exist -->
2194  <xsl:if test="$has-index">
2195    <fo:bookmark internal-destination="{concat($anchor-prefix,'.index')}">
2196      <fo:bookmark-title>Index</fo:bookmark-title>
2197    </fo:bookmark>
2198  </xsl:if>
2199
2200  <xsl:if test="$xml2rfc-ext-authors-section='end'">
2201    <xsl:apply-templates select="/rfc/front" mode="bookmarks" />
2202  </xsl:if>
2203
2204  <xsl:if test="$xml2rfc-private='' and not($no-copylong)">
2205    <!-- copyright statements -->
2206    <fo:bookmark internal-destination="{concat($anchor-prefix,'.ipr')}">
2207      <fo:bookmark-title>Intellectual Property and Copyright Statements</fo:bookmark-title>
2208    </fo:bookmark>
2209  </xsl:if>
2210 
2211</xsl:template>
2212
2213<xsl:template match="front" mode="bookmarks">
2214
2215  <xsl:variable name="authors-number">
2216    <xsl:call-template name="get-authors-section-number"/>
2217  </xsl:variable>
2218
2219  <xsl:variable name="title">
2220    <xsl:if test="$authors-number!=''">
2221      <xsl:value-of select="$authors-number"/>
2222      <xsl:text> </xsl:text>
2223    </xsl:if>
2224    <xsl:call-template name="get-authors-section-title"/>
2225  </xsl:variable>
2226
2227  <xsl:if test="$authors-number!='suppress'">
2228    <fo:bookmark internal-destination="{concat($anchor-prefix,'.authors')}">
2229      <fo:bookmark-title><xsl:value-of select="$title"/></fo:bookmark-title>
2230    </fo:bookmark>
2231  </xsl:if>
2232</xsl:template>
2233
2234<xsl:template match="middle" mode="bookmarks">
2235  <xsl:apply-templates mode="bookmarks" />
2236</xsl:template>
2237
2238<xsl:template name="references-bookmarks">
2239
2240  <!-- distinguish two cases: (a) single references element (process
2241  as toplevel section; (b) multiple references sections (add one toplevel
2242  container with subsection) -->
2243
2244  <xsl:choose>
2245    <xsl:when test="count(/*/back/references) = 0">
2246      <!-- nothing to do -->
2247    </xsl:when>
2248    <xsl:when test="count(/*/back/references) = 1">
2249      <xsl:for-each select="/*/back/references">
2250        <xsl:variable name="title">
2251          <xsl:choose>
2252            <xsl:when test="@title!=''"><xsl:value-of select="@title" /></xsl:when>
2253            <xsl:otherwise><xsl:value-of select="$xml2rfc-refparent"/></xsl:otherwise>
2254          </xsl:choose>
2255        </xsl:variable>
2256     
2257        <fo:bookmark internal-destination="{$anchor-prefix}.references">
2258          <fo:bookmark-title>
2259            <xsl:call-template name="get-references-section-number"/>
2260            <xsl:if test="$xml2rfc-ext-sec-no-trailing-dots='yes'">.</xsl:if>
2261            <xsl:text> </xsl:text>
2262            <xsl:value-of select="$title"/>
2263          </fo:bookmark-title>
2264        </fo:bookmark>
2265      </xsl:for-each>
2266    </xsl:when>
2267    <xsl:otherwise>
2268      <!-- insert pseudo container -->   
2269      <fo:bookmark internal-destination="{$anchor-prefix}.references">
2270        <fo:bookmark-title>
2271          <xsl:call-template name="get-references-section-number"/>
2272          <xsl:if test="$xml2rfc-ext-sec-no-trailing-dots='yes'">.</xsl:if>
2273          <xsl:text> </xsl:text>
2274          <xsl:value-of select="$xml2rfc-refparent"/>
2275        </fo:bookmark-title>
2276
2277        <!-- ...with subsections... -->   
2278        <xsl:for-each select="/*/back/references">
2279          <xsl:variable name="title">
2280            <xsl:choose>
2281              <xsl:when test="@title!=''"><xsl:value-of select="@title" /></xsl:when>
2282              <xsl:otherwise><xsl:value-of select="$xml2rfc-refparent"/></xsl:otherwise>
2283            </xsl:choose>
2284          </xsl:variable>
2285       
2286          <xsl:variable name="sectionNumber">
2287            <xsl:call-template name="get-section-number" />
2288            <xsl:if test="$xml2rfc-ext-sec-no-trailing-dots='yes'">.</xsl:if>
2289          </xsl:variable>
2290 
2291          <xsl:variable name="num">
2292            <xsl:number/>
2293          </xsl:variable>
2294 
2295          <fo:bookmark internal-destination="{$anchor-prefix}.references.{$num}">
2296            <fo:bookmark-title><xsl:value-of select="concat($sectionNumber,' ',$title)"/></fo:bookmark-title>
2297          </fo:bookmark>
2298        </xsl:for-each>
2299      </fo:bookmark>
2300
2301    </xsl:otherwise>
2302  </xsl:choose>
2303</xsl:template>
2304
2305<xsl:template match="rfc" mode="bookmarks">
2306  <xsl:if test="$xml2rfc-private=''">
2307    <!-- Get status info formatted as per RFC2629-->
2308    <xsl:variable name="preamble"><xsl:call-template name="insertPreamble" /></xsl:variable>
2309   
2310    <!-- emit it -->
2311    <xsl:choose>
2312      <xsl:when test="function-available('exslt:node-set')">
2313        <xsl:apply-templates select="exslt:node-set($preamble)/node()" mode="bookmarks"/>
2314      </xsl:when>
2315      <xsl:otherwise>
2316        <xsl:variable name="temp" select="$preamble"/>
2317        <xsl:apply-templates select="$temp/node()" mode="bookmarks"/>
2318      </xsl:otherwise>
2319    </xsl:choose>
2320  </xsl:if>
2321 
2322  <xsl:apply-templates select="front/abstract" mode="bookmarks"/>
2323  <xsl:apply-templates select="front/note" mode="bookmarks"/>
2324
2325  <xsl:if test="$xml2rfc-toc='yes'">
2326    <fo:bookmark internal-destination="{concat($anchor-prefix,'.toc')}">
2327      <fo:bookmark-title>Table of Contents</fo:bookmark-title>
2328    </fo:bookmark>
2329  </xsl:if>
2330 
2331  <xsl:apply-templates select="middle|back" mode="bookmarks"/>
2332</xsl:template>
2333
2334<!-- experimental table formatting -->
2335
2336<xsl:template name="sum-widths">
2337  <xsl:param name="list"/>
2338  <xsl:choose>
2339    <xsl:when test="count($list)=0">
2340      <xsl:value-of select="0"/>
2341    </xsl:when>
2342    <xsl:when test="count($list)=1">
2343      <xsl:value-of select="number(substring-before($list[1],'%'))"/>
2344    </xsl:when>
2345    <xsl:otherwise>
2346      <xsl:variable name="remainder">
2347        <xsl:call-template name="sum-widths">
2348          <xsl:with-param name="list" select="$list[position()>1]" />
2349        </xsl:call-template>
2350      </xsl:variable>
2351      <xsl:value-of select="$remainder + number(substring-before($list[1],'%'))" />
2352    </xsl:otherwise>
2353  </xsl:choose>
2354</xsl:template>
2355
2356<!--
2357<xsl:attribute-set name="all-borders-solid">
2358  <xsl:attribute name="border-left-style">solid</xsl:attribute>
2359  <xsl:attribute name="border-right-style">solid</xsl:attribute>
2360  <xsl:attribute name="border-top-style">solid</xsl:attribute>
2361  <xsl:attribute name="border-bottom-style">solid</xsl:attribute>
2362  <xsl:attribute name="border-left-width">thin</xsl:attribute>
2363  <xsl:attribute name="border-right-width">thin</xsl:attribute>
2364  <xsl:attribute name="border-top-width">thin</xsl:attribute>
2365  <xsl:attribute name="border-bottom-width">thin</xsl:attribute>
2366  <xsl:attribute name="padding-left">0.5em</xsl:attribute>
2367  <xsl:attribute name="padding-right">0.5em</xsl:attribute>
2368</xsl:attribute-set>
2369
2370-->
2371
2372<xsl:template match="texttable">
2373
2374  <xsl:variable name="style">
2375    <xsl:choose>
2376      <xsl:when test="@style!=''">
2377        <xsl:value-of select="@style"/>
2378      </xsl:when>
2379      <xsl:otherwise>full</xsl:otherwise>
2380    </xsl:choose>
2381  </xsl:variable>
2382
2383  <xsl:variable name="anch">
2384    <xsl:call-template name="get-table-anchor"/>
2385  </xsl:variable>
2386
2387  <fo:block space-before=".5em" space-after=".5em" start-indent="2em" id="{$anch}">
2388    <xsl:call-template name="add-anchor"/>
2389    <xsl:apply-templates select="preamble" />
2390    <fo:table>
2391      <xsl:variable name="total-specified">
2392        <xsl:call-template name="sum-widths">
2393          <xsl:with-param name="list" select="ttcol/@width" />
2394        </xsl:call-template>
2395      </xsl:variable>
2396      <xsl:for-each select="ttcol">
2397        <fo:table-column>
2398          <xsl:choose>
2399            <xsl:when test="@width">
2400              <xsl:attribute name="column-width">proportional-column-width(<xsl:value-of select="substring-before(@width,'%')" />)</xsl:attribute>
2401            </xsl:when>
2402            <xsl:otherwise>
2403              <xsl:attribute name="column-width">proportional-column-width(<xsl:value-of select="(100 - number($total-specified)) div count(../ttcol[not(@width)])" />)</xsl:attribute>
2404            </xsl:otherwise>
2405          </xsl:choose>
2406        </fo:table-column>
2407      </xsl:for-each>
2408      <xsl:if test="ttcol!=''">
2409        <!-- skip header when all column titles are empty -->
2410        <fo:table-header start-indent="0em" space-after=".5em">
2411          <fo:table-row>
2412            <xsl:apply-templates select="ttcol" />
2413          </fo:table-row>
2414        </fo:table-header>
2415      </xsl:if>
2416      <fo:table-body start-indent="0em">
2417        <xsl:if test="$style='full' or $style='headers'">
2418          <xsl:attribute name="border-left-style">solid</xsl:attribute>
2419          <xsl:attribute name="border-right-style">solid</xsl:attribute>
2420          <xsl:attribute name="border-top-style">solid</xsl:attribute>
2421          <xsl:attribute name="border-bottom-style">solid</xsl:attribute>
2422          <xsl:attribute name="border-left-width">thin</xsl:attribute>
2423          <xsl:attribute name="border-right-width">thin</xsl:attribute>
2424          <xsl:attribute name="border-top-width">thin</xsl:attribute>
2425          <xsl:attribute name="border-bottom-width">thin</xsl:attribute>
2426        </xsl:if>
2427        <xsl:variable name="columns" select="count(ttcol)" />
2428        <xsl:for-each select="c[$columns=1 or (position() mod $columns) = 1]">
2429          <fo:table-row>
2430            <xsl:for-each select=". | following-sibling::c[position() &lt; $columns]">
2431              <fo:table-cell padding-left="0.5em" padding-right="0.5em">
2432                <xsl:if test="$style='full' or $style='headers'">
2433                  <xsl:attribute name="border-left-style">solid</xsl:attribute>
2434                  <xsl:attribute name="border-right-style">solid</xsl:attribute>
2435                  <xsl:attribute name="border-left-width">thin</xsl:attribute>
2436                  <xsl:attribute name="border-right-width">thin</xsl:attribute>
2437                </xsl:if>
2438                <xsl:if test="$style='full'">
2439                  <xsl:attribute name="border-top-style">solid</xsl:attribute>
2440                  <xsl:attribute name="border-bottom-style">solid</xsl:attribute>
2441                  <xsl:attribute name="border-top-width">thin</xsl:attribute>
2442                  <xsl:attribute name="border-bottom-width">thin</xsl:attribute>
2443                </xsl:if>
2444                <fo:block>
2445                  <xsl:variable name="pos" select="position()" />
2446                  <xsl:variable name="col" select="../ttcol[position() = $pos]" />
2447                  <xsl:if test="$col/@align">
2448                    <xsl:attribute name="text-align"><xsl:value-of select="$col/@align" /></xsl:attribute>
2449                  </xsl:if>
2450                  <xsl:apply-templates select="node()" />
2451                </fo:block>
2452              </fo:table-cell>
2453            </xsl:for-each>
2454          </fo:table-row>
2455        </xsl:for-each>
2456      </fo:table-body>
2457    </fo:table>
2458    <xsl:apply-templates select="postamble" />
2459    <xsl:if test="(@title!='' or @anchor!='') and not(@suppress-title='true')">
2460      <xsl:variable name="n"><xsl:number level="any" count="texttable[(@title!='' or @anchor!='') and not(@suppress-title='true')]" /></xsl:variable>
2461      <fo:block text-align="center" space-before="1em" space-after="1em">Table <xsl:value-of select="$n"/><xsl:if test="@title!=''">: <xsl:value-of select="@title" /></xsl:if></fo:block>
2462    </xsl:if>
2463  </fo:block>
2464</xsl:template>
2465
2466<xsl:template match="ttcol">
2467  <xsl:variable name="style">
2468    <xsl:choose>
2469      <xsl:when test="../@style!=''">
2470        <xsl:value-of select="../@style"/>
2471      </xsl:when>
2472      <xsl:otherwise>full</xsl:otherwise>
2473    </xsl:choose>
2474  </xsl:variable>
2475
2476  <fo:table-cell padding-left="0.5em" padding-right="0.5em">
2477    <xsl:if test="$style='full' or $style='headers'">
2478      <xsl:attribute name="border-left-style">solid</xsl:attribute>
2479      <xsl:attribute name="border-right-style">solid</xsl:attribute>
2480      <xsl:attribute name="border-top-style">solid</xsl:attribute>
2481      <xsl:attribute name="border-bottom-style">solid</xsl:attribute>
2482      <xsl:attribute name="border-left-width">thin</xsl:attribute>
2483      <xsl:attribute name="border-right-width">thin</xsl:attribute>
2484      <xsl:attribute name="border-top-width">thin</xsl:attribute>
2485      <xsl:attribute name="border-bottom-width">thin</xsl:attribute>
2486    </xsl:if>
2487<!--    <xsl:if test="@width">
2488      <xsl:attribute name="width"><xsl:value-of select="@width" /></xsl:attribute>
2489    </xsl:if> -->
2490    <xsl:choose>
2491      <xsl:when test="@align">
2492        <xsl:attribute name="text-align"><xsl:value-of select="@align" /></xsl:attribute>
2493      </xsl:when>
2494      <xsl:otherwise>
2495        <xsl:attribute name="text-align">left</xsl:attribute>
2496      </xsl:otherwise>
2497    </xsl:choose>
2498    <fo:block font-weight="bold">
2499      <xsl:apply-templates />
2500    </fo:block>
2501  </fo:table-cell>
2502</xsl:template>
2503
2504<xsl:template name="add-anchor">
2505  <xsl:if test="@anchor">
2506    <fo:block id="{@anchor}" />
2507  </xsl:if>
2508</xsl:template>
2509
2510<!-- cref support -->
2511
2512<xsl:template match="cref">
2513  <xsl:if test="$xml2rfc-comments!='no'">
2514    <xsl:variable name="cid">
2515      <xsl:call-template name="get-comment-name"/>
2516    </xsl:variable>
2517   
2518    <xsl:choose>
2519      <xsl:when test="$xml2rfc-inline!='yes'">
2520        <fo:footnote>
2521          <fo:inline>
2522            <fo:basic-link font-size="8pt" vertical-align="super" internal-destination="{$cid}">[<xsl:value-of select="$cid"/>]</fo:basic-link>
2523          </fo:inline>
2524          <fo:footnote-body>
2525            <fo:block font-size="10pt" start-indent="2em" text-align="left" id="{$cid}">
2526              <fo:inline font-size="8pt" vertical-align="super">[<xsl:value-of select="$cid"/>]</fo:inline>
2527              <xsl:text> </xsl:text>
2528              <xsl:apply-templates select="node()"/>
2529              <xsl:if test="@source"> --<xsl:value-of select="@source"/></xsl:if>
2530            </fo:block>
2531          </fo:footnote-body>
2532        </fo:footnote>
2533      </xsl:when>
2534      <xsl:otherwise>
2535        <fo:inline xsl:use-attribute-sets="comment">
2536          <xsl:text>[</xsl:text>
2537          <xsl:value-of select="$cid"/>
2538          <xsl:text>: </xsl:text>
2539          <xsl:apply-templates select="node()"/>
2540          <xsl:if test="@source"> --<xsl:value-of select="@source"/></xsl:if>
2541          <xsl:text>]</xsl:text>
2542        </fo:inline>
2543      </xsl:otherwise>
2544    </xsl:choose>   
2545  </xsl:if>
2546</xsl:template>
2547
2548
2549
2550<xsl:template name="insert-justification">
2551  <xsl:if test="$xml2rfc-ext-justification='always' or $xml2rfc-ext-justification='print'">
2552    <xsl:attribute name="text-align">justify</xsl:attribute>
2553  </xsl:if>
2554</xsl:template>
2555
2556<!-- Extensions -->
2557
2558<!-- Nothing to do for PDF output -->
2559<xsl:template match="x:assign-section-number" />
2560<xsl:template match="x:link" />
2561
2562<!-- Nothing to do here -->
2563<xsl:template match="x:anchor-alias" />
2564
2565<!-- internal ref support -->
2566<xsl:template match="x:ref">
2567  <xsl:variable name="val" select="."/>
2568  <xsl:variable name="target" select="//*[(@anchor and x:anchor-alias/@value=$val) or (@anchor=$val)]"/>
2569  <xsl:choose>
2570    <xsl:when test="$target">
2571      <fo:basic-link internal-destination="{$target/@anchor}" xsl:use-attribute-sets="internal-link">
2572        <xsl:call-template name="copy-anchor"/>
2573        <xsl:apply-templates/>
2574      </fo:basic-link>
2575    </xsl:when>
2576    <xsl:otherwise>
2577      <xsl:call-template name="warning">
2578        <xsl:with-param name="inline" select="'no'"/>
2579        <xsl:with-param name="msg">internal link target for '<xsl:value-of select="."/>' does not exist.</xsl:with-param>
2580      </xsl:call-template>
2581      <xsl:apply-templates/>
2582    </xsl:otherwise>
2583  </xsl:choose>
2584</xsl:template>
2585
2586<!-- BCP14 keywords -->
2587<xsl:template match="x:bcp14">
2588  <!-- figure out something that prints well -->
2589  <xsl:apply-templates/>
2590</xsl:template>
2591
2592<!-- Notes -->
2593<xsl:template match="x:note">
2594  <xsl:apply-templates/>
2595</xsl:template>
2596
2597<!-- Quotes -->
2598<xsl:template match="x:blockquote">
2599  <fo:block font-style="italic" space-before=".5em" space-after=".5em" start-indent="3em"
2600      border-left-style="solid" border-left-color="gray" border-left-width=".25em" padding-left=".5em">
2601    <xsl:apply-templates/>
2602  </fo:block>
2603</xsl:template>
2604
2605<xsl:template match="x:q">
2606  <fo:wrapper font-style="italic">
2607    <xsl:text>&#8220;</xsl:text>
2608    <xsl:apply-templates/>
2609    <xsl:text>&#8221;</xsl:text>
2610  </fo:wrapper>
2611</xsl:template>
2612
2613<!-- Definitions -->
2614<xsl:template match="x:dfn">
2615  <fo:wrapper font-style="italic">
2616    <xsl:if test="not(preceding-sibling::x:dfn) and count(following-sibling::list)=1">
2617      <xsl:attribute name="keep-with-next">always</xsl:attribute>
2618    </xsl:if>
2619    <xsl:apply-templates/>
2620  </fo:wrapper>
2621</xsl:template>
2622
2623<!-- Headings -->
2624<xsl:template match="x:h">
2625  <fo:wrapper font-weight="bold">
2626    <xsl:apply-templates/>
2627  </fo:wrapper>
2628</xsl:template>
2629
2630<!-- Highlightinghing -->
2631<xsl:template match="x:highlight">
2632  <fo:wrapper font-weight="bold">
2633    <xsl:apply-templates/>
2634  </fo:wrapper>
2635</xsl:template>
2636
2637<!-- Superscripts -->
2638<xsl:template match="x:sup">
2639  <xsl:text>^</xsl:text> <!-- make this prettier -->
2640  <xsl:apply-templates/>
2641</xsl:template>
2642
2643<!-- measuring lengths -->
2644<xsl:template match="x:length-of">
2645  <xsl:variable name="target" select="//*[@anchor=current()/@target]"/>
2646  <xsl:if test="count($target)!=1">
2647    <xsl:call-template name="error">
2648      <xsl:with-param name="msg" select="concat('@target ',@target,' defined ',count($target),' times.')"/>
2649    </xsl:call-template>
2650  </xsl:if>
2651  <xsl:variable name="content">
2652    <xsl:apply-templates select="$target"/>
2653  </xsl:variable>
2654  <xsl:variable name="lineends" select="string-length($content) - string-length(translate($content,'&#10;',''))"/>
2655  <xsl:variable name="indents">
2656    <xsl:choose>
2657      <xsl:when test="@indented">
2658        <xsl:value-of select="number(@indented) * $lineends"/>
2659      </xsl:when>
2660      <xsl:otherwise>0</xsl:otherwise>
2661    </xsl:choose>
2662  </xsl:variable>
2663  <xsl:value-of select="string-length($content) + $lineends - $indents"/>
2664</xsl:template>
2665
2666<!-- Nop -->
2667<xsl:template match="x:span">
2668  <xsl:apply-templates/>
2669</xsl:template>
2670
2671<!-- XML checking -->
2672<xsl:template match="x:parse-xml">
2673  <xsl:apply-templates/>
2674</xsl:template>
2675
2676<xsl:template match="x:abnf-char-sequence">
2677  <xsl:choose>
2678    <xsl:when test="substring(.,1,1) != '&quot;' or substring(.,string-length(.),1) != '&quot;'">
2679      <xsl:call-template name="error">
2680        <xsl:with-param name="msg" select="'contents of x:abnf-char-sequence needs to be quoted.'" />
2681      </xsl:call-template>
2682    </xsl:when>
2683    <xsl:otherwise>
2684      <xsl:text>%x</xsl:text>
2685      <xsl:call-template name="to-abnf-char-sequence">
2686        <xsl:with-param name="chars" select="substring(.,2,string-length(.)-2)"/>
2687      </xsl:call-template>
2688    </xsl:otherwise>
2689  </xsl:choose>
2690</xsl:template>
2691
2692<!-- inlined RDF support -->
2693<xsl:template match="rdf:Description">
2694  <!-- ignore -->
2695</xsl:template>
2696
2697<!-- box drawing -->
2698
2699<!-- nop for alignment -->
2700<xsl:template match="x:x"/>
2701
2702<!-- box -->
2703<xsl:template match="x:bt|x:bc|x:bb">
2704  <xsl:apply-templates />
2705</xsl:template>
2706
2707<!-- author handling extensions -->
2708<xsl:template match="x:include-author">
2709  <xsl:for-each select="/*/front/author[@anchor=current()/@target]">
2710    <xsl:apply-templates select="."/>
2711  </xsl:for-each>
2712</xsl:template>
2713
2714<!-- boilerplate -->
2715<xsl:template match="x:boilerplate">
2716  <xsl:apply-templates/>
2717</xsl:template>
2718
2719  <!-- experimental: format URI with zero-width spaces to ease line breaks -->
2720 
2721  <xsl:template name="format-uri">
2722    <xsl:param name="s"/>
2723    <xsl:param name="mode"/>
2724   
2725    <xsl:choose>
2726      <!-- optimization for not hypenating the scheme name -->
2727      <xsl:when test="$mode!='after-scheme' and string-length(substring-before($s,':')) > 2">
2728        <xsl:value-of select="concat(substring-before($s,':'),':&#x200b;')"/>
2729        <xsl:call-template name="format-uri">
2730          <xsl:with-param name="s" select="substring-after($s,':')"/>
2731          <xsl:with-param name="mode" select="'after-scheme'"/>
2732        </xsl:call-template>
2733      </xsl:when>
2734      <!-- do no insert break points after hyphens -->
2735      <xsl:when test="starts-with($s,'-')">
2736        <xsl:text>-</xsl:text>
2737        <xsl:call-template name="format-uri">
2738          <xsl:with-param name="s" select="substring($s,2)"/>
2739          <xsl:with-param name="mode" select="'after-scheme'"/>
2740        </xsl:call-template>
2741      </xsl:when>
2742      <!-- last char?-->
2743      <xsl:when test="string-length($s)=1">
2744        <xsl:value-of select="$s"/>
2745      </xsl:when>
2746      <!-- add one zwsp after each character -->
2747      <xsl:when test="$s!=''">
2748        <xsl:value-of select="concat(substring($s,1,1),'&#x200b;')"/>
2749        <xsl:call-template name="format-uri">
2750          <xsl:with-param name="s" select="substring($s,2)"/>
2751          <xsl:with-param name="mode" select="'after-scheme'"/>
2752        </xsl:call-template>
2753      </xsl:when>
2754      <xsl:otherwise>
2755        <!-- done -->
2756      </xsl:otherwise>
2757    </xsl:choose>
2758   
2759  </xsl:template>
2760
2761</xsl:transform>
Note: See TracBrowser for help on using the repository browser.