XML教程

15 XSL格式化对象

可扩展的样式语言(Extensible Style LanguageXSL)的第二部分是格式化语言。这是XML应用程序,用来描述如何将内容显示给读者。一般地说,样式单使用XSL转换语言,将XML文档转换成使用XSL格式化对象符号集的新的XML文档。当许多人希望Web浏览器将来的某一天能够了解如何直接显示用XSL格式化对象来标记的数据时,目前就需要有其他措施,使输出文档进一步转换成其他的某个格式,如PDE

本章的主要内容如下:

* 理解XSL格式化语言

* 格式化对象及其属性

* 对页面进行格式化和设置样式

* 在文本中插入规则

* 在显示的文档中嵌入图形

* URI目标的链接

* 在文本中插入列表

* 替换字符

* 使用序列号

* 脚注

* 浮动

* 理解如何使用XSL格式化属性

15.1 XSL格式化语言概述

XSL格式化对象提供了比HTML+CSS(甚至CSS2)更为高级的可视化布局模型。XSL格式化对象所支持但HTML+CSS不支持的格式化包括非西方布局、脚注、页边距注解、交叉引用中的页号等等。特别是,虽然CSS主要用于Web,但XSL格式化对象的用途更为广泛。例如,能够编写使用格式化对象来编排整个打印稿的XSL样式单。不同的样式单能够将同一个XML文档转换到Web站点中。

有关格式化语言的警告语

XSL仍处于开发中。过去XSL语言已经发生了本质上的变化,并且将来仍将发生变化。本章是根据1999421XSL规范草案(第四稿)编写的。当读者阅读本书时,XSL的这一草案很可能已经被取代,而且XSL原来的句法已经改变。即便如此,本规范的格式化对象部分甚至也没有转换语言规范那样完善。如果确实遇到不能完全正常运行的情况,应将本书中提供的实例与最新的规则加以比较。

糟糕的是,仍然没有任何软件能实现1999421日的XSL规范草稿的所有内容,甚至只对格式化对象这部分也没有任何软件能够实现。实际上,到目前为止,只有James TauberFOP,才能部分地执行XSL格式化对象,它使用XSL格式化对象来将XML文档转换成PDF。还没有任何Web浏览器可以显示用XSL格式化对象编写的文档。

当然,随着此项标准向最终版本改进时,当开发商实现XSL格式化对象时,这种情况最终是可以得到修正的。在那之前,我们不得不面对这样的选择:要么忍痛使用目前不完善的、未完成的XSL,并且试图避开遇到的所有程序错误和疏忽,要么使用更确定的技术(如CSS),直到XSL更加可靠为止。

15.2 格式对象及其属性

XSL格式化对象元素正好有51个。在这51个元素当中,大多表示各种类型的矩形区域。其他的大部分都是矩形区域和空间的容器。下面以字母顺序编排,列出这些格式化对象:

* bidi-override

* block

* character

* display-graphic

* display-included-container

* display-rule

* display-sequence

* first-line-marker

* float

* flow

* footnote

* footnote-citation

* inline graphic

* inline-included-container

* inline-rule

* inline-sequence

* layout-master-set

* list-block

* list-item

* list-item-body

* list-item-label

* multi-case

* multi-properties

* multi-property-set

* multi-switch

* multi-toggle

* page-number

* page-number-citation

* page-sequence

* region-after

* region before

* region-body

* region-end

* region-start

* root

* sequence-specification

* sequence-specifier-alternating

* sequence specifier repeating

* sequence-specifier-single

* simple-link

* simple-page-master

* static-content

* table

* table-and-caption

* table-body

* table-caption

* table-cell

* table-column

* table-footer

* table-header

* table-row

XSL格式化模型是基于称之为区域(area)的矩形框,该区域包含有文本、空格或其他格式化对象。尽管CSS页边距被XSL的缩进所代替,但正如CSS框一样,每个区域在其各侧都有边框和贴边。XSL格式化程序读取格式化对象来确定将哪个区域放在页面的什么位置。许多格式化对象都会产生单一的区域(至少对大多数情况即是如此),但由于页面分隔符、单词折行、断字以及将可能存在的不确定量的文本填充到有确定区域中的其他方面的原因,一些格式化对象偶尔也确实产生多个区域。

含有间隔的框与含有空白字符的框是不一样的。含有空间的框是指页面或屏幕上的实际空的区域,例如,页面的左和右边上的页边距。这与页面上单词间的空格字符是不同的。

格式化对象主要在它们所包含的内容上有差别。例如,list-item-label格式化对象就是一个包含项目符号、数字或放在列表项之前的其他指示符的框。list-item-body格式化对象就是一个包含列表项的文本(无标签)的框。而list-item格式化对象就是一个包含list-item-labellist-item两个格式化对象的框。

格式化对象可进一步分成四类不同的矩形区域:

1.区域容器

2.块区域

3.行区域

4.内联区域

这四种类型的区域就形式了粗略的层次关系。区域容器包含其他更小的区域容器以及块区域。块区域又包含其他块区域、行区域和内容。行区域包含内联区域。内联区域包含其他内联区域和内容。所以,更具体地分为:

* 区域容器在XSL中是最高级别的容器。在包含它的区域内,可以精确的坐标加以定位。它既可以包含其他更小的区域容器,也可包含一系列的块区域和显示空间。可以将书的一页看作为区域容器,而这个区域容器包含五个其他区域容器:页眉、页的主体内容、页脚以及左和右页边距(在本例中,页边距区域无内容)。产生区域容器的格式化对象包括region-bodyregion-beforeregion-afterregion-startregion-end

* 块区域代表块级元素,如段落或列表项。尽管块区域可能包含其他块区域,但在每个块区域的开始之前和结束之后都总是有一个换行符。块区域不能用坐标来精确定位,而是顺序地置于包含它的区域内。当在某个块区域之前或内部加入和删除其他块区域时,此块区域的位置发生移动,以便腾出空间。块区域可能含有行区域、显示空格以及连续地排列在用来包含的块区域中的其他块区域。块区域还可能包含一个图形影像。产生块区域的格式化对象包括blockdisplay-graphicdisplay-linkdisplay-rulelist-block

* 行区域表示块部分的一行文本。例如,列表项中的每个分开的行都是行区域。行区域可以包含内联区域和内联空间。对应的行区域没有格式化对象。取而代之的是,格式化引擎可计算行区域,例如确定在块区域内部如何折行。

* 内联区域是一行中的成分,如单字符、脚注引用或数学方程。内联区域可以包含其他内联区域和内联空间。产生内联的格式化对象包括characterinline-graphicinline-linkinline-ruleinline-sequencepage-number

15.2.1 fo命名域

XSL样式单中,用于XSL格式化对象的XML元素放http://www.w3.org/XSL/Format /1.0命名域中,如下的声明所示:

<xsl:stylesheet

xmlns:xsl="http://www.w3.org/TR/WD-xsl"

xmlns:fo="http://www.w3.org/XSL/Format/1.0"

result-ns="fo">

选择fo作为前缀的概率大约为99%。因此,几乎总可以看到下列元素以fo作前缀:

* fo:bidi-override

* fo:block

* fo:character

* fo:display-graphic

* fo:display-included-container

* fo:display-rule

* fo:display-sequence

* fo:first-line-marker

* fo:float

* fo:flow

* fo:footnote

* fo:footnote-citation

* fo:inline-graphic

* fo:inline-included-container

* fo:inline-rule

* fo:inline-sequence

* fo:layout-master-set

* fo:list-block

* fo:list-item

* fo:list-item-body

* fo:list-item-label

* fo:multi-case

* fo:multi-properties

* fo:multi-property-set

* fo:multi-switc

* fo:multi-toggle

* fo:page-number

* fo:page-number-citation

* fo:page-sequence

* fo:region-after

* fo:region-before

* fo:region-body

* fo:region-end

* fo:region-start

* fo:root

* fo:sequence-specification

* fo:sequence-specifier-alternating

* fo:sequence-specifier-repeating

* fo:sequence-specifier-single

* fo:simple-link

* fo:simple-page-master

* fo:static-content

* fo:table

* fo:table-and-caption

* fo:table-body

* fo:table-caption

本章,我将使用fo作前缀,不再进一步说明。

命名域在第18"命名域"中讨论。在那之前,私獾闹皇荴SL格式化对象元素的名称都是以fo:开头。

15.2.2 格式化属性

总的来说,XSL文档中的各种格式化对象都指定内容放在页面中的顺序。但是,格式化的所有详细内容(包括页的大小、元素大小、字体、颜色等等,但不局限于这些)都是由XSL属性指定的。这些格式化属性以各自格式化对象元素的特性来表示。

这些属性中的许多属性的细节都应该从CSS中了解了。下面所进行的工作是为了确保CSSXSL使用相同的名称来表示同一个内容。例如,CSS属性的font-family的含义与XSLfont-family属性是一回事;尽管在CSSXSL中给属性赋值的句法不同,但值本身的句法是完全一样的。要说明fo:block元素格式化成与某种Times字体的近似,可以使用下面的CSS规则:

fo:block {font-family: New York, Times New Roman, Times, serif }

XSL的等价语句可按下列方式,将font-family包括在fo:block开始标记中:

<fo:block

font-family="New York,Times New Roman,Times,serif">

尽管从表面上来看不同,但样式名(font-family)和样式值(New York, Times New Roman, Times, serif)却是完全一样的。CSSfont-family属性指定为一组字体名,各字体名以逗号分开,而顺序是从第一选择到最后选择。XSLfont-family属性指定为一组字体名,各字体名以逗号分开,选择顺序是从第一个选择到最后一个选择。CSSXSL都将关键字serif理解为任意的衬线字体。

由于本章是基于XSL草案规范的第四稿,所以无法彻底完成CSSXSL等效属性的完全同步。在下一个草案中将解决此问题。

当然,XSL格式化对象支持许多CSS中没有等效属性的属性,例如,font-size-adjustligaturecharacterhyphenation-keep。所以,需要学习这些属性,以便最大限度地发挥XSL的优势。标准的XSL属性有:

* auto-restore

* azimuth

* background

* background-attachment

* background-color

* background-image

* background-position

* background-repeat

* border

* border-after-color

* border-after-style

* border-after-width

* border-before-color

* border-before-style

* border-before-width

* border-bottom

* border-bottom-color

* border-bottom-style

* border-bottom-width

* border-collapse

* border-color

* border-end-color

* border-end-style

* border-end-width

* border-left

* border-left-color

