XSL-FO的page-sequence元素是控制文档分页的核心容器,它定义了文档中一个完整页面的序列,所有页面相关的内容、布局规则都在这个元素的作用范围内生效,通过合理配置其属性和内部嵌套元素,就能实现多种分页控制效果。

page-sequence元素的基本结构
page-sequence元素必须作为<fo:root>的直接子元素存在,每个page-sequence对应一组连续的页面,其基本结构如下:
<fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format">
<fo:layout-master-set>
<!-- 定义页面模板 -->
<fo:simple-page-master master-name="A4" page-height="29.7cm" page-width="21cm">
<fo:region-body margin="2cm"/>
</fo:simple-page-master>
</fo:layout-master-set>
<!-- 分页控制核心:page-sequence元素 -->
<fo:page-sequence master-reference="A4">
<fo:flow flow-name="xsl-region-body">
<!-- 页面内容 -->
</fo:flow>
</fo:page-sequence>
</fo:root>
通过属性控制分页行为
page-sequence元素本身提供了多个属性来控制分页的基础规则,常用的属性包括:
- master-reference:指定当前页面序列使用的页面模板,对应<fo:layout-master-set>中定义的master-name,是必填属性,决定了页面的基础尺寸和区域划分。
- initial-page-number:设置当前页面序列的起始页码,默认值为auto,会自动接续上一个page-sequence的页码,也可以设置为具体的数字,或者设置为auto-odd、auto-even实现奇偶页起始控制。
- force-page-count:控制当前页面序列的总页数,可选值包括auto、even、odd、no-force,比如设置为even可以强制页面序列的总页数为偶数,不足时会自动添加空白页。
属性控制分页示例
以下示例实现了一个从奇数页开始、总页数强制为偶数的页面序列:
<fo:page-sequence
master-reference="A4"
initial-page-number="auto-odd"
force-page-count="even">
<fo:flow flow-name="xsl-region-body">
<fo:block>第一章内容</fo:block>
<fo:block>第二章内容</fo:block>
</fo:flow>
</fo:page-sequence>
通过嵌套元素实现复杂分页控制
除了自身属性,page-sequence内部可以嵌套多个子元素来细化分页规则,常用的子元素包括:
fo:title元素
定义当前页面序列的标题,部分渲染引擎会将这个标题作为PDF的书签或者页面标题显示,不影响分页逻辑,但属于页面序列的元数据配置。
fo:static-content元素
定义页面的静态内容,比如页眉、页脚、页码等,这些内容会在每个页面重复出现,通过flow-name属性关联到页面模板的区域,比如关联到xsl-region-before就是页眉内容。
fo:flow元素
这是page-sequence的必填子元素,所有动态内容都放在这个元素内部,当内容超出当前页面区域时,XSL-FO渲染引擎会自动创建新的页面,这就是自动分页的基础逻辑。
手动分页的实现方式
如果需要在指定位置强制分页,可以在<fo:flow>内部使用<fo:block>的break-before或者break-after属性,这两个属性可以设置分页的触发时机:
- break-before:在当前块之前强制分页,可选值包括page、odd-page、even-page,分别表示强制分页、分页到奇数页、分页到偶数页。
- break-after:在当前块之后强制分页,可选值和break-before一致。
以下示例实现了在章节标题前强制分页到奇数页的效果:
<fo:page-sequence master-reference="A4">
<fo:flow flow-name="xsl-region-body">
<fo:block>前言内容</fo:block>
<!-- 章节标题前强制分页到奇数页 -->
<fo:block break-before="odd-page" font-size="20pt" font-weight="bold">
第一章 基础概念
</fo:block>
<fo:block>第一章的具体内容</fo:block>
</fo:flow>
</fo:page-sequence>
分页控制的常见问题
在实际使用中,分页控制常遇到内容溢出或者分页不符合预期的问题,通常可以从以下几个方向排查:
- 检查page-sequence的master-reference是否对应正确的页面模板,页面模板的region-body区域尺寸是否足够容纳内容。
- 检查force-page-count等属性是否设置了不符合预期的值,导致自动添加了多余的空白页。
- 检查手动分页的break-before、break-after属性是否设置到了正确的元素上,避免误触发分页。
通过合理组合page-sequence的属性、内部嵌套元素以及内容块的break属性,就能实现XSL-FO文档的灵活分页控制,满足不同排版场景的需求。
XSL-FOpage-sequence分页控制XML格式化修改时间:2026-07-10 11:06:32