概述 | 第 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>
元素的两个特性:provisional-distance-between-starts
和 provisional-label-separation
。provisional-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
特性定义了从正常的起始页边距(列表之上段落的起始位置)到 <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
特性定义从正常的结束页边距(列表之上段落的结束位置)和 <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>•</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 样本文件的抓屏](https://www6.software.ibm.com/developerworks/cn/education/xml/x-xslfo2/tutorial/images/lists.jpg)