如何在Pentaho中定义循环XPath处理XML多节点导出CSV
Pentaho ONIX XML转CSV:多节点列扩展方案
原始ONIX XML示例
<?xml version="1.0" encoding="ISO-8859-1"?> <ONIXmessage xmlns="http://www.editeur.org/onix/3.0/short/onix-international.dtd" release="3.0"> <header> <sender> <x298>Ingram Book Company</x298> <x299>Andy Stone</x299> <j272>andy.stone@ingramcontent.com</j272> </sender> <x307>20230924</x307> <m184>eng</m184> <x310>01</x310> <m186>USD</m186> </header> <product> <a001>015864289</a001> <a002>03</a002> <productidentifier> <b221>02</b221> <b244>000200853X</b244> </productidentifier> <descriptivedetail> <x314>00</x314> <b012>BC</b012> <b333>B102</b333> <b333>B305</b333> <measure> <x315>01</x315> <c094>8.50</c094> <c095>in</c095> </measure> <measure> <x315>02</x315> <c094>5.50</c094> <c095>in</c095> </measure> <measure> <x315>03</x315> <c094>0.45</c094> <c095>in</c095> </measure> <measure> <x315>08</x315> <c094>0.4200</c094> <c095>lb</c095> </measure> <x316>CA</x316> </descriptivedetail> </product> </ONIXmessage>
需求说明
将上述ONIX格式XML加载到Pentaho并转换为CSV,目前仅能识别<measure>节点的首个循环,需将多组<measure>下的x315字段生成x315、x315_1、x315_2……命名的列。
解决方案一:动态转置(适配任意数量的measure节点)
1. 提取Product主数据
- 拖拽XML Input组件到转换画布,配置XML文件路径
- 在Content标签页设置循环路径:
/ONIXmessage/product - 在Fields标签页添加所有Product级字段(作为分组依据):
字段名 XPath表达式 a001 ./a001a002 ./a002product_id ./productidentifier/b244x314 ./descriptivedetail/x314b012 ./descriptivedetail/b012
2. 提取Measure明细数据
- 新增一个XML Input组件,循环路径设为:
/ONIXmessage/product/descriptivedetail/measure - 提取字段:
字段名 XPath表达式 product_id ../../productidentifier/b244x315 ./x315 - 拖拽Add Sequence组件连接到该XML Input,设置:
- 序列名称:
measure_seq - 起始值:
0 - 递增值:
1 - 重置条件:
product_id(确保每个Product下的measure从0开始计数)
- 序列名称:
3. 关联主数据与明细数据
- 使用Merge Join组件,将两个XML Input的输出通过
product_id做内连接,保留主数据与所有measure的关联关系。
4. 转置明细为列
- 拖拽Pivot组件,配置:
- Group fields:选中所有Product主数据字段(a001、a002、product_id等)
- Pivot field:选择
measure_seq - Value fields:选择
x315,聚合函数选First(每个序列对应唯一的x315值)
- 若需要将
measure_seq=0对应列名设为x315而非x315_0,可添加Calculator组件,用公式重命名列:
再用该重命名后的字段作为Pivot的列名。IF([measure_seq] = 0; "x315"; "x315_" + [measure_seq])
5. 输出为CSV
- 拖拽Text File Output组件,配置输出路径、分隔符等,完成转换。
解决方案二:静态提取(适用于measure数量固定的场景)
如果已知XML中每个Product的<measure>节点数量固定,可直接在XML Input中通过XPath索引提取:
- 单个XML Input组件,循环路径设为
/ONIXmessage/product - 在Fields标签页添加字段:
字段名 XPath表达式 a001 ./a001a002 ./a002x315 ./descriptivedetail/measure[1]/x315x315_1 ./descriptivedetail/measure[2]/x315x315_2 ./descriptivedetail/measure[3]/x315x315_3 ./descriptivedetail/measure[4]/x315 - 直接连接到Text File Output组件生成CSV即可。
内容的提问来源于stack exchange,提问作者swathi anand
相关产品推荐
相关产品推荐

