在Oracle BI Publisher中遍历XML标签并统计非空标签数
遍历XML所有标签并统计非空值标签数量
问题分析
你需要遍历BAL_NAME_REC下的所有子标签(包括未知标签),统计其中包含非空值的标签总数。原来的代码仅循环了BAL_NAME_REC节点,未处理内部子标签,且硬编码标签名的方式无法适配未知标签场景。
解决方案代码
<!-- 初始化计数器为0 --> <?xdoxslt:set_variable($_XDOCTX, 'COUNTER', 0)?> <!-- 遍历每个BAL_NAME_REC记录 --> <?for-each:BAL_NAME_REC?> <!-- 遍历当前记录下的所有子节点(适配所有已知/未知标签) --> <?for-each:node()?> <!-- 判断节点值是否非空(去除首尾空白后) --> <?if: normalize-space(.) != ''?> <!-- 计数器加1 --> <?xdoxslt:set_variable($_XDOCTX, 'COUNTER', xdoxslt:get_variable($_XDOCTX, 'COUNTER') + 1)?> <?end if?> <?end for-each?> <?end for-each?> <!-- 可选:输出最终统计结果 --> 非空值标签总数:<?xdoxslt:get_variable($_XDOCTX, 'COUNTER')?>
关键细节说明
- 初始化计数器:必须在循环开始前将计数器设为0,避免初始值异常。
- 通配符遍历子节点:
<?for-each:node()?>会遍历当前BAL_NAME_REC下的所有子标签,无需提前知道标签名称,完美适配未知标签需求。 - 非空判断:
normalize-space(.)会去除文本首尾的空格、换行等空白字符,确保仅含空白的标签不会被误判为有值。 - 计数器更新:每遇到一个非空值的标签,就将计数器加1,最终得到所有符合条件的标签数量。
示例验证
针对你提供的XML示例,其中非空值的标签共有10个:CTX_STR、TRU_NAME、RECORD_SEQUENCE、BAL_DIM、PERSON_NUMBER、PAYROLL_REL_NUM、PERSON_NAME、PAYROLL_NAME、NAME1、NAME2,运行代码后计数器会返回10,与预期一致。
内容的提问来源于stack exchange,提问作者Arunachaleswaran L
相关产品推荐
相关产品推荐

