source: rfc2629xslt/rfc2629toFO.xslt

Last change on this file was 2754, checked in by julian.reschke@…, 4 years ago

update XSLTs, add RFC 7838

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