You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何实现卡片正反面使用相同页码的样式表?

问题: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 06:43:11