source: rfc2629xslt/rfc2629toFO.xslt @ 754

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

Update to latest version of xml2rfc and rfc2629.xslt, bump document dates

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