首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

HTML 至格式化对象(FO)转换指南(7)命名锚点引用

HTML 至格式化对象(FO)转换指南(7)命名锚点引用

<kbd> 键盘输入通常以稍大的等宽字体来表示键盘输入(在 HTML 中,用                 <kbd> 元素表示键盘输入)。下面是 HTML 样本:            
1
2
3
4
<p>
  An easy way to delete a directory and all its contents (including
  all subdirectories) is with the <kbd>rd /s</kbd> command.
</p>




可以用如下的 XSL-FO 元素来表示该样本:
1
2
3
4
5
6
<fo:block>
  An easy way to delete a directory and all its contents (including
  all subdirectories) is with the
  <fo:inline font-family="monospace" font-size="110%">rd /s</fo:inline>
  command.
</fo:block>




进行这一转换的 XSLT 模板比较简单:
1
2
3
4
5
6
7
<xsl:template match="kbd">
  <fo:inline
         
        font-family="monospace" font-size="110%">
    <xsl:apply-templates select="*|text()"/>
  </fo:inline>
</xsl:template>




<li> 列表项处理列表项                几乎和处理段落一样,只是有几处细微的差别。因为这些差别取决于列表项的父元素(                 <li> 元素在                 <ol> 元素中还是在                 <ul> 元素中?),所以请在                 <ol> 元素                和                <ul> 元素                项下查看有关列表项的详细信息。            
<nobr> 无换行的文本HTML                 <nobr> 元素指出:无论                 <nobr> 元素中包含多少内容,浏览器都不应换行。例如,考虑以下 HTML 标记:            
1
2
3
4
5
6
7
8
<p>
  On the Windows 2000 command line, you can use the ampersand (&) to
  combine several commands into one statement.
  <nobr>
    pushd d:\\projects\\xslfo & del *.fo & rebuild.bat & popd
  </nobr>
  is an example of this technique.
</p>




要用格式化对象表示这一内容,可使用带                 wrap-option="no-wrap" 属性的                 <fo:inline> 元素。            
1
2
3
4
5
6
7
<fo:block>
  On the Windows 2000 command line, you can use the ampersand (&)
  to combine several commands into one statement.  
  <fo:inline wrap-option="no-wrap">pushd d:\\projects\\xslfo &
  del *.fo & rebuild.bat & popd </fo:inline> is an
  example of this technique.
</fo:block>




进行这一转换的 XSLT 模板比较简单:
1
2
3
4
5
6
7
<xsl:template match="nobr">
  <fo:inline
         
        wrap-option="no-wrap">
    <xsl:apply-templates select="*|text()"/>
  </fo:inline>
</xsl:template>




<ol> 有序列表XSL-FO 词汇所具有的特征是:有专门用于列表(包括有序列表)的元素。以下是样本 HTML 列表:
1
2
3
4
5
6
7
8
<p>A few of my favorite albums</p>
<ol>
  <li>A Love Supreme</li>
  <li>Remain in Light</li>
  <li>London Calling</li>
  <li>The Indestructible Beat of Soweto</li>
  <li>The Joshua Tree</li>
</ol>




要用 XSL-FO 表示这些列表项,必须使用这几个元素:                 <fo:list-block> 、                 <fo:list-item> 、                 <fo:list-item-label> 和                 <fo:list-item-body> 。下面介绍如何使用它们:            
  • <fo:list-block> 元素包含整个列表。
  • 每个                     <fo:list-item> 元素包含单个列表项;该元素包含                     <fo:list-item-label> 和                     <list-item-body> 元素。
  • <fo:list-item-label> 是内容旁边的标号。例如,对于有序列表,                     <fo:list-item-label> 元素可能包含文本                     10. 。
  • <fo:list-item-body> 包含列表项的实际内容。
下面是 HTML 标记转换为格式化对象后的情形:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<fo:block>A few of my favorite albums</fo:block>
<fo:list-block provisional-distance-between-starts="0.75cm"
  provisional-label-separation="0.5cm" space-after="12pt"
  start-indent="1cm">
  <fo:list-item>
    <fo:list-item-label end-indent="label-end()">
      <fo:block>1. </fo:block>
    </fo:list-item-label>
    <fo:list-item-body start-indent="body-start()">
      <fo:block>
        A Love Supreme
      </fo:block>
    </fo:list-item-body>
  </fo:list-item>
   ...
  <!-- other list items appear here -->
   ...