* border-left-style

* border-left-width

* border-right

* border-right-color

* border-right-style

* border-right-width

* border-spacing

* border-start-color

* border-start-style

* border-start-width

* border-style

* border-top

* border-top-color

* border-top-style

* border-top-width

* border-width

* bottom

* break-after

* break-before

* caption-side

* cell-height

* character

* clear

* clip

* color

* column-count

* column-gap

* column-number

* column-width

* country

* cue

* cue-after

* cue-before

* digit-group-sep

* elevation

* empty-cells

* end-indent

* ends-row

* extent

* external-destination

* float

* flow-name

* font

* font-family

* font-height-override-after

* font-height-override-before

* font-size

* font-size-adjust

* font-stretch

* font-style

* font-variant

* font-weight

* format

* height

* href

* hyphenate

* hyphenation-char

* hyphenation-keep

* hyphenation-ladder-count

* hyphenation-push-char-count

* hyphenation-remain-char-count

* id

* indicate-destination

* inhibit-line-breaks

* initial

* initial-page-number

* internal-destination

* keep-with-next

* keep-with-previous

* language

* last-line-end-indent

* left

* length

* letter-spacing

* letter-value

* line-height

* line-height-shift-adjustment

* line-stacking-strategy

* margin

* margin-bottom

* margin-left

* margin-right

* margin-top

* max-height

* max-width

* may-break-after-row

* may-break-before-row

* min-height

* min-width

* name

* n-columns-repeated

* n-columns-spanned

* n-digits-per-group

* n-rows-spanned

* orphans

* overflow

* padding

* padding-after

* padding-before

* padding-bottom

* padding-end

* padding-left

* padding-right

* padding-start

* padding-top

* page-break-inside

* page-height

* page-master-blank-even

* page-master-even

* page-master-first

* page-master-last-even

* page-master-last-odd

* page-master-name

* page-master-odd

* page-master-repeating

* page-width

* pause

* pause-after

* pause-before

* pitch

* pitch-range

* play-during

* position

* precedence

* provisional-distance-between-starts

* provisional-label-separation

* reference-orientation

* ref-id

* richness

* right

* row-height

* rule-orientation

* rule-style

* rule-thickness

* scale

* score-spaces

* script

* sequence-src

* show-destination

* size

* space-above-destination-block

* space-above-destination-start

* space-after

* space-before

* space-between-list-rows

* space-end

* space-start

* span

* speak

* speak-header

* speak-numeral

* speak-punctuation

* speech-rate

* start-indent

* starts-row

* state

* stress

* switch-to

* table-height

* table-layout

* table-omit-middle-footer

* table-omit-middle-header

* table-width

* text-align

* text-align-last

* text-decoration

* text-indent

* text-shadow

* text-transform

* title

* top

* vertical-align

* visibility

* voice-family

* volume

* white-space-treatment

* widows

* width

* word-spacing

* wrap-option

* writing-mode

* z-index

15.2.3 转换成格式化对象

XSL格式化对象是用于在页面上排列元素的一个完整的XML符号集。使用XSL格式化对象的文档只是使用此符号集的结构整洁的XML文档。这意味着它有XML声明、根元素、子元素等等。它必须遵从任何XML文档的所有结构整洁的规则,否则格式化程序就不接受它。出于习惯,含有XSL格式化对象的文件要有.fob这三个字符作后缀。但是,由于它还是一个结构整洁的XML文件,所以很可能以.xml作后缀。

清单15-1为一用XSL格式化对象来标记的简单文档。文档的根元素为fo:root。此元素含有一个fo:layout-master-set和一个fo:page-sequencefo:layout-master-set元素包含fo:simple-page-master子元素。每个fo:simple-page-master描述了用来放置内容的一类页面。其中只有一页非常简单的页面,但更复杂的文档可以有不同的主控页,用于第一页、右页、左页、正文页、封面内容、封底内容等等;每个文档又可能有一系列不同的页边距、页号以及其他特征。

使用fo:page-sequence可将内容放在主控页的许多副本上。fo:page-sequence包含fo:sequence-specification,指定不同的主控页应使用的顺序。其次,它还含有fo:flow子元素,此子元素保留以指定的序列放置在主控页上的实际内容。这里的内容是以两个fo:block子元素给出,而每个子元素的font-size属性值为20磅,font-family属性值为serif

清单15-1:使用XSL格式化对象符号集的简单文档

<fo:root xmlns:fo="http://www.w3.org/XSL/Format/1.0">

<fo:layout-master-set>

<fo:simple-page-master page-master-name="only">

<fo:region-body/>

</fo:simple-page-master>

</fo:layout master-set>

<fo:page-sequence>

<fo:sequence-specification>

<fo:sequence-specifier-single page-master-name="only"/>

</fo:sequence-specification>

<fo:flow>

<fo:block font-size="20pt" font-family="serif">

Hydrogen

</fo:block>

<fo:block font-size="20pt" font-family="serif">

Helium

</fo:block>

</fo:flow>

</fo:page sequence>

</fo: root>

尽管也许会像清单15-1中那样使用手工来编写文档,但这会失去XML所获得的内容格式独立性的所有优点。通常,应该编写XSL样式单,以便使用XSL转换符号集将源文档转换成格式化对象的符号集。使用清单15-2XSL样式单,可将前一章中的清单14-1转换为清单15-1

清单15-2:从源符号集到XSL格式化对象的变换

<?xml version="1.0"?>

<xsl:stylesheet

xmlns:xsl="http://www.w3.org/XSL/Transform/1.0"

xmlns:fo="http://www.w3.org/XSL/Format/1.0"

result-ns="fo" indent-result="yes">

<xsl:template match="/">

<fo:root xmlns:fo="http://www.w3.org/XSL/Format/1.0">

<fo:layout-master-set>

<fo:simple-page-master page-master-name="only">

<fo:region-body/>

</fo:simple-page-master>

</fo:layout-master-set>

<fo:page-sequence>

<fo:sequence-specification>

<fo:sequence-specifier-single

page-master name="only"/>

</fo:sequence-specification>

<fo:flow>

<xsl:apply-templates select="//ATOM"/>

</fo: flow>

</fo:page-sequence>

</fo :root>

</xsl:template>

<xsl:template match="ATOM">

<fo:block font-size="20pt" font-family="serif">

<xsl:value-of select="NAME"/>

</fo:block>

</xsl:template>

</xsl:stylesheet>

15.2.4 使用FOP

在撰写本书时,没有任何浏览器能够直接显示转换成XSL格式化对象的XML。只有一个软件可以使用以XSL格式化对象标记的文件,此软件即为James TauberFOPFOP为免费的Java程序,它将FO(格式化对象,formatting object)文档转换成Adobe Acrobat PDF文件。可从http://www.jtauber.com/fop/站点下载最新版的FOP

在撰写本书时,现有的FOP版本为0.6.0,它不完全支持格式化对象的子集和XSL第四草案中的属性。FOP是一Java程序,它可运行于适当兼容Java 1.1虚拟机的任何平台。要安装此程序,只需将fop.jar压缩文件放在CLASSPATH路径指明的目录中。com.jtauber.fop.FOP类包含用于本程序的main()方法。在命令行中,可使用指定输入和输出文件的参数来运行本程序。例如:

C:\XML\BIBLE\15>java com.jtauber.fop.FOP 15-1.fob 15-1.pdf

James Tauber s FOP 0.6.0

auto page-height: using 11in

auto page-width: using 8in

successfully read and parsed 15-1.fob

laying out page 1... done page 1.

successfully wrote 15-1.pdf

其中15-1.fob是输入的XML文件,它使用格式化对象符号集。15-1.pdf是输出的PDF文件,它能够在Adobe Acrobat或其他读取PDF文件的程序中显示和打印。

尽管PDF文件本身是ASCII文本,但本书不是有关PostScript的书籍,所以虽然精确地显示了上面的命令,读者却什么也得不到。如果好奇,可在任何文本编辑器程序中打开PDF文件。图15-1展示的转换文件,是使用Acrobat插件程序(plug-in),在Netscape Navigator中显示的。

15-1 Netscape Navigator中显示的PDF文件

对于使用XSL格式化对象来设置样式的XML文档来说,PDF文件不是唯一的或是主要的最终目标格式。当然,人们希望在不太遥远的将来Web浏览器能直接支持XSL格式化对象。就目前而言,PDF文件是唯一可用的格式,这也正是我要在本章中说明的内容。最终,应该有更多的软件能够阅读和显示这些文件。

15.3 页面布局

格式化对象的根元素是fo:root。此元素包含一个fo:layout-master-set元素和零或多个fo:page-sequence元素。fo:root元素通常有xmlns:fo特性,其特性值为http: //www.w3.org /XSL /Format /1.0,并且可能(尽管通常情况下没有)有一个id特性。fo:root元素的存在只为了声明命名域和文档根元素,它对页面布局或格式化没有直接的影响。

15.3.1 主控页面

fo:layout-master-set元素为一容器,用于文档使用的所有不同的主控页面。简单的页面控制与Quark XPress主控页面或PowerPoint幻灯母板的用途类似。每个都定义页面(包括此页的页边距、页眉大小、页脚、文本区域等等)的通用布局。在显示文档中的每个实际页面都基于主控页,以及从此主控页面中继承某些属性,如页边距、页编号和布局。

15.3.1.1 简单的页面控制

每个主控页面都是由fo:simple-page-master元素表示的。fo:layout-master-set可以包含一个或多个主控页面。一个fo:simple-page-master元素定义页的布局,包括页前区、主体区、后区、结束区以及开始区的大小。图15-2显示这些部分的典型布局。正文是中间留下来的所有内容。

15-2 一页简单的英语文本各部分的布局

在正常的英语文本中,结束区处于页的右侧,开始区处于页的左侧。而在希伯来语或阿拉伯语的文本中,则反过来,因为这些语言是从右往左阅读。在几乎所有的现代语言中,前区是页眉,后区则是页脚,但在以从底部往顶部书写的语言中,这种情况则相反。

设计者利用适当的区域子元素可设置正文(中间部分)区、页眉、页脚、结束区和开始区的大小以及它们之间的距离。下面就是这些区域子元素:

* fo:region-before

* fo:region-after

* fo:region-body

* fo:region-start

* fo:region-end

这五个简单页面控制中的每一个区域都可以用fo:flowfo:static-content元素来填充。

simple-page-master元素通常有三个主要特性:

1page-master-name:这一页面控制的名称,页序列使用此名来选择依赖于特定页的主控页

