Как сопоставить значения на основе значения атрибута родительского элемента

Вход, может иметь n количество сущностей и несколько значений в атрибуте: Вот базовый пример:

<?xml version="1.0" encoding="UTF-8"?>
<entityset>
    <entity name="dog">
        <attribute code="app">
            <value>my application</value>
        </attribute>
        <attribute code="1code">
            <value>dog1value</value>
        </attribute>
        <attribute code="">
            <value>dog2value</value>
        </attribute>
    </entity>
    <entity name="cat">
        <attribute code="app">
            <value>my cat application</value>
        </attribute>
        <attribute code="1code">
            <value>cat1value</value>
        </attribute>
        <attribute code="2code">
            <value>cat2value</value>
        </attribute>
    </entity>
</entityset>

Мой DW для начинающих:

{
    insert: payload.entityset.*entity map {
        id: $.@name,
        name: $.attribute.value when $.attribute.@code=='1code' otherwise '',
        owner: $.attribute.value when payload.entityset.entity.attribute.@code=='2code' otherwise ''    

    }

}

Желаемый результат:

<insert>
   <record>
       <id>dog</id>
       <name>dog1value</name>
       <owner>dogvalue2</owner>
    </record>
    <record>
        <id>cat</id>
        <name>cat1value</name>
        <owner>cat2value<owner>
    </record>
 </insert>

Что я не могу понять, так это как создать условие if attribute. @ Code == "1code" затем сопоставить это attributa.value с. и атрибуты code2 для владельца. Я читаю ввод из файла xml. Когда я пытаюсь ввести «карту», ​​я всегда получаю сообщение об ошибке:

Стек исключений: 1. Невозможно преобразовать массив: в объект: (com.mulesoft.weave.model.values.coercion.exception.UnsupportedTypeCoercionException) com.mulesoft.weave.model.values.coercion.ObjectTypeCoercionValue: 31 (null) 2. Исключение при выполнении: insert: payload.entityset. * Entity map {^ Невозможно привести: массив к: объекту (com.mulesoft.weave.mule.exception.WeaveExecutionException) com.mulesoft.weave.mule.WeaveMessageProcessor $ WeaveOutputHandler : 166 (пусто)


person LaL    schedule 26.04.2016    source источник


Ответы (1)


Результатом селектора * является массив, поэтому вы не можете отобразить его как объект. Также при спуске по уровням объектов легко потерять из виду текущий уровень. Этот скрипт достигает ожидаемого результата:

%dw 1.0
%output application/xml
---
{
    insert: payload.entityset.*entity mapObject {
        record: {
            id: $.@name,
            name: (($.*attribute  filter ($.@code=='1code')) map ($.value))[0] default '',
            owner: (($.*attribute  filter ($.@code=='2code')) map ($.value))[0] default ''
        }
}
person aled    schedule 14.10.2018