source: rfc2629xslt/rfc2629toFO.xslt @ 571

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

Update to latest version of rfc2629.xslt.

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