XSL-FO 高级技术2

概述 第 1 页(共9 页)


您已经了解了块和内联对象的基础知识,所以现在可以继续了解格式化列表的复杂性。本章研究无序列表、有序列表和定义列表,它们是 HTML 中最常见的三种列表。当用 XSL-FO 构建这些列表时,您必须亲自处理许多事情:

  • 列表项(项目符号或编号)的标号与项本身相隔多少水平距离
  • 列表项从正常的页边距缩进了多少
  • 项目符号是什么
  • 列表项之间的垂直间隔是多少

本章还讨论其它特性。几乎所有这些特性都是在 HTML 浏览器中自动处理的,但当使用格式化对象时,取决于您如何定义它们。

XSL-FO 列表结构 第 2 页(共9 页)


XSL-FO 中的列表结构类似于:


<fo:list-block>
  <fo:list-item>
    <fo:list-item-label>
      <fo:block/>
    </fo:list-item-label>
    <fo:list-item-body>
      <fo:block/>
    </fo:list-item-body>
  </fo:list-item>
  ... More <fo:list-item>s ...
</fo:list-block>
 

主结构是 <fo:list-block>。它包含一些 <fo:list-item>,每个 <fo:list-item> 都包含一个 <fo:list-item-label> 和一个 <fo:list-item-block>。首先,让我们看一下 <fo:list-block> 元素及其子元素的特性。

列表各部分一瞥 第 3 页(共9 页)


您需要熟悉许多与<fo:list-block> 元素及其子元素相关的特性。从研究下图开始着手,此图概述了列表及其特性:

具有 <fo:list-block> 特性的列表略图

在上图中,可以看到 <fo:list-block> 元素的两个特性:provisional-distance-between-startsprovisional-label-separationprovisional-distance-between-starts 特性定义 <fo:list-item-label> 的开始部分与 <fo:list-item-body> 的开始部分之间的距离。provisional-label-separation 特性定义 <fo:list-item-label>结束部分<fo:list-item-block> 的开始部分之间的距离。

下面是一个典型的 <fo:list-block>,其中指定了这些特性:


<fo:list-block provisional-distance-between-starts="0.75cm"
  provisional-label-separation="0.5cm">

   
   
列表特性:缩进开始 第 4 页(共9 页)


指定列表格式包括定义列表各部分的两边的缩进。首先,查看 <fo:list-item-label><fo:list-item-block> 元素的 start-indent 特性:

显示 start-indent 特性的列表略图

start-indent 特性定义了从正常的起始页边距(列表之上段落的起始位置)到 <fo:list-item-label><fo:list-item-body> 的开始部分的距离。下面是一个样本 <fo:list-item>,其中定义了 start-indent 特性:


<fo:list-item>
  <fo:list-item-label start-indent="5mm">
    <fo:block>1.</fo:block>
  </fo:list-item-label>
  <fo:list-item-body start-indent="body-start()">
    <fo:block>Now is the time for all good men
      and women to come to the aid of the party.</fo:block>
  </fo:list-item-body>
</fo:list-item>

请记住:如果从右到左读取文本,那么页面上的起始位置就位于右侧。如果自上而下读取,那么起始位置位于顶部。

在该示例中,<fo:list-item-label>start-indent 是用文字指定的值,而 <fo:list-item-block>start-indent 使用 XSL-FO 函数 body-start() 来计算起始缩进。body-start() 函数的返回值为 <fo:list-item-label>start-indent 特性值加上 <fo:list-block>provisional-distance-between-starts 特性值。


列表特性:缩进结束 第 5 页(共9 页)


下面是如何设置 <fo:list-item-label><fo:list-item-body> 元素中列表各部分的末尾缩进。下面是一个略图:

显示 end-indent 特性的列表略图

end-indent 特性定义从正常的结束页边距(列表之上段落的结束位置)和 <fo:list-item-body> 元素的结束之间的距离。下面是一个典型的 <fo:list-item>,其中指定了 end-indent 特性:


<fo:list-item>
  <fo:list-item-label end-indent="label-end()">
    <fo:block>1.</fo:block>
  </fo:list-item-label>
  <fo:list-item-body end-indent="5mm">
    <fo:block>Now is the time for all good men
      and women to come to the aid of the party.</fo:block>
  </fo:list-item-body>
</fo:list-item>

请记住:如果从右到左读取文本,那么页面上的起始位置就位于右侧。如果自上而下读取,那么起始位置位于顶部。

在该示例中,<fo:list-item-label> 元素使用 XSL-FO 的 label-end() 函数来计算 <fo:list-item-label> 的结束位置。该函数的返回值为 <fo:list-item-body> 元素的 start-indent 特性值减去 <fo:list-item-block> 元素的 provisional-label-separation 特性值。通常不设置 <fo:list-item-body>end-indent 特性,这表示列表项的结束页边距与列表之上的段落相同。


编号列表 第 6 页(共9 页)


既然您已经掌握了设置列表的基础知识,就可以将注意力转向最常用的列表类型,先从编号列表(numbered list)开始。

要创建编号列表,必须生成项目编号。为此,要使用 <xsl:number> 元素。通常,XSLT 模板类似于:


<xsl:template match="ol/li">
  <fo:list-item space-after="3pt">
    <fo:list-item-label end-indent="label-end()>
      <fo:block>
        <xsl:number value="position()" format="1."/>
      </fo:block>
    </fo:list-item-label>
    <fo:list-item-body start-indent="body-start()">
      <xsl:apply-templates select="*|text()"/>
    </fo:list-item-body>
  </fo:list-item>
</xsl:template>
 

这为原始文档中 <ol> 元素下的每个 <li> 元素生成一个新的 <fo:list-item>

有关对有序列表更为复杂处理的详细信息,请参考本教程的姊妹篇“HTML to FO conversion guide”。


项目符号列表 第 7 页(共9 页)


项目符号列表(Bulleted list)比编号列表简单,但您必须提供项目符号(也称作印刷符号,dingbat)。完成这项任务的最佳方法是使用 Unicode 字符实体:


<xsl:template match="ul/li">
  <fo:list-item space-after="3pt">
    <fo:list-item-label end-indent="label-end()>
      <fo:block>&#x2022;</block>
    </fo:list-item-label>
    <fo:list-item-body start-indent="body-start()">
      <xsl:apply-templates select="*|text()"/>
    </fo:list-item-body>
  </fo:list-item>
</xsl:template>

这为原始文档中作为 <ul> 元素的子元素的每个<li> 元素生成一个新的 <fo:list-item>

有关处理无序列表的更详细信息,请参考本教程的姊妹篇“HTML to FO conversion guide”。


定义列表 第 8 页(共9 页)


可以以几种方法来处理定义列表;最简单的方法是将术语放在单个行上并以黑体字显示它,接着在下一行开始该术语的定义。我自己更喜欢缩进定义,其模板如下:


<xsl:template match="dt">
  <fo:block font-weight="bold">
    <xsl:apply-templates select="*|text()"/>
  </fo:block>
</xsl:template>
<xsl:template match="dd">
  <fo:block start-indent="15pt">
    <xsl:apply-templates select="*|text()"/>
  </fo:block>
</xsl:template>

有关处理定义列表的更详细信息,请参考本教程的姊妹篇“HTML to FO conversion guide”。


 


列表示例 第 9 页(共9 页)


在结束本章之前,让我们看一下样本 XSL-FO 文件,它包含了所有这三种列表。源代码在文件 中。不同列表包含本章中讨论的列表特性的不同值;您可以查看文件 以了解那些值如何影响文本的实际布局。下面是一段 PDF 文件:

lists.pdf 样本文件的抓屏

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值