首页 > 解决方案 > 无法将多值选择器的结果传递给 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>

我不知道为什么第一个代码不起作用。有人可以解释为什么第一部分代码不起作用

标签: dataweavemulesoft

解决方案


这是因为您的输入有效负载具有<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>

推荐阅读