Невозможно передать результат многозначного селектора в функцию CONTAINS.

У меня есть входной xml. Я хочу оценить условие, которое использует функцию "содержит" как истинное или ложное. Вот входной xml

 <?xml version='1.0' encoding='UTF-8'?>
  <root>
    <order>
     <items>155</items>
    </order>
    <order>
     <items>30</items>
    </order>
    <order>
      <items>15</items>
    </order>
    <order>
    <items>5</items>
     </order>
    <order>
     <items>4</items>
     <items>7</items>
    </order>
   <order>
    <items>1</items>
     <items>3</items>
    </order>
    <order>
       null
   </order>
 </root>

Я хочу проверить погоду, значение элементов в приведенном выше xml содержит 3 или нет. Итак, я попробовал этот код.

   %dw 1.0
    %output application/xml
   ---
        {
         Orders : payload.root.*order mapObject (
      doesItContains : $.*items contains "3" 
    )}

это давало мне такую ​​ошибку.

  Type mismatch for 'contains' operator
  found :null, :string
 required :array, :any or
required :string, :string or
 required
 :string, :regex

Но когда я так попробовал, все работало нормально

           {
             Orders : payload.root.*order mapObject (
     doesItContains : $ mapObject (
         contains3: $ contains "3"
        ) 
       )
            } 

Это давало ожидаемый результат.

 <?xml version='1.0' encoding='UTF-8'?>   
  <Orders>
  <doesItContains>
   <contains3>false</contains3>
  </doesItContains>
  <doesItContains>
     <contains3>true</contains3>
  </doesItContains>
  <doesItContains>
    <contains3>false</contains3>
  </doesItContains>
  <doesItContains>
     <contains3>false</contains3>
  </doesItContains>
  <doesItContains>
    <contains3>false</contains3>
  <contains3>false</contains3>
  </doesItContains>
  <doesItContains>
   <contains3>false</contains3>
   <contains3>true</contains3>
  </doesItContains>
  <doesItContains>
   <contains3>false</contains3>
 </doesItContains>
 </Orders>

Я не могу понять, почему первый код не работал. может кто-нибудь объяснить, почему код первой части не работал


person Gopi Majji    schedule 31.10.2019    source источник


Ответы (1)


Это потому, что ваша входная полезная нагрузка имеет <order>null</order>. У него нет тега <items>. Вы можете убедиться в этом, просто показав $.*items:

 %dw 1.0
 %output application/xml
 ---
 {
    Orders : payload.root.*order mapObject (
        test: $.*items 
 )}

Выход:

<?xml version='1.0' encoding='UTF-8'?>
<Orders>
  <test>
    <items>155</items>
  </test>
  <test>
    <items>30</items>
  </test>
  <test>
    <items>15</items>
  </test>
  <test>
    <items>5</items>
  </test>
  <test>
    <items>4</items>
    <items>7</items>
  </test>
  <test>
    <items>1</items>
    <items>3</items>
  </test>
  <test xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:nil="true"/>
</Orders>
person utechtzs    schedule 31.10.2019