source: rfc2629xslt/rfc2629toFO.xslt @ 1217

Last change on this file since 1217 was 1145, checked in by julian.reschke@…, 9 years ago

bump up document dates, update to latest version of rfc2629.xslt

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