2page-height:页的高度

3page-width:页的宽度

page-heightpage-width可归入一个缩略属性size中。如果不提供这两个特性,那么格式化部分根据所使用的媒体(例如11"′ 8.5")来选择合理的缺省值。

例如,此处的fo:layout-master-set,含有两个fo:simple-page-master元素:一个用于偶数(左)页,一个用于奇数(右)页。它们两个都指定11英寸长,8.5英寸宽的页面大小。它们的顶和底页边距为0.5英寸。按照通常页面相对的情况,每个元素的的内侧页边距为0.5英寸,外侧页边距为1英寸,

<fo:layout-master-set>

<fo:simple-page-master page-master-name="even"

height="8.5in" width="11in"

margin-top="0.5in" margin-bottom="0.5in"

margin-left="l.0in" margin-right="0.5in">

<fo:region-body/>

</fo:simple-page-master>

<fo:simple-page-master page-master-name="odd"

height="8.5in" width="11in"

margin-top="0.5in" margin-bottom="0.5in"

margin-left="0.5in" margin-right="1.0in">

<fo:region-body/>

</fo:simple-page-master>

</fo:layout-master-set>

通常用于页面控制的其他特性包括:

* 影响页面边距的特性:margin-bottommargin-leftmargin-rightmargin-topmargin

* 影响页面书写方向的特性:writing-modereference-orientation

15.3.1.2 区域属性

五个区域(beforeafterbodystartend)共享相同的基本属性。这些属性有:

* 确定超出区域边界的内容如何处理的特性:clipover-flow

* 确定内容在栏中如何折行的特性:column-count(区域中的栏号)以及column-gap(栏之间的距离)

* 影响区域背景的特性:backgroundbackground-attachmentbackground-colorbackground-imagebackground-repeatbackground-position

* 影响区域边界的特性:border-before-colorborder-before-styleborder-before-widthborder-after-colorborder-after-styleborder-after-widthborder-start-colorborder-start-styleborder-start-widthborder-end-colorborder-end-styleborder-end-widthborder-top-colorborder-top-styleborder-top-widthborder-bottom- colorborder-bottom-styleborder-bottom-widthborder-left-colorborder-left-styleborder-left-widthborder-right-colorborder-right-styleborder-right-widthborderborder-topborder-bottomborder-leftborder-rightborder-colorborder-styleborder- width

* 影响区域贴边的特性:padding-bottompadding-leftpadding-rightpadding-toppadding-bottompadding-startpadding-endpadding-beforepadding-afterpadding

* 影响区域页边距的特性:margin-bottommargin-leftmargin-rightmargin-topmarginspace-beforespace-afterstart-indentend indent

* 影响区域中的书写方向的特性:writing-modereference-orientation

大多数属性与CSS属性同名,从CSS属性中就已很熟悉了。如果不明确地设置这些属性值,则选择合理的缺省值。对它们进行调整,就可以对页面的整个布局施加影响。

此外,四个外面区域(前、后、开始以及结束但不是正文)都有一个extent属性,它用来确定区域的大小。在去掉这四个区域之后,中间剩下来部分,就是主体正文的大小。

例如,下面的fo:layout-master-set使所有的外面区域都为1英寸。每个区域都有两个像素的黑色边界。而且,此页在所有的侧面上都有0.5英寸的页边距。

<fo:layout-master-set>

<fo:simple-page-master page-master-name="only"

height="8.5in" width="11in"

margin-top="0.5in" margin-bottom="0.5in"

margin-left="l.0in" margin-right="0.5in">

<fo:region-start extent="l.0in"

border-color="black" border-width="2px"/>

<fo:region-before extent="l.0in"

border-color="black" border-width="2px"/>

<fo:region-body

border-color="black" border-width="2px"/>

<fo:region-end extent="1.0in"

border-color="black" border-width="2px"/>

<fo:region-after extent="l.0in"

border-color="black" border-width="2px"/>

</fo:simple-page-master>

</fo:layout-master-set>

基于页面控制的正文页为5.5英寸宽,8英寸高。此值可以通过此页的大小减去此页上剩下来的其他部分的大小计算获得。

15.3.2 页序列

fo:layout-master-set外,每个格式化对象文档通常还包含一个或多个fo:page-sequence元素。每个页序列按下列顺序含有三项内容:

* 一个fo:sequences-pecification元素,以定义主控页使用顺序

* 零个或多个fo:static-content元素,其中包含每页上要放置的文本

* 一个fo:flow元素,其中包含要在各页上依次放置的数据

fo:flowfo:static-content之间的主要区别是,文本流(flow)中的文本并不放在多个页面上,但静态内容则是如此。例如,读者现在在阅读的这些行是文本流内容,只出现在此页上,而此页顶上的部分和章节标题则是静态内容,它在每页都是重复的。

fo:sequence-specification为此序列提供一组主控页。序列中的每页都有相关的页面控制,以定义页面的外观。清单15-1只使用一个主控页,但通常有多个主控页;例如,用于一章的第一页的主控页,用于所有的连续的左手页的主控页以及用于所有的连续的右手页的主控页。例如,可能有一个简单的页面控制用于目录,另一个用于正文文本,第三个用于索引。在这种情况下,目录、正文文本以及索引每个都对应有一个页面序列。

fo:flow元素按顺序包含本页上要放置的元素。当各页都以文本流的元素填充时,就会使用序列规格中的下一个控制布局方式为文本流中存在的元素创建新页。

fo:static-content元素包含每页上要放置的信息。例如,可将书的标题放在每页的页眉中。静态内容可以根据主控页来调节。例如,部分的标题可能放在左手的页上,章节的标题放在右手页上。还可以将fo:static-content元素用于像页码这样的项目,页码必须从一页到另一页不断地重复进行计算。换句话说,静态的实质并不是文本,而是产生文本的运算。

15.3.2.1 序列规格

使用铝腥鲎釉刂械囊桓龌蚨喔觯琭o:sequence-specification元素可列出特定的主控页被说明的顺序:

* fo:sequence-specifier-single

* fo:sequence-specifier-alternating

* fo:sequence-specifier-repeating

每个子元素都有特性,此特性确定何时使用哪个主控页。最简单的是fo:sequence-specifier-single,其page-master-name特性标识准备说明的主控页。例如,下面的fo:sequence-specification元素说明所有的内容都必须放在名为letter的主控页的一个实例上。

<fo:sequence-specification>

<fo:sequence-specifier-single page-master-name="letter"/>

</fo:sequence-specification>

如果有更多的内容可以填充在一页上,那么,超过的内容要么切去顶端,要么上卷,这要根据放置此内容各区域的clipoverflow特性值而定。但是,创建页数不会多于一页。现在来考虑一下下面的序列规格:

<fo:sequence-specification>

<fo:sequence-specifier-single page-master-name="letter"/>

<fo:sequence-specifier-single page-master-name="letter"/>

</fo:sequence-specification>

此段代码为每个基于letter页面控制的所有页都提供了序列规格。如果第一页填满,就创建第二页。如果那页填满,那么内容就被切去或上卷。

同样可将这一技术用来施加不同的主控页。例如,下面的序列规格将第一页以名为letterl的主控页为基础,第二页以名为letter2的主控页为基础。

<fo:sequence-specification>

<fo:sequence-specifier-single page-master-name="letterl"/>

<fo:sequence-specifier-single page-master-name="letter2"/>

</fo:sequence-specification>

当然,大多数时候不会预先精确地知道有多少页。fo:sequence-specifier-alternatingfo:sequence-specifier-repeating元素可用来指定按实际需要的页数来保存内容。fo:sequence-specifier-repeating元素为第一页指定一个主控页,为所有的后续页指定第二个主控页。fo:sequence-specifier-alternating元素为第一页、有内容的偶数页、有内容的奇数页、空白偶数页、最后的偶数页以及最后的奇数页指定多达六个不同的主控页。

例如,下面的序列说明符表示第一页的输出应使用名为letter_first的主控页,但所有的后续页都使用名为letter的主控页:

<fo:sequence-specification>

<fo:sequence-specifier-repeating

page-master-first="letter_first"

page-master-repeating="letter"

/>

</fo:sequence-specification>

如果整个内容都超出第一页,那么它就放在第二页上。如果超出第二页,那么就创建第三页。按照需要保存所有内容来建立页数。

在撰写本书时,仍未确定内容是否需要page-master-firstpage-master-repeating。但如果只有单一主控页,肯定要像下面这样将其作为值重新用于page-master-firstpage-master-repeating

<fo:sequence-specification>

<fo:sequence-specifier-repeating

page-master-first="letter"

page-master repeating="letter"

/>

</fo:sequence-specification>

fo:sequence-specifier-alternating元素多用于打印书籍的章节,习惯上书籍的第一和最后一页,以及奇偶页上的页边距、页眉和页脚都不同。这个元素的特性可用来为这些所有不同页指定主控页。例如:

<fo:sequence-specification>

<fo:sequence-specifier-repeating

page-master-first="chapter_first"

page-master-even="chapter_even"

page-master-blank-even="chapter_blank"

page-master-odd="chapter_odd"

page-master-last-even="chapter_last_even"

page-master-last-odd="chapter_last_odd"

page-Master-repeating="letter"

/>

</fo:sequence-specification>

如果上面的特性似乎不对称的话&#0;&#0;例如没有page-master-blank-odd特性&#0;&#0;这是由于传统的出版物不对称。如果仔细看看本书的所有页,并看看你所拥有的任何一本书,将会注意到编成奇数号的页总是在右边,编成偶数号的页总是在左边,并且章号总是在右手页上。章可以结束于右手(奇数)页,也可以结束于左手(偶数)页,但如果章确实结束于奇数页,那么就插入一空白的偶数页,以便下一章起始于奇数页。

 

15.3.2.2 文本流

fo:flow对象保存放置在由序列规格指定的主控页实例上的真实内容。此内容是由一系列fo:block、fo:display-graphic、fo:display-link、fo:display-rule以及其他块级元素组成的。在本节,我们将集中于基本的fo:block元素,它大体上与HTML的DIV元素等价。在本章的后面,我们将看到文本流包含的更多的块级元素。

例如,下面的这个基本文本流,包含几个原子的名称,它们分别放在各自的块中:

<fo:flow name="xsl-body">

<fo:block>Actinium</fo:block>

<fo:block>Aluminum</fo:block>

<fo:block>Americium</fo:block>

</fo:flow>

fo:flow的name特性(此处有xsl-body值)指定此文本流的内容将放在该页中五个区域的哪个区域上。允许值为:

