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
相关产品推荐
相关产品推荐

