如何实现卡片正反面使用相同页码的样式表?
问题:XSL-FO生成正反面同编号的5x8卡片,处理内容溢出
我正在开发一个样式表,用于将文档输出为一系列5x8规格的卡片。需求是卡片的正反面使用相同的页码(例如打印后第一张卡片正反面均显示“Card A”),且无需将每张卡片都作为单独元素编写。目前想不到不借助Area Trees或手动标记单个卡片的实现方法,是否有遗漏的方案?
补充说明
每张“卡片”对应一套5x8页面的正反面,打印在卡片纸上时显示相同编号。源数据示例如下:
<card> <header>[...]</header> <step>Do this</step> <step>Do that</step> </card> <card> <header>[...]</header> <step>Do this</step> <step>Do that</step> [...] <step>You've done enough steps that it's overflowed onto another card</step> </card>
在此场景中:
- 第一个
<card>元素生成Card A,因步骤较少,Card A背面为空; - 第二个
<card>元素生成Card B,正反面均有内容且均标记为Card B,超出内容将流转至Card C。
限制条件:
- 无法通过计数元素来处理,因为内容溢出会导致物理卡片数量多于
<card>元素数量; - 无法直接使用
fo:page-sequence,因为它会单独为卡片背面编号。
可行解决方案
1. 自定义页码逻辑结合fo:page-sequence
为每个<card>创建独立的fo:page-sequence,通过自定义计算规则让正反面共享同一卡片编号:
- 为每个
<card>设置initial-page-number为起始奇数(比如第一个<card>从1开始,第二个从3开始,以此类推); - 编写页码模板,将当前页码转换为卡片标识:通过
floor((current-page-number() + 1) / 2)计算卡片序号,再映射为A、B、C等字母标识。例如页码1和2对应Card A,3和4对应Card B。
2. 用fo:repeatable-page-master-alternatives控制正反面布局
- 定义两个页面主模板:
card-front和card-back,分别对应卡片的正反面,两者使用相同的编号占位符; - 通过
fo:repeatable-page-master-alternatives设置页面交替规则,确保内容先填满正面,再流转到背面,若仍有溢出则生成新的正反面页面对; - 绑定当前
<card>的编号变量,所有从该<card>流转出的页面对都使用同一编号,直到内容完全输出。
3. 基于fo:flow的内容拆分与编号绑定
- 将单个
<card>的内容放入fo:flow,设置容器高度为单张卡片正面的高度; - 当内容溢出时,自动触发新的页面(背面及后续的正反面),并保持当前
<card>的编号变量不变; - 只有当该
<card>的所有内容输出完毕后,才切换到下一个<card>的编号。
核心思路
核心是将卡片编号与<card>元素绑定,而非物理页面,通过XSL变量跟踪当前活跃的<card>标识,让所有从该元素溢出的页面都共享同一编号,同时利用XSL-FO的页面流转机制自动处理内容拆分。
内容的提问来源于stack exchange,提问作者Tom
相关产品推荐
相关产品推荐