* xsl-body

* xsl-after

* xsl-before

* xsl-start

* xsl-end

例如,页眉的flow(从左到右,从上到下的英语文本)的flow- name具有值为xsl-before。下面是用于页脚的文本流:

<fo:flow id="q2" flow-name="xsl-after">

<fo:block>

The XML Bible

Chapter 15: XSL Formatting Objects

</fo:block>

</fo:flow>

15.3.2.3 静态内容

尽管fo:flow元素的每条内容都出现在一页上,但fo:static-content元素的每条内容则出现在每页上;例如,页眉或页脚。不一定要使用fo:static-content元素,但如果使用,必须放在页序列中所有的fo:flow元素之前。

fo:static-content元素的特性和内容与fo:flow的相同。但是,由于fo:static-content不能将自己的内容放在多个页面上,如果必须如此,那么通常其内容要比fo:flow少。例如,下面是用于页眉的fo:static-content:

<fo:static-content id="sc2" flow-name="xsl-before">

<fo:block>

The XML Bible

Chapter 15: XSL Formatting Objects

</fo:block>

</fo:static-content>

15.3.2.4 页的编号

除了任何格式化对象所具有的常用的id特性外,fo:page-sequence元素还有六个可选的特性,它们可为序列定义页编号。这六个特性为:

* initial-page-number

* format

* letter-value

* digit-group-sep

* n-digits-per-group

* sequence-src

initial-page-number特性定义此序列中的第一页号码。此特性的最可能的值是1,但如果前面的页存在于不同的文件中,那么此值可能比较大。剩下来的五个特性的句法和含义,与作为XSL转换语言的xsl:number元素的特性使用时完全相同。

xsl:number元素和format、letter-value、digit-group-sep、n-digits-per-group、sequence-src特性已在第14章"XSL变换"的"数字到字符串的转换"中讨论过。

fo:page-number格式化对象是一空的内联元素,用于插入当前页的号码。格式化程序负责确定使用什么样的号码。此元素只有唯一的一个特性&#0;&#0;id。此外,可将fo:page-number包装在fo:inline-sequence、fo:block或类似的元素中,以便将字体属性和类似的属性应用于此元素。例如,下面的页脚使用fo:static-content和fo:page-number来将页码放在每页的底部:

<fo:static-content id="sc2" flow-name="xsl-after">

<fo:block>

<fo:page-number/>

</fo:block>

</fo:static-content>

下面的页序列指定该页码使用小罗马数字,并从10开始计数。

<fo:page-sequence initial-page-number="10" format="i">

<!- sequence specification ->

<fo:static-content flow-name="xsl-after">

<fo:block text-align-last="centered" font-size="10pt">

<fo:page-number/>

</fo:block>

</fo:static-content>

<!- flows ->

</fo:page-sequence>

15.4 内容

XSL格式化对象文档的内容(与标记相反)几乎都是文本。除此之外,还可链接于外部影像,这种方式类似于HTMLIMG元素。这种内容保存在于下列几类元素中:

* 块级格式化对象

* 内联格式化对象

* 表格式化对象

* 外联格式化对象

所有的这些元素都是fo:flowfo:static-content元素的后代。它们从不直接放在控制页或页序列上。

15.4.1 块级格式化对象

块级格式化对象以矩形区域绘制,各矩形区域以换行符分开,可能在其前或后的内容中还有多余的空白。块可能包括其他块,在此情况下,被包括的块也是通过换行符(可能使用多余的空白)与用来包括的块分开。块级格式化对象包括:

* fo:block

* fo:display-graphic

* fo:display-rule

* fo:display-included-container

* fo:display-sequence

* fo:list

* fo:list-item

fo:block元素是CSS中的display:blockHTML中的DIV元素的XSL等价元素。块可能包括在fo:flow元素、其他fo:block元素以及fo:static-content元素中。fo:block元素可能包括其他fo:block元素、其他块级元素(如fo:display-graphicfo:display-rule)以及内联元素(如fo: inline-sequencefo:page-number)。还可能包括原始文本。例如:

<fo:block>

<fo:inline-sequence font-style="italic">

The XML Bible

</fo:inline-sequence>

Page <fo:page-number/>

<fo:inline-sequence>

Chapter 15: XSL Formatting Objects

</fo:inline-sequence>

</fo:block>

fo:block元素通常都有用于区域属性和文本格式化属性的特性。文本格式化属性可被块的任何子元素所继承,除非被覆盖。允许的属性包括:

* 对齐属性:text-aligntext-align-last

* 听觉属性:azimuthcuecue-aftercue-beforeelevationpausepause-afterpause-beforepitchpitch-rangeplay-duringrichnessspeakspeak-headerspeak-numeralspeak-punctuationspeech-ratestressvoice-familyvolume

* 背景属性:backgroundbackground-attachmentbackground-colorbackground-imagebackground-positionbackground-repeat

* 边界属性:border-before-colorborder-before-styleborder-before-widthborder-after-colorborder-after-styleborder-after-widthborder-start-colorborder-start-styleborder-start-widthborder-end-colorborder-end-styleborder-end-widthborder-top-colorborder-top-styleborder-top-widthborder-bottom-colorborder-bottom-styleborder-bottom-widthborder-left-colorborder-left-styleborder-left-widthborder-right-colorborder-right-styleborder-right-widthborder border-topborder-bottomborder-leftborder-rightborder-colorborder-style以及border-width

* 分行属性:page-break-insidewidowsorphanswrap-option

* 颜色属性:color

* 栏属性:span

* 字体属性:font-familysystem-fontfont-sizefont-size-adjustfont-stretchfont-stylefont-variantfont-weightfont

* 断字属性:countryhyphenatehyphenation-charhyphenation-push-char-counthyphenation-remain-char-countlanguagescripthyphenation-keephyphenation-ladder-count

* 缩排属性:text-indent1ast-line-end-indent

* 分层属性:z-index

* 行高属性:line-heightline-height-shift-adjustmentline-stacking-strategy

* 页边距属性:margin-bottommargin-leftmargin-rightmargin-topmarginspace-beforespace-afterstart-indentend-indent

* 贴边属性:padding-toppadding-bottompadding-leftpadding-rightpadding-beforepadding-afterpadding-startpadding-end

* 位置属性:positiontopbottomrightleft

* 文本方向属性:writing-mode

* 可视属性:visibility

* 空白属性:white-space-treatment

大多数属性从CSS中就熟悉了,其余的将在下面讨论。其他块级元素都有很相似的属性列表。

15.4.2 内联格式化对象

内联格式化对象是以矩形区域来描述的,这个区域可以包括文本或其他内联区域。内联区域几乎通常都是从左到右以行排列。当一行填满时,在前一行的下面开始新行。但是,内联元素放置的准确顺序要依赖于书写方式。例如,当使用希伯来语或阿拉伯语时,它要了解左边第一位置的内联元素的意义,然后从右边填充。内联格式化对象包括:

* fo:bidi-override

* fo:character

* fo:first-line-marker

* fo:inline-graphic

* fo:inline-included-container

* fo: inline-rule

* fo:inline-sequence

* fo:list-item-body

* fo:list-item-label

* fo:page-number

* fo:page-number-citation

15.4.3 表格格式化对象

设计的表格格式化对象是CSS2表格属性的XSL等价物。但是,表格在XSL中的工作方式确实比CSS中的稍微自然些。对于大部分内容来说,各个表都是块级对象,而表中的内容则不是真正的内联级,也不是块级。但是,整个一张表可以通过将它包装在fo:inline-included-container中,从而转换成内联对象。

有下列九个XSL表格格式化对象:

* fo:table-and-caption

* fo:table

* fo:table-caption

* fo:table-column

* fo:table-header

* fo:table-footer

* fo:table-body

* fo:table-row

* fo:table-cell

表的根元素不是fo:table,而是fo:table-and-caption,它包括一个fo:table和一个fo:captionfo:table包含fo:table-headerfo:table-bodyfo:table-footer。表的正文包括fo:table-row元素,而此元素可划分到fo:table-cell元素中。

15.4.4 外联格式化对象

有下列三个外联格式化对象:

* fo:float

* fo:footnote

* fo:footnote-citation

外联格式化对象从现存的内联或块对象那里借用空间。在页面上,它们不必出现在相同的元素之间,而在输出格式化对象的XML树形结构中,它们则出现在相同的元素之间

15.5 水平线

rule是插入到文本中的水平线。XSL有两类水平线。fo:display-rule格式化对象为块级元素,它创建一条水平线(如由HTML<HR>标记产生的水平线)。fo:inline-rule格式化对象元素与fo:display-rule元素类似。但是,顾名思义,fo:inline-rule是内联元素,而不是块级元素。因此,它出现在一行文本的中间,并且不代表分行符。例如,下面是一显示的水平线:

但是,这个 是内联水平线。

fo:inline-rulefo:display-rule元素有六个描述这两种水平线的主要特性:

1length:线条长,如12pc5in

2rule-orientationescapementhorizontalline-progressionvertical

3rule-style:在编写本书时,精确值还未确定

4rule-thickness:线条的粗细,如1px0.1cm

5vertical-alignbaselinebottommiddlesubsupertext-bottomtext-toptop或行长或行高的百分比

6color:线条的颜色,如pink#FFCCCC

例如,下面的这个绿色块级水平线长7.5英寸,粗2磅:

<fo:display-rule length="7.5in"

line-thickness="2pt" color="#00FF00"/>

此外,fo:display-rule块级元素的特性中,大多数都是经常使用的,如描述页边距和贴边的特性,fo:inline-rule也有内联元素的常用特性,如line-height。直接与文本有关的特性则是个例外(如字族),很明显,这些特性对水平线没有意义。

15.6 图形

XSL提供在显示文档中嵌入图形的两种方式。fo:display-graphic元素插入块级图形。fo:inline-graphic元素插入内联图形。这两个元素与HTMLIMG标签是等价的。可以使用下面六个特性来描述图像:

1href:影像文件的URI

2min-height:影像的最小垂直高度

3min-width:影像的最小水平宽度

4max-heigh:影像的最大垂直高度

5max-width:影像的最大水平宽度

6scale:使用值max,将图形扩充到max-heightmax-width的大小;使用max-uniform值,在垂直和水平方向以同等数量将图形扩充到max-heightmax-width(使用最先出现的)的大小;使用一个实数,由此值乘以高度和宽度;使用两个实数,第一个实数乘以宽度,第二个实数乘以高度。

