OIC循环追加CSV时,如何实现XSLT生成连续递增的RowNum?
OIC追加CSV实现连续RowNum的解决思路
问题根源
你用的position()和xsl:number都是基于单次XSLT转换的上下文计数,每次循环是独立的XSLT处理,所以无法跨循环保留计数,导致RowNum重复。以下是三种可行的解决方法:
方法1:使用OIC全局持久化计数器
- 创建全局变量:在OIC中创建一个全局变量(比如
GLOBAL_ROW_COUNT),初始值设为0,开启持久化(避免OIC重启后丢失值)。 - 计算当前循环的起始RowNum:在每次循环开始前,读取
GLOBAL_ROW_COUNT的值作为起始偏移量。 - 生成RowNum:在XSLT中,用
${GLOBAL_ROW_COUNT} + position()作为当前记录的RowNum。<ns35:RowNum> <xsl:value-of select="$GLOBAL_ROW_COUNT + position()"/> </ns35:RowNum> - 更新全局变量:循环结束后,用Expression更新
GLOBAL_ROW_COUNT为${GLOBAL_ROW_COUNT} + 本次处理的记录数(比如10)。
方法2:读取已有CSV的行数确定起始值
- 读取已有文件行数:每次循环前,用OIC的File Adapter读取目标CSV文件,通过Groovy脚本或XSLT统计已有数据行数(注意排除表头行)。
示例Groovy脚本计算行数:def fileContent = new File(inputFilePath).text def lineCount = fileContent.split('\n').size() - 1 // 减1是排除表头 return lineCount - 计算RowNum:将统计得到的行数作为起始偏移量,XSLT中用
起始偏移量 + position()生成RowNum。 - 处理首次生成场景:如果文件不存在,起始偏移量设为0。
方法3:使用OIC序列生成器(Sequence Generator)
- 配置序列生成器:在OIC中创建一个Sequence Generator,设置起始值为1,步长为1,开启持久化。
- 获取连续序列值:在每条记录的处理逻辑中,调用序列生成器的“Next Value”操作,直接将返回值作为RowNum。
这种方法不需要手动计算偏移量,序列生成器会自动跨循环保持连续计数,适合批量处理场景。
内容的提问来源于stack exchange,提问作者Anatoliy
相关产品推荐
相关产品推荐

