Как объединить карту и фильтр для XML-атрибута в dataweave 2.0? - PullRequest
0 голосов
/ 23 мая 2019

Я пытаюсь выбрать определенный XML-файл для большой коллекции, используя фильтр, чтобы получить только тот, который имеет правильный атрибут.

Без фильтра я получаю каждый последний элемент в текущей коллекции, но просто не могу найти правильный синтаксис для фильтра ...

Мои XML-данные:

<customer>
  <profile>
    <custom-attributes>
      <custom-attribute attribute-id="customerCredit">0.0</custom-attribute>
      <custom-attribute attribute-id="customerIDS">12345</custom-attribute>
      <custom-attribute attribute-id="sscid">00001</custom-attribute>
    </custom-attributes>
  /<profile>
</customer>

Мой фильтр данных:

payload.ns0#customers.*ns0#customer map ( customer , indexOfCustomer ) -> {
    (customer.ns0#profile.*ns0#"custom-attributes" filter ($.ns0#"custom-attribute".@"attribute-id" == "customerIDS") map {
     "keys" : $
     }
     )      

Я хотел бы получить "keys: 12345" для примера выше, но из-за фильтра он просто пропущен.

1 Ответ

1 голос
/ 23 мая 2019

Ваш ввод не соответствует вашему сценарию dw, поэтому трудно сказать, нет пространств имен и отсутствует элемент "customer".

Но, основываясь на ваших входных данных и ваших выходных данных, вы можете достичь их с помощью всего лишь фильтра:

%dw 2.0
output application/json
---
payload.*customer map {
    keys: $.profile."custom-attributes".*"custom-attribute" filter($.@"attribute-id"=="customerIDS")    
}

Выходы:

[
  {
    "keys": [
      "12345"
    ]
  }
]

Или, исходя из вашего примера, нет необходимости использовать карту либо:

%dw 2.0
output application/json
---
keys: payload.customer.profile."custom-attributes".*"custom-attribute" filter($.@"attribute-id"=="customerIDS")

Если вы предоставите более подробный вводи выход вы ожидаете, что мы можем помочь больше.

...