source: rfc2629xslt/rfc2629toFO.xslt @ 643

Last change on this file since 643 was 588, checked in by julian.reschke@…, 11 years ago

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

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