source: rfc2629xslt/rfc2629toFO.xslt @ 689

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

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

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