use*_*382 5 xpath mule mule-el
我试图使用Mule中的DataMapper变换将第三方调用的响应映射到不同的结构.
从第三方开始,我们收到一系列项目(以及其他内容),我想将数组中的单个项目映射到对象(JSON).我收到请求中项目的标识符,该标识符可用作输入参数.
我的问题是,如何根据标识符映射项目的字段?
示例XML响应
<account>
<accountNumber>1234567</accountNumber>
<books>
<book>
<id>1</id>
<title>Sample title1</title>
<availableFrom>21-03-16</availableFrom>
</book>
<book>
<id>2</id>
<title>Sample title2</title>
<availableFrom>21-03-16</availableFrom>
</book>
<book>
<id>3</id>
<title>Sample title3</title>
<availableFrom>21-03-16</availableFrom>
</book>
</books>
</account>
Run Code Online (Sandbox Code Playgroud)
需要成为:
{
"person": {
"accountNumber": 1234567,
"selectedBook": {
"id": 1,
"title": "Sample title1"
},
"otherBooks": [
{
"id": 2,
"title": "Sample title2"
},
{
"id": 3,
"title": "Sample title3"
}
]
}
}
Run Code Online (Sandbox Code Playgroud)
所选书籍的ID保存在inputArgument.bookId.
我可以使用xpath规则为每个字段完成映射,但是,我必须在xpath中对bookId进行硬编码.相反,我需要能够将实际的id替换为所提供的id(并且在inputArgument中可用).
标题的xpath
/account/books/book[child::id=1]/title
Run Code Online (Sandbox Code Playgroud)
我已经尝试添加MEL来替换id和各种其他修复,但似乎没有任何工作.有没有办法替换bookId字段.
注意:由于客户端的限制,我无法使用DataWeave.
小智 0
使用 dataweave,你可以做这样的事情。
<dw:transform-message metadata:id="0ce877a9-29ed-401b-bd54-b90d42a1609f" doc:name="Transform Message">
<dw:set-payload><![CDATA[%dw 1.0
%var bookId = "1"
%var account = payload.account
%var books = payload.account.books
%output application/json
---
{
person : {
accountNumber: account.accountNumber,
selectedBooks: (books.*book map {
id : $.id,
title: $.title
} filter $.id == bookId)[0],
otherBooks: books.*book map {
id : $.id,
title: $.title
} filter $.id != bookId
}
}]]></dw:set-payload>
</dw:transform-message>
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
939 次 |
| 最近记录: |