例如,考查下面标准HTMLIMG元素:

 

<IMG SRC="logo.gif" WIDTH="100" HEIGHT="100"

ALIGN="right" ALT="alt text" BORDER="0">

下面的fo:display-graphic元素与上面的等效:

<fo:display-graphic image="logo.gif"

height="100px" width="100px" />

15.7 链接

对于只用于在线展示而言,XSL提供fo:simple-link元素。假定有Web浏览器样式的用户界面,单击链接元素内容的任何地方,可跳转到链接目标。根据此元素所包含的内容,可以充当块级或内联链接。链接行为是由下列六个特性控制的:

* external-destination

* internal-destination

* indicate-destination

* show-destination

* space-above-destination-block

* space-above-destination-start

对远程目标文档的链接通过external-destination特性的值来指定URI。当激活链接时,应加载此URI上的文档。在GUI环境下,这种链接极可能是通过单击链接内容而被激活的。例如:

<fo:block> Be sure to visit the

<fo:simple-link

external-destination="http://metalab.unc.edu/xml/">

Cafe con Leche Web site!

</fo:simple-link>

</fo:block>

使用internal-destination特性,还可以与同一文档中的其他节点链接。此特性值不是URI,而是链接元素的ID。不要为一个链接同时指定内部和外部目标。

其他四个特性影响链接的外观和行为。indicate-destination特性为Boolean值(truefalse,缺省值为false),它指定是否加载链接项目、何时加载,应以某种方式将它与同一文档的非链接部分区别开来。例如,如果链接于有100个原子的表中的一个ATOM元素,那么正在进行关联的指定原子可能要以粗体形式显示,而其他原子则为正常字体类型。精确的内容依赖于系统。

show-destination特性有两个可能值:replace(缺省)和new。使用replace值,下面的链接将代替同一窗口中的现有文档。使用new值时,单击链接后,目标文档在新的窗口中打开。

当浏览器跟随HTML链接进入文档中间时,通常指定的被链接元素定位在窗口的最顶上。space-above-destination-startspace-above-destination-block特性可用来指定浏览器将链接的元素定位在窗口的下方,而在链接项目的上方留出一定数量的空间(不是空格,通常它包含链接元素前面的内容)

此外,链接也有一个常用的属性,如颜色,可被链接内容所继承。这样就可以用来格式化链接的内容,使其与链接外的内容格式不同;例如,将所有的链接加上下划线。但是,与CSSHTML不同,XSL格式化对象不提供区别被访问、未被访问以及活动链接的方法。

15.8 列表

fo:list-block格式化对象描述块级列表元素(没有内联列表)。一个列表可能有、也可能没有项目符号、编号、缩进或其他格式。每个fo:list-block元素都包含一系列的fo:list-item元素或fo:list-item-label fo:list-item-body元素对(不能同时包括两者)。fo:list-item必须包括fo:list item-labelfo:list-item-bodyfo:list-item-label包括项目符号、编号或用于列表项的其他标签。fo:list-item-body包括列表项的实际内容。一句话,fo:list-block包括fo:list-item元素。每个fo:list-item包括一个fo:list-item-labelfo:list-item-body。但是,fo:list-item元素可以省略。例如:

<fo:list-block>

<fo:list-item>

<fo:list-item-label>*</fo:list-item-label>

<fo:list-item-body>Actinium</fo:list-item-body>

</fo:list-item>

<fo:list-item>

<fo:list-item-label>*</fo:list-item-label>

<fo:list-item-body>Aluminum</fo:list-item-body>

</fo:list-item>

</fo:list-block>

或者,将fo:list-item删除:

<fo:list-block>

<fo:list-item-label>*</fo:list-item-label>

<fo:list-item-body>Actinium</fo:list-item-body>

<fo:list-item-label>*</fo:list-item-label>

<fo:list-item-body>Aluminum</fo:list-item-body>

</fo:list block>

fo:list-block元素有三个专用特性:

1provisional-label-separation:列表项标签与列表项正文之间的距离,以最大; 最小; 最佳这三个值来表示,如2cm; 0.5cm; 1cm

2provisional-distance-between-starts:列表项标签的开始边与列表项正文之间的开始边的距离。

3space-between-list-rows:连续列表项之间的垂直距离,以最大; 最小; 最佳这三个值来表示,如36pt; 4pt; 12pt

fo:list-item元素的标准块级属性,用于背景、位置、音频显示、边界、贴边、页边距、线条以及分页符。

 

15.9 表格

XSL中的基本的表格元素为fo:table-and-caption,这是个块级对象。但将它包装到fo:inline-included-container中就可转变为内联对象,或将它包装到fo:float中就可转变为外联对象。表格模型与HTML的表格模型十分相近。表15-1显示HTML 4.0表元素与XSL格式化对象之间的等价关系:

15-1 HTML表格与XSL格式化对象的表格的对比

HTML元素

XSL格式化对象元素

TABLE

Fo:table-and-caption

无对等元素

fo:table

CAPTION

fo:table-caption

COL

fo:table-column

COLGROUP

无对等元素

THEAD

fo:table-reader

TBODY

fo:table-body

TFOOT

fo:table-footer

TD

fo:table-cell

TR

fo:table-row

fo:table-and-caption包括一个可选的fo:caption元素和一个fo:table元素。标题可包含要放在此标题中的任何块级元素。在缺省的情况下,标题放在表之前,但可以通过设置table-and-caption元素的caption-side属性为下列八个值之一而进行调整:

* before

* after

* start

* end

* top

* bottom

* left

* right

例如,下面是一个将标题放在底部的表格:

<fo:table-and-caption caption-side="bottom">

<fo:table-caption>

<fo:block font-weight="bold"

font-family="Helvetica, Arial, sans"

font-size="12pt">

Table 15 1: HTML Tables vs. XSL Formatting Object Tables

</fo:block>

</fo:table-caption>

<fo:table>

<!- table contents go here ->

</fo:table>

</fo:table-and-caption>

fo:table元素包括一个可选的fo:table-column、fo:table-header、一个可选的fo:table-footer和一个或多个fo:table-body元素。fo:table-body分成fo:table-row元素。每个fo:table-row分成fo:table-cell元素。fo:table-header和fo:table-footer既可分成fo:table-cell元素,也可分成fo:table-row元素。例如,下面的这个简单的表,与表15-1的第三行相对应:

<fo:table>

<fo:table-header>

<fo:table-cell>

<fo:block font-family="Helvetica, Arial, sans"

font-size="11pt" font-weight="bold">

HTML Element

</fo:block>

</fo:table-cell>

<fo:table-cell>

<fo:block font-family="Helvetica, Arial, sans"

font-size="11pt" font-weight="bold">

XSL FO Element

</fo:block>

</fo:table-cell>

</fo:table-header>

<fo:table-body>

<fo:table-row>

<fo:table-cell>

<fo:block font-family="Courier, monospace">

TABLE

</fo:block>

</fo:table-cell>

<fo:table-cell>

<fo:block font-family="Courier, monospace">

fo:table-and-caption

</fo:block>

</fo:table-cell>

</fo:tdble-row>

<fo:table-row>

<fo:table-cell>

<fo:block>no equivalent</fo:block>

</fo:table-cell>

<fo:table-cell>

<fo:block font-family="Courier, monospace">

fo:table

</fo:block>

</fo:table-cell>

</fo:table-row>

</fo:table-body>

</fo:table>

设置n-columns-spanned和n-rows-spanned特性为一整数,表示要跨越的行或列数,这时,表的单元格就可以跨越多行和多列。可选的column-number特性可以改变从哪一列开始合并单元格,缺省值是当前列。

使用通常的边界属性(将在以后讨论),就可以在表的各部分周围绘制边框。empty-cells特的值可取show或hide,如果要在无内容的单元格周围绘制边框,则为show;否则为hide。缺省值为show。

大多数表的各部分不使用标准的宽度和高度属性,而是具有等价的属性。可以省略下面当中的任何一个或所有的特性,在此情况下,格式化程序只将每个部分调整成合适的大小:

* table:table-width,table-height

* table-caption:caption-width,由格式化程序自动确定高度

* table-row:row-height,由内容确定宽度

* table-cell:cell-height,column-number,column-width,n-columns-spanned,n-rows-spanned

fo:table-row元素有可选的may-break-after-row和may-break-before-row特性,其值为yes或no,此值确定在行前和行后是否允许有分页符。这两个特性的缺省值都为yes。

当一长表扩展到多页时,有时候在每页上重复页眉和页脚。使用fo:table元素的table-omit-middle-header和table-omit-middle-footer特性,可指定这种行为。值为yes表示页眉或页脚一页一页地重复。值为no表示页眉或页脚不是一页一页地重复。缺省值为no。

可选的fo:table-column元素是一空元素,它为一特定列中的所有单元格指定值。使用此元素的单元格由column-number特性来识别。fo:table-column并不真正地包含任何单元格。将n-columns-spanned属性设置成大于1的整数时,fo:table-column可将属性应用于多个连续的列中。在fo:table-column中进行设置的最常用的属性是column-width(有符号的长度),但标准的边界、贴边以及背景属性(下面讨论)也可以设置。

 

15.10 字符

fo:character格式化对象使用输出文档中的不同字符来代替输入文档中特定字符或字符串。例如,可以使用此对象在美语小数点与法语小数逗号之间相互转换。character特性指定使用什么字符来替换。例如,下面的模板规则将PASSWORD元素中的字符替换为*:

<xsl:template match="PASSWORD">

<fo:character character="*">

<xsl:value-of select="."/>

</fo:character>

</xsl:template>

但是,这种用法是很少见的。fo:character元素的主要目的是为了便于格式化引擎可将各个字符和字形作为其自身的元素来看待。如果不是编写格式化引擎,那么就可以忽略此元素。

15.11 序列

序列对内联或块级框的布局没有任何特别的影响。它们只是放置格式化属性(如font-style或text-indent)的元素。

fo:display-sequence格式化对象元素是一容器,它将块级对象成组在一起。事实上,它只能保存块级元素,如fo:display-graphic和fo:block。不能包含内联元素和原文本。

fo:inline-sequence格式化对象元素是将内联对象成组在一起的容器。它不能包含块级元素。例如,可以像下面这样,使用inline-sequence元素将样式加到页脚的各部分中:

<fo:flow id="q2" flow-name="xsl-after">

<fo:block font-style="bold" font-size="10pt"

font-family="Arial, Helvetica, sans">

<fo:inline-sequence font-style="italic"

