source: rfc2629xslt/rfc2629toFO.xslt @ 662

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

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

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