source: rfc2629xslt/rfc2629toFO.xslt @ 246

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

Update to latest version of rfc2629xslt.

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