source: rfc2629xslt/rfc2629toFO.xslt @ 329

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

update to latest version of rfc2629.xslt

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