1.什么是XSL-FO?
XSL-FO 是用于将结果格式化成XML数据的语言,XSL-FO全称为(Extensible Stylesheet Language Formatting Objects:扩展格式化对象样式表语言),XSL-FO 是W3C的推荐标准,XSL-FO 现在通常被称为XSL。
XSL-FO 是用于格式化数据的
XSL是一种基于XML的标记语言,它对输出到屏幕、纸张或其它媒体上的XML数据的格式化作了具体的描述。
XSL-FO现在通常叫做XSL
样式化包括信息的转换和格式化。当万维网联盟(W3C)做出第一份XSL工作草案时,它包括了XML文档的转换和格式化的语法。后来,W3C的XSL工作组把原草案分成了以下几块参考标准:
l XSLT,用于转换XML文档的语言
l XSL 或 XSL-FO,用于格式化XML文档的语言
l XPath,用于将XML文档中的元素和属性进行定位的语言
该教程剩下的部分是关于格式化XML文档的语言的:XSL-FO,也称为XSL。
XSL-FO是一个网络标准
2001年10月15日,XSL-FO已经成为了W3C的推荐标准。它通常被称为XSL。
2.XSL-FO文档
XSL-FO文档是包含输出信息的XML文件。它们包含了与输出的布局和输出的内容相关的信息。XSL-FO文档以扩展名“a .fo” 或 “a .fob” 的文件保存在文件里。XSL-FO文档也通常以“an .xml” 扩展名来保存。因为这样做可以使它们能更容易被XML编辑器访问。
XSL-FO文档结构
<?xml version="1.0" encoding="UTF-8"?> <fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format"> </fo:root> |
结构说明
XSL-FO 文档是XML文档,所以必须在文档的起始处包含一份XML声明:
<?xml version="1.0" encoding="UTF-8"?>
<fo:root> 元素是XSL-FO文档的根元素。根元素也给XSL-FO声明了命名空间:
<fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format">
<!-- The full XSL-FO document goes here -->
</fo:root>
<fo:layout-master-set> 元素包含了一个或多个页面模板:
<fo:layout-master-set>
<!-- All page templates go here -->
</fo:layout-master-set>
每个<fo:simple-page-master>元素包含着一个单独的页面模板。每个模板都包含一个独立的名称:
<fo:simple-page-master master-name="A4">
<!-- One page template goes here -->
</fo:simple-page-master>
一个或多个<fo:page-sequence>元素描述了页面内容。Master-reference 属性指的是同名的“simple-page-master” 模板。
<fo:page-sequence master-reference="A4">
<!-- Page content goes here -->
</fo:page-sequence>
注意:事实上,master-reference = "A4" 并未真正地描述预定义页面格式。它只是一个名称而已。你可以随意命名,如:"MyPage"、"MyTemplate" 等等这样的名称。
3.XSL-FO 区域
XSL格式化模型定义了大量的矩形域(块状区)来显示结果。所有的结果(文本、图片,等等)都会被格式化以后放入这些区域里,并且,它将会在目标媒体上显示或打印出来。让我们进一步看看下面的区域:
l Pages 页面
l Regions 区域
l Block areas 块状区域
l Line areas 行区域
l Inline areas 行内区域
XSL-FO 页面
XSL-FO 结果被格式化成页面形式。打印出来的结果通常会被写进很多独立的页面。浏览器的输出的结果通常会显示长长的一页。XSL-FO页面包含区域。
XSL-FO 区域
每张XSL-FO页面都包含大量的区域。
l region-body 区域 主体(页面的主体)
l region-before 区域头部(页面页首)
l region-after 区域尾部(页面的页脚)
l region-start 区域左端(左工具条)
l region-end 区域右端(右工具条)
XSL-FO 区域包含块状区域。
XSL-FO 块状区域
XSL-FO 块状区域定义了小块状元素(通常是以新的一行作为起始的元素),例如图表、表格和列表。XSL-FO 块状区域可以包含其它的块状区域,但是大多数情况下,它们通常包含行区域。
XSL-FO 行区域
XSL-FO 行区域定义了块状区域内部的文本行。XSL-FO 行区域包含行内区域。
XSL-FO Inline 行内区域
XSL-FO 行内区域定义了行内的文本内容(段首粗体圆点、单字符、图形,等等)。
4.XSL-FO 输出
XSL-FO 在<fo:flow> 元素中定义输出结果。
XSL-FO 页面、流程和区域
“块状区域”的内容首先进入“页面”,然后再由指定的媒体输出。XSL-FO 的输出结果通常被嵌套在<fo:block>元素、<fo:flow>元素、以及<fo:page-sequence>元素中,具体如下:
<fo:page-sequence> |
XSL-FO 案例
下面列举一个关于XSL-FO的实际案例:
<?xml version="1.0" encoding="UTF-8"?> <fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format"> </fo:root> |
上述代码应该输出下述结果:
Hello w3pop.com |
5.XSL-FO 流程
XSL-FO 将被来自<fo:flow>元素中的数据所填充。XSL-FO 使用<fo:page-sequence>元素来定义结果页面。每个结果页面都包含了定义页面布局的页面主体元素。每个结果页面都包含一个定义输出结果的<fo:flow>元素。每个结果页面都会按照一定顺序打印(或显示)。
XSL-FO 流程
XSL-FO 将被来自<fo:flow>元素中的内容所填充。<fo:flow> 元素包含了需要在页面上打印的所有元素。当页面被印满时,相同的页面主体元素会被反复地使用,直到所有的文本内容都被打印出来为止。
流程“流向”哪里?
<fo:flow> 元素包含“flow-name(流程名称)”属性。“flow-name(流程名称)”的属性值定义了<fo:flow>元素的内容将流向何处。所有合法值如下:
l xsl-region-body :流向区域主体
l xsl-region-before :流向区域最上端
l xsl-region-after :流向区域最下端
l xsl-region-start :流向区域左端
l xsl-region-end :流向区域右端
6.XSL-FO 页面
XSL-FO 使用名为 “Page Masters [ 页面主体 ] ” 的页面模板来定义页面的布局。
XSL-FO 页面模板
XSL-FO 使用名为“Page Masters [ 页面主体 ] ” 的页面模板来定义页面的布局。每块模板必须包含一个独立的名称:
<fo:simple-page-master master-name="intro"> <fo:simple-page-master master-name="left"> <fo:simple-page-master master-name="right"> |
在上述案例中,三个<fo:simple-page-master>元素,定义了三块不同的模板。每块模板都包含不同的名称。第一块模板称为“intro”,它是用于介绍页面的模板。第二和第三块模板称作"left" 和 "right"。它们是用于定义奇数页面和偶数页面。
XSL-FO 页面大小
XSL-FO 使用下述属性来定义页面的尺寸:
a) page-width 定义了页面的宽度
b) page-height 定义了页面的高度
XSL-FO 页面边界
XSL-FO 用下述属性来定义页面边界:
a) margin-top 定义顶边界
b) margin-bottom 定义底边界
c) margin-left 定义左边界
d) margin-right 定义右边界
e) margin 定义所有四个边界
XSL-FO 页面区域
XSL-FO 使用以下元素来定义页面的区域:
a) region-body 定义主体区域
b) region-before 定义顶端区域(页眉)
c) region-after 定义底端区域(页脚)
d) region-start 定义左端区域(左端工具条)
e) region-end 定义右端区域(右端工具条)
前端区域(region-before),后端区域(region-after),起始区域(region-start),终止区域(region-end)是主体区域的一部分。为了避免文本在主体区域内溢出,主体区域的边界尺寸至少要和上述这些区域一样。
|
XSL-FO例子
下面列举了一份XSL-FO文档的部分内容:
<fo:simple-page-master master-name="A4" |
上述代码定义了名称为"A4"的“Simple Page Master”模板。这张页面宽297毫米,高210毫米。页面的上下左右边界都是1厘米。主体部分的四条边上包含了宽为3厘米的边界。主体的上下左右部分都是2厘米。在上述案例中,主体宽度 = 页面自身宽度 - 左右边界宽度 - 区域主体边界宽度,具体如下:
297mm - (2 x 1cm) - (2 x 3cm) = 297mm - 20mm - 60mm = 217mm.
注意:区域(左端区域和右端区域)并不在计算范围之内。如同前面所说的那样,这些区域只是主体的一部分。
7.XSL-FO 块状区域
XSL-FO 结果将输入块状区域。
XSL-FO 页面、流程 以及 块状区域
“块状区域”的内容首先进入“页面”,然后再由指定的媒体输出。XSL-FO 的输出结果通常被嵌套在<fo:block>元素、<fo:flow>元素、以及<fo:page-sequence>元素中,具体如下:
<fo:page-sequence> |
Block 区域属性
块状区域包含矩形框内的结果序列:
<fo:block |
因为块状区域的是矩形框,它们共享很多共同的区域性质:
l space before and space after 最上端边界和最下端边界
l margin 边界
l border 边框
l padding 补白
“Space before [顶端空间]” 和 “space after [底端空间]” 是用来分隔其它块状区域的空白空间。“margin [边界]” 是块状区域外部的空白区域。“border [边框]”是矩形框的四条边;它们可以有不同的宽度;它们也可以填充不同的颜色和背景图片,padding [补白]”是位于边框和内容区域之间的地方。“content [内容]” 区域包含了类似于文本、图片、图表等实际存在的内容。
块状区域边界
l margin四边边界
l margin-top顶部边界
l margin-bottom底部边界
l margin-left左边界
l margin-right右边界
块状区域边框
边框样式属性:
l border-style边框样式
l border-before-style顶端边框样式
l border-after-style底端边框样式
l border-start-style左端边框样式
l border-end-style右端边框样式
l border-top-style (same as border-before) 顶端边框样式(和 border-before 相同)
l border-bottom-style (same as border-after) 底端边框样式(边 border-after 相同)
l border-left-style (same as border-start) 左端边框样式(和 border-start 相同)
l border-right-style (same as border-end) 右端边框样式(和 border-end 相同)
边框颜色属性:
l border-color边框颜色
l border-before-color顶端边框颜色
l border-after-color底端边框颜色
l border-start-color左端边框颜色
l border-end-color右端边框颜色
l border-top-color (same as border-before) 顶端边框颜色(和 border-before 相同)
l border-bottom-color (same as border-after) 底端边框颜色(和 border-after 相同)
l border-left-color (same as border-start) 左端边框颜色(和 border-start 相同)
l border-right-color (same as border-end) 右端边框颜色(和 border-end 相同)
边框宽度属性:
l border-width边框宽度
l border-before-width顶端边框宽度
l border-after-width底端边框宽度
l border-start-width左端边框宽度
l border-end-width右端边框宽度
l border-top-width (same as border-before) 顶端边框宽度(和 border-before 相同)
l border-bottom-width (same as border-after) 底端边框宽度(和 border-after 相同)
l border-left-width (same as border-start) 左端边框宽度(和 border-start 相同)
l border-right-width (same as border-end) 右端边框宽度(和 border-end 相同)
块状区域补白:
l padding补白
l padding-before顶端补白
l padding-after底端补白
l padding-start左端补白
l padding-end右端补白
l padding-top (same as padding-before) 顶端补白(和 padding-before 相同)
l padding-bottom (same as padding-after) 底端补白(和 padding-after 相同)
l padding-left (same as padding-start) 左端补白(和 padding-start 相同)
l padding-right (same as padding-end) 右端补白(和 padding-end 相同)
块状区域背景
l background-color背景颜色
l background-image背景图形
l background-repeat背景重复
l background-attachment (scroll or fixed) 背景滚动设置(scroll:随页面滚动而滚动;fixed:不随页面滚动而滚动)
块状区域样式属性
块状区域包含了可以单独定义样式的结果序列:
<fo:block |
字体属性:
l font-family字体
l font-weight字体粗细
l font-style字形
l font-size字体尺寸
l font-variant字体变量
文本属性:
l text-align文本排列
l text-align-last文本排列持续
l text-indent文本缩进
l start-indent顶端缩进
l end-indent底端缩进
l wrap-option (defines word wrap) 嵌套选项(定义自动换行)
l break-before (defines page breaks) 页面左端换行(定义页面换行)
l break-after (defines page breaks) 页面右端换行(定义页面换行)
l reference-orientation (defines text rotation in 90" increments) 参考定位(定义90度内的文本旋转)
举例
<fo:block <fo:block |
Result:
结果
W3Schools At w3pop.com you will find all the Web-building tutorials you need, from basic HTML and XHTML to advanced XML, XSL, Multimedia and WAP. |
从上述案例中,你会发现,要创建一份包含多个标题和段落的文档需要使用大量的代码。一般情况下,XSL-FO文档不需要将格式化信息和内容结合起来。只需要使用XSLT的一小部分功能,我们就可以把格式化信息放入模板中,书写一份整洁的内容了。当你学完这份教程之后,你就会掌握更多关于把XSL-FO和XSLT模板结合起来使用的方法。
8.XSL-FO 列表
XSL-FO用列表块区定义列表
XSL-FO列表区
用于创建列表的XSL-FO对象有以下四个:
l fo:list-block (含有整个列表)
l fo:list-item (含有列表里的每一项)
l fo:list-item-label (含有列表项的标签,典型的例子如:一个<fo:block>元素含有一个数字,字符,等等.)
l fo:list-item-body (含有列表项的内容和主体,典型的例子如:一个或多个<fo:block>对象)
一份XSL-FO列表的例子:
<fo:list-block> <fo:list-item> <fo:list-item> </fo:list-block> |
The output from this code would be:
这份代码应该输出如下结果:
* Volvo |
9.XSL-FO 表格
XSL-FO 使用<fo:table-and-caption>元素定义表格。
XSL-FO 表格
XSL-FO 的表格模式和HTML表格模式相差不大。下面列举9个可以用于创建表格的XSL-FO对象:
l fo:table-and-caption
l fo:table
l fo:table-caption
l fo:table-column
l fo:table-header
l fo:table-footer
l fo:table-body
l fo:table-row
l fo:table-cell
XSL-FO使用<fo:table-and-caption>元素来定义一张表格。它包含了一个<fo:table>元素和一个可选择的<fo:caption>元素。<fo:table>元素包含了几个可选择的<fo:table-column>元素,一个可选择的<fo:table-footer>元素。这些元素都包含一个或多个的<fo:table-row>元素以及一个或多个的<fo:table-cell>元素:
<fo:table-and-caption> |
The output from this code would something like this:
上述代码将输出如下结果:
Car |
Price |
Volvo |
$50000 |
SAAB |
$48000 |
10.XSL-FO 和 XSLT
XSL-FO 和 XSLT 可以进行功能互补。
还记得下面这个案例吗?
<fo:block <fo:block |
Result:
结果
W3Schools At w3pop.com you will find all the Web-building tutorials you need, from basic HTML and XHTML to advanced XML, XSL, Multimedia and WAP. |
从XSLT中得到一些帮助
从文档中删除XSL-FO信息的方法:
<header> <paragraph> |
Add an XSLT transformation:
添加一条 XSLT 转换信息的方法:
<xsl:template match="header"> |
And the result will be the same:
结果仍然相同:
W3Schools At W3pop.com you will find all the Web-building tutorials you need, from basic HTML and XHTML to advanced XML, XSL, Multimedia and WAP. |
11.XSL-FO 软件
XSL-FO 需要格式化软件来输出结果。
XSL-FO 处理器
XSL-FO 处理器是用于格式化XML文档输出结果的软件程序。大多数XSL-FO 处理器可以输出PDF文档,并进行高质量的打印。当然,它还可以HTML等其它形式输出。下面的部分介绍一些知名的XSL-FO处理器。
1) XSL Formatter:XSL Formatter 是一种用于格式化XML文档的软件,从而可以打印输出高质量的PDF文件。在2002年的一月,全球市场上推出了相同产品的V2版本。在欧洲举办的XML 2002, XML 2003 峰会上,XSL Formatter被公认为品质最佳的产品。在拥有4年XSL-FO软件开发经验的基础之上,, Antenna House又从头开发全新的Formatter。这种Formatter将增加一些更显著实用的功能,并为将来的继续发展提供了坚实的基础。
2) Xinc:Xinc 是 Lunasil 公司推出的XSL-FO处理器。Xinc的特点是:运行速度快,多路处理,并有记忆效果。包含摆动装置的XSL-FO阅读器可以浏览和打印XSL-FO文件,只需要点击鼠标就可以操做PDF文件;通过Xinc的Java API(Java应用程序接口),Xinc可以作为服务器组件使用;通过Xinc的COM(串行通讯端口)分界面,它也可在Microsoft服务器环境下使用。它的新特点如下:连字符号连接、基础连接、PDF输出、内存 / 速度最优化和简单的COM界面。
3) Scriptura:Inventive Designers Scriptura 是基于XSLT 和 XSL-FO 跨平台文档设计器和问题处理器。Scriptura 包含一个 WYSIWYG(即见及所得)的工具和引擎。在该引擎中使用的 XSL-FO formatter 已经不再以 Apache FOP 为基础了,而是设计者们重新开始书写。这个版本的新特点是:支持圆点、编号列表、“break-before [ 顶部换行 ]” 和 “break-after [ 底部换行 ]” 特性;扩展的条形码选项、改进的数字、货币格式。免费的体验版本可以通过下载获取。
XSL格式化对象参考资料
将具体描述转化为表达式的过程称为格式化:
Object |
Description |
basic-link |
Represents the start resource of a link |
bidi-override |
Overrides the default Unicode BIDI direction |
block |
Defines a block of output (e.g. paragraphs and titles) |
block-container |
Defines a block-level reference-area |
character |
Specifies a character that will be mapped to a glyph for presentation |
color-profile |
Defines a color-profile for a stylesheet |
conditional-page-master-reference |
Specifies a page-master to be used when the conditions defined are true |
declarations |
Groups global declarations for a stylesheet |
external-graphic |
Used for a graphic where the graphics data resides outside of the XML result tree |
float |
Typically used to position an image in a separate area at the beginning of a page OR to position an image to one side, with the content flowing along-side of the image |
flow |
Contains all elements to be printed to a page |
footnote |
Defines a footnote within the region-body of a page |
footnote-body |
Defines the content of the footnote |
initial-property-set |
Formats the first line of an <fo:block> |
inline |
Formats a part of a text with a background or enclosing it in a border |
inline-container |
Defines an inline reference-area |
instream-foreign-object |
Used for inline graphics or for "generic" objects where the object's data resides as descendants of <fo:instream-foreign-object> |
layout-master-set |
Holds all masters used in a document |
leader |
Used to generate "." to separate titles from page numbers in table of contents, or to create input fields in forms, or to create horizontal rules |
list-block |
Defines a list |
list-item |
Contains each item in the list |
list-item-body |
Contains the content/body of the list-item |
list-item-label |
Contains the label for the list-item (typically a number, character, etc.) |
marker |
Used with <fo:retrieve-marker> to create running headers or footers |
multi-case |
Contains (within an <fo:multi-switch>) each alternative sub-tree of XSL-FO objects. The parent <fo:multi-switch> will choose which alternative to show and hide the rest |
multi-properties |
Used to switch between two or more property-sets |
multi-property-set |
Specifies an alternative property-set that will be applied depending on the state of the user agent |
multi-switch |
Holds one or more <fo:multi-case> objects and controls the switching between them (activated by <fo:multi-toggle>) |
multi-toggle |
Used to switch to another <fo:multi-case> |
page-number |
Represents the current page-number |
page-number-citation |
References the page-number for the page that contains the first normal area returned by the cited object |
page-sequence |
A container for page output elements. There will be one <fo:page-sequence> object for each page layout |
page-sequence-master |
Specifies which simple-page-masters are to be used and in which order |
region-after |
Defines a page footer |
region-before |
Defines a page header |
region-body |
Defines a page body |
region-end |
Defines the right sidebar of a page |
region-start |
Defines the left sidebar of a page |
repeatable-page-master-alternatives |
Specifies repetition of a set of simple-page-masters |
repeatable-page-master-reference |
Specifies repetition of a single simple-page-master |
retrieve-marker |
Used with <fo:marker> to create running headers or footers |
root |
The root (top) node for XSL-FO documents |
simple-page-master |
Defines the size and shape of a page |
single-page-master-reference |
Specifies a page-master to be used at a given point in the sequence of pages |
static-content |
Contains static content (e.g. headers and footers) that will be repeated on many pages |
table |
Formats the tabular material of a table |
table-and-caption |
Formats a table and its caption |
table-body |
Container for table rows and table cells |
table-caption |
Contains the caption for a table |
table-cell |
Defines a table cell |
table-column |
Formats the columns of a table |
table-footer |
Defines a table footer |
table-header |
Defines a table header |
table-row |
Defines a table row |
title |
Defines a title for a page-sequence |
wrapper |
Specifies inherited properties for a group of XSL-FO objects |