XSLT1.0下XSL-FO多页差异化页脚流式布局配置方案咨询
结论
该需求完全可以基于XSL-FO 1.0标准实现,不需要依赖引擎私有扩展或者XSLT 2.0特性,核心是修正页面主控的匹配逻辑,配合强制分页规则覆盖全部三个场景。
原有代码的核心问题
- 你写的
PagSeqMaster仅用page-position="first"匹配整个序列的第一页,第二页只要有内容就会直接跳到AllPages模板,没法给承载表格内容的第二页匹配footer02 PagSeqMaster-alt虽然固定前两页用对应模板,但没有做分页边界约束,当表格只占1页时,后续附加内容会直接排到第2页,没法满足“表格仅占1页时第2页留空、附加内容从第3页开始”的要求- 没有给重复表格和后续附加内容做分页锚点,引擎没法根据表格实际占用页数自动切换页脚规则
具体实现步骤
1. 修正页面集(layout-master-set)配置
你原来定义的三个单页模板(Page01/Page02/AllPages)不需要改动,只需要替换掉原来有问题的页面序列主控,改成明确的前两页固定匹配、后续页无限复用通用模板的逻辑:
<fo:layout-master-set> <!-- 原有三个simple-page-master保留即可,以下仅展示修正后的page-sequence-master --> <fo:page-sequence-master master-name="PagSeqMaster"> <!-- 第1页强制使用Page01模板,显示footer01 --> <fo:single-page-master-reference master-reference="Page01"/> <!-- 第2页无论是否有内容,都强制使用Page02模板,显示footer02 --> <fo:repeatable-page-master-alternatives maximum-repeats="1"> <fo:conditional-page-master-reference master-reference="Page02" blank-or-not-blank="not-blank"/> <fo:conditional-page-master-reference master-reference="Page02" blank-or-not-blank="blank"/> </fo:repeatable-page-master-alternatives> <!-- 第3页及之后,所有页面无论是否空白,都使用AllPages模板显示通用页脚 --> <fo:repeatable-page-master-alternatives maximum-repeats="no-limit"> <fo:conditional-page-master-reference master-reference="AllPages" page-position="any"/> </fo:repeatable-page-master-alternatives> </fo:page-sequence-master> </fo:layout-master-set>
2. 调整内容流的分页控制
在重复表格内容和后续附加内容之间,插入一个隐藏的分页控制块,强制附加内容必须从奇数页(对应规则里的第3页及之后的通用页区域)开始排布:
<fo:page-sequence master-reference="PagSeqMaster"> <!-- 原有三个static-content(三个页脚)保留即可,不需要改动 --> <fo:flow flow-name="Body"> <!-- 此处放置跨页的重复表格内容 --> <fo:block>repeating table content starting on page 1 goes here</fo:block> <!-- 核心分页控制块,无实际可见内容 --> <fo:block break-before="auto" force-page-count="end-on-even" odd-or-even="odd" visibility="hidden" line-height="0"> <fo:leader/> </fo:block> <!-- 此处放置所有后续附加内容 --> <fo:block>all additional content starts from here</fo:block> </fo:flow> </fo:page-sequence>
场景适配逻辑说明
这套配置可以自动覆盖你提到的全部三个场景:
- 当表格内容仅占1页:表格在第1页排完后,分页控制块会强制生成第2页空白页(匹配Page02模板显示footer02),附加内容自动从第3页开始,第3页起显示通用页脚
- 当表格内容占满2页:表格自然流到第2页排完,分页控制块检测到当前位于偶数页(第2页),不会生成额外空白页,附加内容直接从第3页开始,第2页因为承载了表格内容,正常显示footer02
- 当表格内容占满3页:表格自然流过1、2、3页,前两页分别显示对应专属页脚,第3页开始自动切换为通用页脚,分页控制块检测到当前位于奇数页(第3页),不会插入额外空白页,附加内容直接接续排布
注意:三个单页模板的
region-body必须使用相同的region-name(你原来写的Body就符合要求),否则内容流无法跨页连续渲染。如果使用的渲染引擎对force-page-count属性支持不佳,可以把分页控制块替换为两个连续的带break-before="page"属性的隐藏块,配合空白页匹配规则可以实现完全一致的效果。
内容的提问来源于stack exchange,提问作者iwasaki
相关产品推荐
相关产品推荐

