2016-03-08 2 views
0

У меня есть файл ввод XML, как показано ниже, где у меня есть несколько сегментов для LineErrorДля цикла и при выполнении условия в мул dataweaver

<LineErrors> 
    <LineError> 
     <LineErrorType>CARGO REPORT SAC</LineErrorType> 
     <LineErrorID>CARGO REPORT SAC</LineErrorID> 
     <LineErrorDescription>N/A</LineErrorDescription> 
    </LineError> 
    <LineError> 
     <LineErrorType>CONSOLIDATED STATUS</LineErrorType> 
     <LineErrorID>CONSOLIDATED STATUS</LineErrorID> 
     <LineErrorDescription>HELD</LineErrorDescription> 
    </LineError> 
</LineErrors> 

Сейчас в dataweaver Я произвожу другой файл XML, где атрибут сопоставляется с фиксированным значением если есть какой-либо сегмент LineError, содержащий поле LineErrorDescription, как значение «Held». Например, id = "x", если LineErrors.LineError.LineErrorDescription == "Held"

Так что мой вопрос в том, как мы можем перебирать и сравнивать в dataweaver. Пожалуйста, поделитесь, если у вас есть какие-либо подсказки.

ответ

2

Вы можете использовать фильтр и карту вместе, попробуйте это -

%dw 1.0 
%output application/xml 
--- 
payload.LineErrors.*LineError filter ($.LineErrorDescription == 'HELD') map { 
    id: 'X' 
} 
+0

Следующий скрипт производит ПАМО. Но мой вывод - xml. Таким образом, структура представляет собой нечто вроде . Можете ли вы, пожалуйста, передать сценарий, как я могу создать этот xml с вашим решением. –

1

Вы посмотрели на documentation for DataWeave? Я бы рекомендовал это в качестве отправной точки. Пример из документации, которая должна получить вы собираетесь это следующим образом:

Со следующим входом:

<users> 
    <user> 
    <name>Mariano Achaval</name> 
    <phone>152235465654</phone> 
    <street>Laprida 924</street> 
    </user> 
    <user> 
    <name>Martin Alejandro Cousido</name> 
    <phone>15332255555</phone> 
    <street>Acassuso 2280</street> 
    </user> 
</users> 

Используя следующий DW сценарий - принять к сведению, как secondName генерируется:

%dw 1.0 
%output application/json 
%function words(name) name splitBy " " 
--- 
contacts: payload.users.*user map using (parts = words($.name)){ 
    firstName: parts[0], 
    (secondName: parts[1]) when (sizeOf parts) > 2, 
    lastName: parts[-1], 
    email:((lower $.name) replace " " with ".") ++ "@acme.com", 
    address: $.street 
} 

дает следующий результат:

{ 
    "contacts": [ 
    { 
     "firstName": "Mariano", 
     "lastName": "Achaval", 
     "email": "[email protected]", 
     "address": "Laprida 924" 
    }, 
    { 
     "firstName": "Martin", 
     "secondName": "Alejandro", 
     "lastName": "Cousido", 
     "email": "[email protected]", 
     "address": "Acassuso 2280" 
    } 
    ] 
} 

Я предлагаю вам вернуться к предыдущему примеру, вы пытаетесь достичь того, что вы объяснили в своем первоначальном вопросе, и если вы столкнулись с какими-либо проблемами, поднимите новый вопрос с помощью примера сценария DW, с которым вы работаете, для дальнейших консультаций. Таким образом, вы сможете ориентироваться на более конкретные проблемы, а не на то, чтобы выполнить эту работу для вас.

Надеюсь, это поможет.

Смежные вопросы