text-align="start">

The XML Bible

</fo:inline-sequence>

<fo:inline-sequence text-align="centered">

Page <fo:page-number/>

</fo:inline-sequence>

<fo:inline-sequence text-align="right">

Chapter 15: XSL Formatting Objects

</fo:inline-sequence>

</fo:block>

</fo:flow>

15.12 脚注

fo:footnote元素表示脚注。作者将fo:footnote元素放在文本流中,脚注引用(1或*)出现的地方。fo:footnote元素由fo:footnote-reference和包含脚注文本的块级元素组成。但是,只有脚注引用才是内联式插入。格式化程序将注释文本放在此页的后区(通常为页脚)中。

例如,下面的脚注使用星号作为脚注标记,并引用JavaBeans, Elliotte Rusty Harold IDG Books, Foster City, 1998), p. 147。使用标准的XSL属性(如font-size和vertical-align)按照习惯方式来格式化注释标记和文本。

<fo:footnote>

<fo:footnote-reference

font-size="smaller" vertical-align="super">

*

</fo:footnote reference>

<fo:block font-size="smaller">

<fo:inline-sequence

font-size="smaller" vertical-align="super">

*

</fo:inline-sequence>

<fo:inline-sequence

font-style="italic">JavaBeans</fo:inline-sequence>,

Elliotte Rusty Harold

(IDG Books, Foster City, 1998), p. 147

</fo:block>

</fo:footnote>

格式化对象符号集不提供自动编号和引用脚注的任何方法,但在变换样式单中巧妙地使用xsl:number即可做到这一点。XSL变换同样也可以很容易地实现尾注(end note)。

15.13 浮动

fo:float产生一个浮动框,定位于它所出现的区域的顶端。fo:float最常用于图形、图表、表格,或需要出现在该页某个地方但对出现的位置无特别精确要求的其他外联内容。例如,下面的代码用于在一段落的中间嵌入带有标题的浮动图形:

<fo:block>

Although PDF files are themselves ASC11 text,

this isn't a book about PostScript, so there's

nothing to be gained by showing you the exact

output of the above command. If you're curious,

open the PDF file in any text editor.

Instead, Figure 15-1

<fo:float>

<fo:display-graphic

image="3236-7fg150l.jpg"

height="485px" width="623px" />

<fo:block font-family="Helvetica, sans">

<fo:inline sequence font-weight="bold">

Figure 15-1 :

</fo:inline-sequence>

The PDF file displayed in Netscape Navigator

</fo:block>

</fo:float>

shows the rendered file displayed in

Netscape Navigator using the Acrobat plug-in.

</fo:block>

格式化程序尽可能地将图形放在与fo:float周围的内容同页的某个位置上,尽管这种情况并非永远存在,但在此情况下,格式化程序会将此对象移到后续页上。在这些限制范围内,可任意将图形放在此页的任何地方。

15.14 XSL格式化属性

由字面意思可知,格式化对象相对来讲完全没有说明如何格式化内容。它们只是将内容摆放在各个绝对的框中,而这些框放置在一页中的各个特定部分。各种格式化对象的特性确定如何设置这些框中内容的样式。

正像已经介绍的那样,大约有200个独立的格式化属性。并非所有的属性都可以与所有的元素关联。例如,指定fo:display-graphicfont-style的特点就不很多。但是,大多数属性都可以用于多种格式化对象元素(只有少数几个不能,如hrefprovisional-label-separation,在上面已与使用它们的格式化对象一起讨论过了)。当一个属性为多个格式化对象所共有时,它的句法和含义就与这些对象相同。例如,使用相同代码来将fo:list-label格式化成14磅粗体Times,就如同将fo:block格式化成14磅粗体Times那样。

许多XSL属性都与CSS属性类似。CSSfont-family属性值与XSLfont-family特性值是一样的。如果已经阅读过第12章和13章,那么就已经学完了XSL属性一半以上的内容。

15.14.1 单位和数据类型

XSL格式化属性的值可能是一关键字,如autoitalictransparent;或者为文字值,如true5px-5.0cmhttp: //www.w3.org/index.html。在XSL中,文字值是以24个数据类型之一来表示,它些数据类型列于表15-2中。

15-2 格式化属性数据类型

数据类型

定义

实例

Name

表示XML名称记号

q1

copyright

ID

表示唯一的XML名称记号

q1

copyright

IDREF

表示与文档中元素的ID相匹配的名称

q1

copyright

Boolean

为字符串true或字符串false

False

True

Char

单一的、无空白的Unicode字符

A

_

Signed Integer

一系列数字,作为选项可用加号或减号作前缀

0

–28

+1000000000

Unsigned Integer

一系列数字

0

28

1000000000

Positive Integer

一系列数字,包括至少有一个非零数字

28

1000000000

Signed Real

浮点数值,以符号-数字-小数点-数字格式表示。不支持指数表示法。对于正数的+为可选的

+0.879

-31.14

2.71828

Unsigned Real

非负的浮点数,其格式为数字-小数点-数字。不支持指数表示法

0.0

31.14

2.71828

Positive Real

正浮点数,其格式为数字-小数点-数字。不支持指数表示法

0.01

31.14

2.71828

Signed Length

后面带有单位的有符号整数或有符号实数

5px

-0.5in

Unsigned Length

后面带有单位的无符号整数或无符号实数

10px

0.5cm

Positive Length

后面带有单位的正整数或正实数

10px

1pc

Percent

能被100整除以获得其真正值的有符号实数

100.0

-43.2

0.0

Space Specifier

最小长度;最大长度;最佳长度;优先级;限制条件

0px;72px;12px; force;discard

Limit Specifier

最小长度分号最大长度

0px;72px

Color

命名颜色或#RRGGBB形式的十六进制的三元参数

white

#FFFFFF

URI

统一源标识符;实际上为URL

http://www.w3 .org/index.html /index.html/ ../index.html

Language

ISO 639语言码

en

la

Font Name

以实际名或符号表示的字体名

Times New Roman

serif

Font List

以逗号(并可能有空白)分隔的字体名

Times New Roman, Times, serif

Enumeration

XML的枚举类型

(airplane | train | car | horse)

String

任何的字符序列

Fred Lucy and Ethel Castles don't have phones.

15.14.2 消息属性

有两个消息属性,它们可用于任何格式化对象。但是,两者对格式化都没有直接的影响。从本质上来讲,它们都是非格式化属性。

15.14.2.1 id属性

第一个这样的属性就是id。它是一个XMLID类型的特性。所以,此属性值必须是样式单中和输出格式化对象文档内的唯一的XML名。由于样式单中的一个模板规则可能在输出文档中产生几百个元素,所以最后的要求就有点棘手。XSL变换的generate-id()函数在此处就很有用。

15.14.2.2 语言属性

第二个这样的属性就是language。它指定此元素中所包括的内容的语言。通常,此属性值是ISO 639语言码,如enEnglish)或laLatin)。它还可以为关键字noneuse-document。后者表示只使用xml:lang特性指定的输入文档的语言。例如,以凯撒的Gallic Wars第一首诗为例:

<fo:block id="versel.l.l" language="la">

Gallia est omnis divisa in partes tres,

quarum unam incolunt Belgae, aliam Aquitani,

tertiam qui ipsorum lingua Celtae, nostra Galli appellantur

</fo:block>

尽管language属性对格式化没有直接的影响,但如果格式化程序根据语言选择布局算法的话,那么它就可能有直接的影响。例如,格式化程序可以将不同的缺省书写模式用于阿拉伯语和英语的文本。这就导致如何确定开始和结束的区域,以及内联的行进方向。

15.14.3 段落属性

* 在传统的字处理程序中,段落属性应用于整个文本块时,通常被作为样式来看待,尽管在这里作为块级文本属性或许更恰当些。例如,缩进是一种段落属性,这是因为是将一个段落进行缩进,而不能将单词独立于包含它的段落加以缩进。

15.14.3.1 分隔符属性

分隔符属性指定放置分页符的位置。有五个关系不太紧密的分隔符属性:

* keep-with-next

* keep-with-previous

* break-before

* break-after

* inhibit-line-breaks

keep-with-nextkeep-with-previous属性都是布尔类型,它们指定格式化对象是否与下面的和前面的格式化对象分别处于相同父格式化对象中。这对保持两个格式化对象处于同一页有影响,但这种影响比那种与父格式化对象的定位关系更苟刻。

break-before属性将一分隔符插入到格式化对象的开始之前。要进行分隔的内容可能有columnpageodd-pageeven-page。值也可能为noneauto-pagebreak-after属性将一分隔符插入到格式化对象的完成之后。可将相同的值用于break-before。例如,下面的模板规则确保每个SONNET在其自身的一页中有足够小的打印尺寸。

<xsl:template match="SONNET">

<fo:block break-before="page" break-after="page">

<xsl:apply-templates/>

</fo:block>

</xsl:template>

最后,inhibit-line-breaks也是布尔值,它可以设置为true,以指示哪怕是一个换行符也不允许有,更不用提分页符了。

15.14.3.2 断字属性

断字属性确定是否允许用连字符号连接以及如何使用。它只用于软或随意连字号,如有时在一行的结束用于分隔长单词的连字号。它不用于硬连字号,如单词mother-in-law中的连字号。尽管这些连字号可能影响软连字号的位置。有如下六个断字属性:

* hyphenate:只有在布尔属性的值为true时,才允许自动断字

* hyphenation-char:用于以连字符号连接单词的Unicode字符,如英语中的-

* hyphenation-keep:四个关键字之一(columnnonepagespread),指定在相对页或栏的结束处是否使用连字符号连接

* hyphenation-ladder-count:无符号整数,指定一行中连字号线条的最大个数

* hyphenation-push-char-count:无符号整数,指定必须跟在自动插入的连字符后面的最少字符个数(分开短音节显得不利)

* hyphenation-remain-char-count:无符号整数,指定必须跟在自动插入的连字符前面的最少字符个数

断字还依赖于所使用的语言和文字。因此,下面的这三个属性具有特殊的效果:

* country

* language

* script

例如:

<fo:block hyphenate=true

hyphenation-char="-"

hyphenation-keep="none"

hyphenation-ladder-count="2"

hyphenation-push-char-count="4"

hyphenation-remain-char-count="4" >

some content ...

</fo:block>

XSL不指定分隔音节的算法来确定在何处使用软连字符。甚至对于允许使用连字符连接的属性,仍然完全要由格式化程序来决定如何以连字符来连接各个单词。

 

