BI Publisher嵌套for-each@section的成员内连续页码配置问题
报表页码问题:成员独立页码+内部连续分页解决方案
问题说明
- 报表中每个成员包含两个带不同页眉的独立部分,每部分可能跨多页
- 当前问题:同一成员的两个部分页码会被重置(例如成员XXX-XX8-356实际页码为1、1,期望为1、2)
- 核心需求:每个成员拥有独立的页码体系(从1开始),同时同一成员内的两个部分页码保持连续
当前实现方式
- 外层通过
for-each@section循环遍历每个成员 - 内层嵌套
for-each@section:xdoxslt:foreach_number处理成员的两个部分 - 若在内层section设置
initial-page-number:'auto',可实现同一成员内页码连续,但整个报表共用一套页码,无法按成员重置
解决方案步骤
1. 为每个成员初始化页码变量
在成员的for-each@section循环开头,定义并初始化当前成员的起始页码变量:
xdoxslt:set_variable($_XDOCTX, 'current_member_page', $member_start)
2. 控制内层section的页码起始值
- 第一个section设置初始页码为成员的起始值:
initial-page-number="{$member_start}" - 在第一个section的末尾,记录该部分的最后页码:
xdoxslt:set_variable($_XDOCTX, 'first_part_last', xdoxslt:get_page_number($_XDOCTX)) - 第二个section的初始页码设置为第一个部分最后页码+1:
initial-page-number="{$first_part_last + 1}"
3. 成员间重置页码变量
在每个成员的for-each@section循环结束前,重置全局页码变量,确保下一个成员从1开始:xdoxslt:set_variable($_XDOCTX, 'current_member_page', 1)
4. 调整页码显示逻辑
页面上的页码显示,使用自定义变量而非全局页码:<fo:block>页码: <xsl:value-of select="xdoxslt:get_variable($_XDOCTX, 'current_member_page')" /></fo:block>
或者直接通过section的页码属性关联变量,确保显示的是当前成员的连续页码。
关键注意点
- 确保所有section的
initial-page-number属性都绑定到成员级变量,而非全局的auto或固定值 - 使用OBP的
xdoxslt变量函数时,要确保$_XDOCTX上下文正确传递 - 检查section的
break-before/break-after属性,避免意外触发页码重置
内容的提问来源于stack exchange,提问作者mike joan
相关产品推荐
相关产品推荐

