如何在BI Publisher的RTF模板中跟踪行号并实现指定行输出文本?
BI Publisher RTF模板:行号跟踪与指定行号触发文本输出
Hey there! Let's tackle your two questions about BI Publisher RTF templates clearly and practically:
1. 如何跟踪行号
BI Publisher确实提供了内置工具来实现行号跟踪,具体分两种常见场景:
场景1:普通循环内的行号(组内/局部行号)
如果你是在一个简单的<?for-each?>循环里遍历数据行,直接用内置的<?position()?>函数就能获取当前行在循环中的位置(从1开始递增)。
示例代码(插入到表格单元格中即可):
<?for-each:DATA_ROW?> <!-- 行号列 --> <?position()?> <!-- 其他数据列 --> <?EMP_NAME?> <?DEPT?> <?end for-each?>
这个函数会自动为每一行输出1、2、3...的序列,完美适配单组数据的行号需求。
场景2:全局文档行号(跨分组累加)
如果你的模板有多个分组,需要一个贯穿整个文档的连续行号,就需要借助BI Publisher的变量工具来手动累加:
- 先在模板开头(比如
<body>标签前)初始化一个全局变量:
<?xdoxslt:set_variable($_XDOCTX, 'GLOBAL_ROW_COUNT', 0)?>
- 在每个数据循环里,先更新变量值,再输出:
<?for-each:DATA_ROW?> <?xdoxslt:set_variable($_XDOCTX, 'GLOBAL_ROW_COUNT', xdoxslt:get_variable($_XDOCTX, 'GLOBAL_ROW_COUNT') + 1)?> <!-- 输出全局行号 --> <?xdoxslt:get_variable($_XDOCTX, 'GLOBAL_ROW_COUNT')?> <!-- 其他数据内容 --> <?end for-each?>
这样不管有多少分组,行号都会持续递增,不会在新分组里重置。
2. 达到指定行号时输出特定文本
针对这个需求,你可以结合行号变量和BI Publisher的条件判断语法<?if:?>来实现,这也是完全基于内置功能的:
示例1:基于局部行号触发
如果用的是position()函数,直接判断当前行号是否等于目标值:
<?for-each:DATA_ROW?> <?position()?> - <?EMP_NAME?> <!-- 当行号为第5行时,输出特定文本 --> <?if:position() = 5?> *注意:这是第5条员工记录* <?end if?> <?end for-each?>
示例2:基于全局行号触发
如果用的是全局变量,就用变量值做判断条件:
<?for-each:DATA_ROW?> <?xdoxslt:set_variable($_XDOCTX, 'GLOBAL_ROW_COUNT', xdoxslt:get_variable($_XDOCTX, 'GLOBAL_ROW_COUNT') + 1)?> <?xdoxslt:get_variable($_XDOCTX, 'GLOBAL_ROW_COUNT')?> - <?EMP_NAME?> <!-- 当全局行号达到10时输出提示 --> <?if:xdoxslt:get_variable($_XDOCTX, 'GLOBAL_ROW_COUNT') = 10?> --- 已显示10条记录,后续内容将分页 --- <?end if?> <?end for-each?>
关于内置函数的说明
完全不需要自定义函数!BI Publisher内置的position()、xdoxslt:set_variable()、xdoxslt:get_variable()以及条件判断语法,已经能完美覆盖你的两个需求。这些都是BI Publisher RTF模板的原生功能,无需额外扩展。
内容的提问来源于stack exchange,提问作者Jorge Gx
相关产品推荐
相关产品推荐