15.14.3.3 垂直对齐属性

vertical-align属性确定其行上的格式化对象的垂直位置,与同名的CSS2属性的行为是一样的。此属性可能有下列八个关键字的值:

1baseline:将框的基线与行框的基线对齐

2sub:将框的基线与行框内部的下标基线对齐

3super:将框的基线上升到行框中的上标基线处

4top:将框的顶端与行框的顶端对齐

5middle:将框的中点对齐于行框的基线加上行框x高度的一半处

6bottom:将框的底部与行框的底部对齐

7text-top:将框的顶部与字体的顶部对齐

8text-bottom:将框的底部与字体的底部对齐

还可以将vertical-align设置为有符号的长度,以提升或降低此框到与基线的指定距离。

15.14.3.4 缩进属性

缩进属性有四个:start-indentend-indenttext-indentlast-line-end-indent,它们指定缩进的行离文本边有多远。start-indent属性从开始边(英文中为左边)移动所有的行。end-indent属性从结束边(英文中为右边)移动所有的行。text-indent属性只从开始边移动第一行。last-line-end-indent属性只从开始边移动最后一行。这些值是以有符号的长度来表示的。对start-indent取正值,text-indent取负值,就会创建一个悬挂式缩进(hanging indent)。例如,可按照下列方式,格式化一个第一行缩进0.5英寸的标准段落:

<fo:block text-indent="0.5in">

The first line of this paragraph is indented

</fo:block>

按下列方式,将一个块引用格式化成左右两边所有的行都缩进1英寸:

<fo:block start-indent="l.0in" end-indent="l.0in">

This text is offset one inch from both edges.

</fo:block>

15.14.4 字符属性

字符属性描述各个字符的性质,尽管它们可应用于包含字符的元素(如fo:blockfo:list-item-body)。这些属性包括颜色、字体、样式、粗细以及类似的属性。

15.14.4.1 颜色属性

color属性设置内容的背景颜色,其句法与CSScolor属性相同。例如,下面将文本"Lions and tigers and bears, oh my!"着成粉红色:

<fo:inline-sequence color="#FFCCCC">

Lions and tigers and bears, oh my!

</fo:inline-sequence>

15.14.4.2 字体属性

处理文本的任何格式化对象都有广泛的字体属性。其中的大多数都已从CSS中了解到,其中包括:

* font-family:按优先级顺序排列的一组字体名

* font-size:有符号长度

* font-size-adjust:通常为在x高度和字体大小之间的比值,以无符号的实数值或none来表示

* font-stretch:字体的"宽度",以下列一个关键字来表示:condensedexpandedextra-condensedextra-expandednarrowernormalsemi-condensedsemi-expandedultra-condensedultra-expandedwider

* font-style:字体的样式,指定为下列关键字之一:italicnormalobliquereverse-normalreverse-oblique

* font-variant:为normalsmall-caps

* font-weight:绘制字体的笔划的粗细,以下列关键字之一给出:100200300400500600700800900boldbolderlighternormal

15.14.4.3 text-transform属性

text-transform属性定义文本如何大写,与同名的CSS属性一致。有四个可能的值:

* none:不改变大小写(缺省值)

* capitalize:每个单词的第一个字母大写,后续的所有字母都为小写

* uppercase:所有的字母都大写

* lowercase:所有的字母都小写

此属性多少与语言有关(例如,汉语不分大小写)。当将格式化程序用于非拉丁文-1的文本时,就会任意忽略大小写的推荐值。

15.14.4.4 text-shadow属性

text-shadow属性在文本中使用阴影(shadow),类似于背景色,但区别是,阴影加在文本本身之上,而不是加在含有文本的框之上。

<fo:inline-seqence text-shadow="FFFF66">

This sentence is yellow.

</fo:inline-sequence>

15.14.4.5 text-decoration属性

text-decoration属性与CSS2text-decoration属性相同,它有下列五个可能值:

* none

* underline

* overline

* line-through

* blink

缺省值为none

15.14.4.6 score-space属性

划线(Scoring)是个包罗万象的词,用于下划线(underline)、删除线(line through)、双删除线(double strike-through)等等。score-space属性确定是否在空白处划线。例如,If score-space is true, an underlined sentence looks like this.(如果score-space true,则加上下划线的句子与此类似)。If Score-space is false, an underlined scntence looks uke this.(如果score-spacefalse,则加上下划线的句子于此类似。

15.14.5 句子属性

句子属性用于字符组,也就是说,每次只对一个以上的字符才有意义,如字母或单词之间的空格。

15.14.5.1 字符间距属性

文本的字距调整测定两个字符分开的空间有多大,这种测定方法需要小心对待。它不是一个绝对值。大多数格式化程序基于本地需要&#0;&#0;特别是在对齐文本方面&#0;&#0;来调整字母之间的空间。此外,高度品质的字体在不同的字形之间使用不同数量的空间。但是,可以使文本完全变得更宽松或更紧密。

letter-spacing属性在每对字形之间添加额外的空间,此空间超过字距调整所获得的空间。以有符号的长度来表示,以指定加入的额外空间的数量。例如:

<fo:block letter-spacing="1.5px">

This is fairly loose text

</fo:block>

可以使长度为负值,以紧缩文本。但格式化程序通常对允许在字母之间加入或移走多少额外空间具有限制。

15.14.5.2 字间距属性

word-spacing属性调整单词之间的间隔数量。另外,它的行为很像字符间距属性。其值为一有符号的长度,表示在两个单词之间要加入的额外空间的数量。例如:

<fo:block word-spacing="0.3cm">

This is pretty loose text.

</fo:block>

15.14.5.3 行距属性

XSL格式化引擎将块区域分成行区域。不能从XSL中直接创建行区域。但是,使用下面的五个属性,就可以对如何在垂直方向留下间隔施加影响:

* line-height:一行的最小高度

* line-height-shift-adjustment:如果下标和上标大到一行的高度,则为consider-shifts;否则为disregard-shifts

* line-stacking-strategyline-heightCSS模型,为缺省值);font-height(加上font-height-override-beforefont-height-override-after之后,使行与字体一样高);或者max-height(最大的上行字母高度和最大的下行字母深度之间的距离)

* font-height-override-after:有符号长度,指定在每行之后添加额外的垂直空间;也可以为关键字use-font-metrics(缺省值)来指示根据字体设置垂直空间距离

* font-height-override-before:有符号长度,指定在每行之前添加最小的额外垂直空间;也可以为关键字use-font-metrics(缺省值)来指示根据字体设置垂直空间距离

在很大程度上,行高还依赖于行的字体大小。字体越大,其行自然也就越高。例如,下面的开始段落来自于Mary WollstonecraftOf the Rights of Woman,实际上为二倍间隔:

<fo:block font-size="12pt" line-height="24pt">

In the present state of society it appears necessary to go

back to first principles in search of the most simple truths,

and to dispute with some prevailing prejudice every inch of

ground. To clear my way, I must be allowed to ask some plain

questions, and the answers will probably appear as

unequivocal as the axioms on which reasoning is built;

though, when entangled with various motives of action, they

are formally contradicted, either by the words or conduct

of men.

</fo:block>

15.14.5.4 文本对齐属性

text-aligntext-align-last属性指定内联内容在其框内如何水平对齐。可有六个值:

1start:在从右往左的文字中进行左对齐

2centered:居中

3end:在从右往左的文字中右对齐

4justify:按照需要使用额外的空间对文本进行扩大,以便填满整行

5page-inside:与页的内侧对齐,也就是说,两个面对页的左页上的右边或两个面对页的右页上的左边

6page-outside:与页的外侧对齐,也就是说,两个面对页的左页上的左边或两个面对页的右页上的右边

text-align-last属性能够用来为块中的最后一行指定不同的值。这对于对齐文本尤为重要,因为在文本中最后行通常单词不多,需要进行调整。其值可为startendjustifiedrelativerelative值使用的值与text-align属性值是一样的,除非text-alignjustified,在这种情况下,最后行与开始边对齐。

15.14.5.5 空白属性

whitespace-treatment属性指定在最初的源文档转换成格式化对象之后,格式化引擎使用仍旧存在的空白来做什么。可以为下列三个值:

1preserve:按原样保留空白

2collapse:将所有的空白压缩成一个空格

3ignore:删除首尾空白

我偏爱于保留在转换之后仍剩下的所有的空白。如果空白毫无意义,那么就很容易使用xsl:strip-space让转换过程删除空白。

15.14.5.6 wrap-option(折行选项)属性

wrap-option属性确定如何处理太长的无法容纳在一行中的文本。此属性有两个关键字值:

1wrap:将文本软折行到下一行

2no-wrap:文本不折行

15.14.6 区域属性

区域属性施加于框。这些属性既可以是块级也可以是内联框。每个框都有:

* 背景

* 页边距

* 边界

* 贴边

* 大小

15.14.6.1 背景属性

背景属性基本上与CSS1的背景属性相同,有五个属性:

* background-color属性指定框背景的颜色。其值可以是颜色或关键字transparent

* background-image属性给出用作背景影像的URI。其值可以为关键字none

* background-attachment属性指定背景影像是否加到窗口或文档上。其值为fixedscroll关键字之一。

* background-position属性指定背景影像如何放在框中。其值有centerleftrightbottommiddletop或给出坐标。

* background-repeat属性指定如果背景影像比其框小时,如何以及是否将背景影像平铺显示。可能值为repeatno-repeatrepeat-xrepeat-y

下列的块表明了background-imagebackground-positionbackground-repeatbackground-color的用法:

<fo:block background-image="/bg/paper.gif"

background-position="0,0"

background-repeat="repeat"

background-color="white">

Two strings walk into a bar ...

</fo:block>

15.14.6.2 边框属性

边框属性描述框周围边界的外观。它们几乎都与CSS边框属性相同。但是,除了border-XXX-bottomborder-XXX-topborder-XXX-leftborder-XXX-right属性之外,XSL版本还有border-XXX-beforeborder-XXX-afterborder-XXX-startborder-XXX-end版本。总共有31个边界属性,它们是:

* 颜色:border-colorborder-before-colorborder-after-colorborder-start-colorborder-end-colorborder-top-colorborder-bottom-colorborder-left-colorborder-right-color。缺省边界颜色为黑色。

* 宽度:border-widthborder-before-widthborder-after-widthborder-start-widthborder-end-widthborder-top-widthborder-bottom-widthborder-left-widthborder-right-width

