0
votes

I tried to implement a simple loop by checking the null for the variable and setting in the result.

My portion of mule flow looks like below.

Database(select) -> Transform Message(DataWeave- convert to xml)

Database has value as like below :

Book1 Book2 Book3 Book4 Book5
abc   cde   fgh   ijk   lmn
opq   rst   NULL  NULL  NULL

Dataweaver code looks like below :

ns0#LibraryDetails:{
                ns0#User: payload."Book1",
                ns0#User: payload."Book2",
                ns0#User: payload."Book3",
                ns0#User: payload."Book4",
                ns0#User: payload."Book5"
            }

Expected output1 is

<LibraryDetails>
   <User>abc</User>
   <User>cde</User>
   <User>fgh</User>
   <User>ijk</User>
   <User>lmn</User>
</LibraryDetails>

Expected output2 is

<LibraryDetails>
   <User>opq</User>
   <User>rst</User>
</LibraryDetails>

How can we escape only null values and creating loop in data weave. I tried map function as well. Could you please show some light on this.

2

2 Answers

1
votes

To get the expected output use map and then use skipNullOn="everywhere" if you want that logic across all elements. The following gives me your expected output

%dw 1.0
    %output application/xml skipNullOn="everywhere"

    %namespace ns0 http://something.com
    ---

    ns0#LibraryDetails: { (payload map {
          ns0#User: $.Book1,
          ns0#User: $.Book2,
          ns0#User: $.Book3,
          ns0#User: $.Book4,
          ns0#User: $.Book5
    } )  }
0
votes

You can try this:

ns0#LibraryDetails:{
                ns0#User: when null != payload."Book1" then payload."Book1" ,
                ns0#User: when null != payload."Book2"then payload."Book2",
                ns0#User: when null != payload."Book3"then payload."Book3",
                ns0#User: when null != payload."Book4"then payload."Book4",
                ns0#User: when null != payload."Book5"then payload."Book5"
            }

ELSE: Use the beow statement: %output application/xml skipNullOn="everywhere"