You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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./a001
    a002./a002
    product_id./productidentifier/b244
    x314./descriptivedetail/x314
    b012./descriptivedetail/b012

2. 提取Measure明细数据

  • 新增一个XML Input组件,循环路径设为:/ONIXmessage/product/descriptivedetail/measure
  • 提取字段:
    字段名XPath表达式
    product_id../../productidentifier/b244
    x315./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组件,用公式重命名列:
    IF([measure_seq] = 0; "x315"; "x315_" + [measure_seq])
    
    再用该重命名后的字段作为Pivot的列名。

5. 输出为CSV

  • 拖拽Text File Output组件,配置输出路径、分隔符等,完成转换。

解决方案二:静态提取(适用于measure数量固定的场景)

如果已知XML中每个Product的<measure>节点数量固定,可直接在XML Input中通过XPath索引提取:

  • 单个XML Input组件,循环路径设为/ONIXmessage/product
  • 在Fields标签页添加字段:
    字段名XPath表达式
    a001./a001
    a002./a002
    x315./descriptivedetail/measure[1]/x315
    x315_1./descriptivedetail/measure[2]/x315
    x315_2./descriptivedetail/measure[3]/x315
    x315_3./descriptivedetail/measure[4]/x315
  • 直接连接到Text File Output组件生成CSV即可。

内容的提问来源于stack exchange,提问作者swathi anand

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 06:55:56