source: rfc2629xslt/rfc2629toFO.xslt @ 830

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

latest versions of rfc2629.xslt and xml2rfc.tcl, bump up document dates

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