source: rfc2629xslt/rfc2629toFO.xslt @ 440

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

update to latest version of rfc2629.xslt, add <workgroup> element throughout

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