World Wide Web 联盟的规范书将可扩展样式语言(XSL)规划成两个部分:
■XSLT用来转换XML文件
■XSL对象格式(XSL FO) 用来详细说明格式语句的 XML函数库。
XSLT 非常容易学习和使用。只需要花费很少的时间,开发者就能将XML 文档转换成可以在用户自己浏览器上看到的HTML 文档。这也是开发者喜欢使用XSLT的原因。
XSL对象格式是一个以XML为基础的扩展函数库,能详细定义标记页数、版面和字体等网页内容信息。XSL FO 扩展语言非常复杂,也很冗长;但只有通过XSL FO 才能快速把XSLT 转换成文档源文件。
除了完全介绍XSL FO,这篇文章还将提供足够的信息和例子来说明怎样使用XSL FO。我们将通过XSL FO学习制作一个西班牙语的评论手册并将它打印出来。我们将使用Apache Software Foundation 的 FOP 工具软件使FO 文件转换成PDF 文件。
初始化
把XSL FO 文件转换成XML 文档,先需要基本的XML处理指令和FO 根元素:
<?xml version="1.0" encoding="utf-8"?>
<fo:root>
文档的结构为:
●主要的版面设计,由以下组成
○文档可能出现的各种页面
○安排这些页面的格式序列
●页面和它们的内容
页面规划
在FO 文档的开始<fo:root> 标签后,我们必须描述文档所拥有的页面类型。文档拥有下面图表中的三种页面。按照空白区域分类为封面、左边页和右边页。封面和左边页在左面有较多的空白区域。每个页面都有页眉和页脚。
让我们从定位页面长度、宽度及空白空间开始。在文章里单位都使用厘米,也可以使用任何CSS 单位,如象素 (pixel)、毫米、英寸等。这些规格被命名为simple-page-master 并用 master-name语句指定。请看代码示例。需要注意的是页面空白区域不能有任何需要印刷出来的内容。
内容区
在所有的印刷品的图表中都会有零星的线条。那是页面的内容区(正式上被称作页面参照区), 在下面可以看出内容区被分成五个区域。
说明
我们必须先了解一些术语。当我们设定页面边的空白时,我们会使用top, bottom, left, and right这样的词汇。因为每个人都认为纸张的一块边缘就是纸张的左边、顶部、底部和右边。当我们谈到内容区域时会使用不同的词汇,因为不是所有的语言都能描述左到右或顶部到底部。
FO 认为一个页面由两种元素构成: block elements (例如文章的段落)它由新的一行起头。inline elements (例如字体的粗体和斜体)。FO的block-progress-direction 决定了段落在页面的位置。before-edge表示在段落之前,after-edge 表示在段落之后。
inline-progress-direction 决定了在一行话中每个字符的位置。start-edge 表示位置在一行话之前, end-edge表示位置在一行话之后。
对于希伯莱语来说,象以下所示:开头和结尾中文字位置与英语习惯是互相对应的。(阿拉伯语的写法也相似)
日语写法有时象下面一样写,下面是XSL 规范手册中的图片:
这种新函数库最大的优势是它使用的语言不受约束。如果你希望页面的标题出现在和普通文本相对应的位置,你可以象下面一样设定 text-align="end"
一个有趣的标题
标题一般在最上方,这样才能吸引读者的注意
如果文档最后要翻译成阿拉伯语或日语,你仍然能确定标题仍然出现在文本相对应的位置。就不需要来回调整文档的左右和上下。
指定区域的尺寸
封面页不需要页眉和页脚,所以我们只需要象以下所示的用粗体指定region-body信息。
<fo:simple-page-master master-name="cover"
page-height="12cm"
page-width="12cm"
margin-top="0.5cm"
margin-bottom="0.5cm"
margin-left="1cm"
margin-right="0.5cm">
<fo:region-body
margin-top="3cm" />
</fo:simple-page-master>
左边页和右边页拥有页眉和页脚,所以我们需要指定region-before 和 region-after的范围。
要点:你得给region-body 指定范围,相当于指定region-before 和region-after 的范围 (FOP 现在不支持region-start 和region-end)。如果你象下面这样做 :
<fo:region-before extent="1cm"/>
<fo:region-after extent="1cm"/>
<fo:region-body
margin-top="0.20cm"
margin-bottom="0.20cm" />
结果会是: