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

WSO2中移除JSON输出数组外层Result根元素的方法指引

解决Enrich仅返回单个Detail元素的问题

你遇到的核心问题是:Enrich组件默认只会选取匹配XPath表达式的第一个节点,而不是所有匹配节点的集合,所以才会输出单个Detail对象而非数组。下面给你几个实用的解决方案:

方案1:用DataWeave直接转换(推荐)

既然最终目标是JSON结构,用DataWeave来调整会更直观灵活,完全可以跳过Enrich步骤。针对Postman得到的带Result的JSON,用以下脚本转换:

%dw 2.0
output application/json
---
{
  Detail: payload.Result.Detail
}

这个脚本会直接提取Result下的Detail数组,包装成你期望的JSON结构,一步到位。

方案2:调整Enrich配置以获取所有节点

如果必须使用Enrich组件,需要修改配置让它收集所有Detail节点,而不是只取第一个。关键是添加operation="add"属性,让组件把所有匹配节点添加到目标路径,而非替换:

<enrich>
    <source clone="true" xpath="$body/Result/Detail"/>
    <target type="body" xpath="$body/Detail" operation="add"/>
</enrich>

注意:确保你的XML结构允许多个Detail节点存在于同一个父级下,如果target直接是body,可能需要先给body设置一个临时根节点来容纳这些Detail。

方案3:从XSLT源头调整输出结构

修改你的XSLT,让它直接输出不含Result外层的XML(XML必须有单个根节点,所以用临时节点包裹所有Detail):

修改后的XSLT输出示例:

<?xml version='1.0' encoding='utf-8'?>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
<soapenv:Body>
<Details>
<Detail>
<a>40</a>
<b>car</b>
<c>2019-01-17T00:00:00</c>
</Detail>
<Detail>
<a>37</a>
<b>table</b>
<c>2019-01-17T00:00:00</c>
</Detail>
<Detail>
<a>35</a>
<b>book</b>
<c>2019-01-17T00:00:00</c>
</Detail>
<Detail>
<a>26</a>
<b>box</b>
<c>2019-01-17T00:00:00</c>
</Detail>
</Details>
</soapenv:Body>
</soapenv:Envelope>

然后用Enrich提取所有Detail节点:

<enrich>
    <source clone="true" xpath="$body/Details/Detail"/>
    <target type="body"/>
</enrich>

这样转换为JSON时,多个Detail节点会自动被识别为数组,得到你想要的输出。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 03:43:30