* 样式:border-styleborder-before-styleborder-after-styleborder-start-styleborder-end-styleborder-top-styleborder-bottom-styleborder-left-styleborder-right-style

* 缩略属性:borderborder-topborder-bottomborder-leftborder-rightborder-colorborder-styleborder-width

例如,下面的语句在一个块周围绘制一个2像素宽的蓝色框:

<fo:block border-before-color="blue" border-before-width-"2px"

border-after-color="blue" border-after-width="2px"

border-start-color="blue" border-start-width="2px"

border-end-color="blue" border-end-width="2px">

Two strings walk into a bar ...

</fo:block>

15.14.6.3 贴边属性

贴边属性指定框的边界和框的内容之间的空间数量。框的边界线如果显示出来的话,就落在页边距和贴边之间。贴边属性绝大多数与CSS的贴边属性相同。但是,除了padding-bottompadding-toppadding-leftpadding-right属性之外,XSL版本还有padding-beforepadding-afterpadding-startpadding-end版本。因此,总共有八个贴边属性,每个都是以有符号的长度作为值。它们是:

* padding-after

* padding-before

* padding-bottom

* padding-end

* padding-left

* padding-start

* padding-right

* padding-top

例如,下面块的所有边都有0.5宽的贴边:

<fo:block padding-before="0.5cm" padding-after="0.5cm"

padding-start="0.5cm" padding-end="0.5cm">

Two strings walk into a bar ...

</fo:block>

 

15.14.6.4 块的页边距属性

有五个页边距属性,每个的值都为无符号的长度,它们是:

* margin-top

* margin-bottom

* margin-left

* margin-right

* margin

但是,这些属性在此只用于与CSS兼容。通常,推荐使用下列属性来代替,它们能更好地满足XSL格式化模型:

* space-before

* space-after

* start-indent

* end-indent

space-beforespace-after属性分别与margin-topmargin-bottom严格地等价。start-indent属性等于padding-leftborder-left-widthmargin-left之和。end-indent属性与padding-rightborder-right-widthmargin-right之和相等。图15-3对此作了更清晰地说明。

15-3 贴边、缩进、边界和XSL框之前和之后的空间

例如,下面的块在其开始和结束侧边保留0.5厘米的页边距:

<fo:block start-indent="0.5cm" end-indent="0.5cm">

Two strings walk into a bar ...

</fo:block>

15.14.6.5 内联框页边距属性

用于内联元素的页边距属性有两个,它们是:

* space-end

* space-start

它们的值是空间说明符,以便在元素之前和之后添加额外的空间范围。实际的空间可能更小或更大。由于空间不是框本身的一部分,所以框的结束空间可以是下一框的开始空间的部分。

空间说明符的值范围有最小、最大和最佳值。格式化程序可任意选取此范围内的值,以便适应页的限制。此外,空间说明符还包括优先级和限制条件值。所有的这五个值都是用分号分开的。

优先级既可以是整数,也可以为关键字force。优先条件确定当内联区域的space-end与下一个space-start发生冲突时,应出现什么情况。优先级更高的区域占上风。缺省的优先级为0

限制条件为两个关键字之一:discardretain。这些关键字确定一行的结束处对额外空间产生什么影响。缺省值为放弃额外空间。

* 15.14.6.6 内容高度和宽度属性

有四个属性可用来指定框的内容区域的高度和宽度,都是无符号的长度值,它们是:

* height

* width

* max-height

* max-width

这些属性不指定框的总宽度和总高度,也不指定页边距、贴边和边界。只指定内容区域的宽度和高度。除了无符号长度之外,可以将heightwidth属性设置为关键字auto,以基于框中内容的数量来选择高度和宽度。但是,在任何情况下,高度和宽度都不会比max-heightmax-width属性指定的值大。例如:

<fo:block height="2in" width="2in">

Two strings walk into a bar ...

</fo:block>

15.14.6.7 overflow(溢出)属性

overflow属性确定如果内容太多无法容进指定大小的框中时要出现什么情况。可以是使用尺寸属性的显式说明,或者是基于页大小或其他限制的隐式说明。有四个可能性,每一种都使用一个关键字来表示:

1auto:如果有超出部分,则使用滚动条;如果没有,则不使用滚动条

2hidden:不显示到达框之外的任何内容

3scroll:将滚动条加到框上,以便读者可以滚动其他内容

4visible:如果需要,不考虑框的大小限制,显示完整的内容

如果overflow属性没有visible值,那么clip属性就指定剪切区的形状。缺省的剪切区只是框的本身。但是,可以像下面这样指定一个特定的矩形,从而改变这种情况:

clip=rect(top_offset right_offset bottom_offset left_offset)

此处的top_offsetright_offsetbottom_offsetleft_offset为有符号的长度,以框的顶、右、底和左侧的剪切区的偏移量来表示。这样可以使剪切区比框的本身更小。

15.14.6.8 reference-orientation(参考方位)属性

reference-orientation属性可用来指定框的内容以相对于正常方向的90° 增量旋转。唯一的有效值为90° 增量,是以反时针方向计算的,也就是说可以为090180270。还可以指定为-90-180-270。例如,下面为90° 旋转:

<fo:block reference-orientation="90">

Bottom to Top

</fo:block>

15.14.6.9 书写方式属性

书写方式指定框中的内容的方向。这对框中格式化对象的排列具有重要的意义。在大多数时候,说英语和其他西方语言的人采取的都是左至右、上至下的书写方式,譬如:

A B C D E F G

H I J K L M N

O P Q R S T U

V W X Y Z

而在说希伯来语和阿拉伯语的国家里,书写顺序为右至左、上至下,如下面的方式似乎更自然:

G F E D C B A

N M L K J I H

U T S R Q P O

Z Y X W V

在台湾,由上至下、由右至左的顺序更轻松自在:

Y U Q M I E A

Z V R N J F B

W S O K G C

X T P L H D

XSL格式化语言中,书写方式不只影响文本,还影响文本流或序列中对象的排列、换行等等。读者已注意到许多属性都可以用来控制开头、结尾、前和后的变化,而不是左、右、上和下的变化。根据开头、结尾、前和后,而不是左、右、上和下指定的样式规则会产生更加强健、更具有本地化特点的样式单。

writing-mode属性指定某一地区的书写方式。此属性可取下列14个关键字值之一:

1bt-lr:自下而上、从左往右

2bt-rl:自下而上、从右往左

3lr-alternating-rl-bt:从左往右数行交替为从右往左数行、自下而上

4lr-alternating-rl-tb:从左往右一行,然后从右往左一行交互排列、自上而下

5lr-bt:从左往右、自下而上

6lr-inverting-rl-bt:从左往右,然后向上移到下一行并从右往左(即,如同自下而上的S那样迂回向上到达整个页面)

7lr-inverting-rl-tb:从右往左,然后向下移到下一行并从右往左(即,如同反向的S那样迂回向下到达整个页面)

8lr-tb:从左往右、自上而下

9rl-bt:从右往左、自下而上

10rl-tb:从右往左、自上而下

11tb-lr:自上而下、从左往右

12tb-rl:自上而下、从右往左

13tb-rl-in-rl-pairs:自上而下、从右往左

14use-page-writing-mode:显示此对象的页使用任意一种书写方式;此为缺省值

15.14.6.10 孤行和寡行

对于排字机来说,孤行(orphan)是在页面底端段落的首行。寡行(widow)是在页面顶端段落的末行。好的排字机可以将额外的一行按要求从前页移到下一行,以避免孤行和寡行现象。可以将orphans属性设置为无符号的整数,从而调整认为是孤行的行数。可以将widows属性设置为无符号的整数,从而调整认为是寡行的行数。例如,如果想确保页尾的每个段落都至少有三行,可将orphans属性设置为3。例如:

<fo:simple-page-master page-master-name="even"

orphans="3" page-height="8.5in" page width="11in"

/>

15.14.7 听觉属性

XSL支持全部的CSS2音频样式单属性的集合,包括:

* azimuth

* cue

* cue-after

* cue-before

* elevation

* pause

* pause-after

* pause-before

* pitch

* pitch-range

* play-during

* richness

* speak

* speak-header

* speak-numeral

* speak-punctuation

* speech-rate

* stress

* voice-family

* volume

听觉样式单属性在第13"级联样式单级别2"的最后一节中讨论过。在XSL格式化对象中,这些属性的语义和句法与CSS2中的完全一样。

15.15 本章小结

本章中,详细地学习了XSL格式化语言。特别是,学习了如下内容:

* XSL变换可用来完成XML源文档到以XSL格式化对象符号集标记的新的XML文档的转换。

* 大多数XSL格式化对象生成一个或多个矩形区域。页面区域包含块区域。块区域包含块区域和行区域。行区域包含内联区域。内联区域包含其他内联区域和字符区域。

* 格式化对象文档的根元素为fo:root,包含fo:layout-master-setfo:page-sequence元素。

* fo:layout-master-set元素包含一个或多个fo:simple-page-master元素,而每个元素通过将特定类型页的版面分成五个区(前、后、开头、结尾和正文),并给每个元素赋以属性,来定义页的版面。

* fo:page-sequence元素包含一个fo:sequence-specifier元素、零个或多个fo:static-content元素以及一个fo:flow元素。fo:flow的内容按照fo:sequence-specifier元素指定的顺序复制到主控页实例中。fo:static-content元素的内容复制到它所创建的第一页上。

* fo:display-rule元素生成块级水平线。fo:inline-rule元素生成内联水平线。

* fo:display-graphic元素从URL处加载影像,并显示在块中。fo:inline-graphic元素从URL处加载影像,并以内联方式加以显示。

* fo:simple-link元素创建对URL的超文本链接,并显示在块中。

* 列表是块级元素,由fo:list-block元素创建,包含块级fo:list-item元素。每个fo:list-item元素又包含一个fo:list-item-labelfo:list-item-body

* fo:page-number元素插入当前的页码。

* fo:character元素使用输出文档中的不同字符,来代替输入文档中一个特指的字符或字符串。

* fo:display-sequencefo:inline-sequence元素都是容器,用来将属性加到它们包含的文本和区域上。

* fo:footnote元素将外联的脚注和内联的脚注引用插入到页中。

* fo:float元素将外联的块级元素(如图或pullquote)插入到页中。

* 200多个独立的XSL格式化属性,其中有许多与同名的CSS属性是一样的。它们都是作为特性与XSL格式化对象的元素相关联。

下一章将介绍XLink,这是标准HTMLA元素超链接或XSLfo:display-linkfo:inline-link更强大的链接句法。