</fo:list-block>




以下显示了进行转换的 XSLT 模板。这些模板必须处理以下几种情况:
  • 如果该列表出现在另一列表中,则不在该列表后插入任何空白。否则,在该列表后插入距离为 12 点的垂直空间。
  • 如果该列表不在任何其它列表中,则将其缩进                     1 cm 。否则,它缩进的距离为                     1 cm 加上其它每个列表缩进的                     1.25 cm 。例如,如果该列表是第三级列表,则将该列表缩进                     3.5 cm 。
  • 如果                     <ol> 元素有                     start 属性,则以这个数字开始对列表项编号。如果没有该属性,那么只需用 XSLT                     position() 函数对列表项编号。
  • 如果                     <ol> 元素有                     type 属性,则用这个值来决定应该如何格式化每个列表项的数字(罗马数字、阿拉伯数字或按字母次序的字符)。该模板用                     <xsl:number> 元素的                     format 属性做到这一点。
以下就是转换所有                 <ol> 和                 <li> 项的 XSLT 模板(使用带项目符号的列表中的规则):            
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
<xsl:template match="ol">
  <fo:list-block provisional-distance-between-starts="1cm"
    provisional-label-separation="0.5cm">
    <xsl:attribute name="space-after">
      <xsl:choose>
         
         
        <xsl:when test="ancestor::ul or ancestor:l">
          <xsl:text>0pt</xsl:text>
        </xsl:when>
        <xsltherwise>
          <xsl:text>12pt</xsl:text>
          </xsltherwise>
      </xsl:choose>
    </xsl:attribute>
    <xsl:attribute name="start-indent">
      <xsl:variable name="ancestors">
        <xsl:choose>
           
         
        <xsl:when test="count(ancestor:l) or count(ancestor::ul)">
            <xsl:value-of select="1 +
                                  (count(ancestor:l) +
                                   count(ancestor::ul)) *
                                  1.25"/>
          </xsl:when>
          <xsltherwise>
            <xsl:text>1</xsl:text>
          </xsltherwise>
        </xsl:choose>
      </xsl:variable>
      <xsl:value-of select="concat($ancestors, 'cm')"/>
    </xsl:attribute>
    <xsl:apply-templates select="*"/>
  </fo:list-block>
</xsl:template>
<xsl:template match="ol/li">
  <fo:list-item>
    <fo:list-item-label end-indent="label-end()">
      <fo:block>
        <xsl:variable name="value-attr">
          <xsl:choose>
            
         
        <xsl:when test="../@start">
              <xsl:number value="position() + ../@start - 1"/>
            </xsl:when>
            <xsltherwise>
              <xsl:number value="position()"/>
            </xsltherwise>
          </xsl:choose>
        </xsl:variable>
        <xsl:choose>
           
         
        <xsl:when test="../@type='i'">
            <xsl:number value="$value-attr" format="i. "/>
          </xsl:when>
          <xsl:when test="../@type='I'">
            <xsl:number value="$value-attr" format="I. "/>
          </xsl:when>
          <xsl:when test="../@type='a'">
            <xsl:number value="$value-attr" format="a. "/>
          </xsl:when>
          <xsl:when test="../@type='A'">
            <xsl:number value="$value-attr" format="A. "/>
          </xsl:when>
          <xsltherwise>
            <xsl:number value="$value-attr" format="1. "/>
          </xsl:otherwise>
        </xsl:choose>
      </fo:block>
    </fo:list-item-label>
    <fo:list-item-body start-indent="body-start()">
      <fo:block>
        <xsl:apply-templates select="*|text()"/>
      </fo:block>
    </fo:list-item-body>
  </fo:list-item>
</xsl:template>




这两个模板将                 <ol> 和                 <li> 元素转换成相应的 XSL-FO 元素。
返回列表