source: rfc2629xslt/rfc2629toFO.xslt @ 1368

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

update rfc2629.xslt, bump up document dates

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