Невозможно передать результат выбора нескольких значений в функцию CONTAINS - PullRequest
0 голосов
/ 31 октября 2019

У меня есть вход 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>

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

1 Ответ

3 голосов
/ 31 октября 2019

Это потому, что ваша входная полезная нагрузка имеет <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>
...