Search code examples
xqueryosb

xquery tranformation to embedded type


I'm writing an .xq transformation for osb service:

I have the following structure of tags:

<case>
<segment>  Earth </segment> 
<subSegment> Africa </subSegment>
<complexType>
    <param1> values1 </param1>
    <param2> values2 </param2>
</complexType>
</case>

I would like to map them correspondingly to

<case>
<complexType>
    <segment>  Earth  </segment> 
    <subSegment> Africa </subSegment>
    <param1> values1 </param1>
    <param2> values2 </param2>
</complexType>
</case>

such that if content in segment/subSegment/param1/param2 is empty of these tags are not present (simultaneously) at all, there will be no complexType tags after transformation:

<case>
</case>

So, when I do smth like that:

{let $complexType := $cc/ns1:case/ns2:complexType
     return
     <ns3:complexType>
        {
        for $segment in $cc/ns1:case/ns2:segment
            return <ns3:segment>{ data($segment) }</ns3:segment>
        }
        {
        for $subSegment in $cc/ns1:case/ns2:subSegment
            return <ns3:subSegment>{ data($subSegment) }</ns3:subSegment>
        }
        {
        for $param1 in $complexType/ns2:param1
            return <ns3:param1>{ data($param1) }</ns3:param1>
        }
        {
        for $param2 in $complexType/ns2:param2
            return <ns3:param2>{ data($param2) }</ns3:param2>
        }
 }

It almost does the job but in case everything is empty or not present it still returns empty complexType tag:

<case>
 <complexType></complexType>
</case>

Please, give me a hint about how to fix this. Thanks!


Solution

  • Bind all your elements to a variable and then you can simply check whether this sequence of elements is empty or not. Something along the lines of this:

    {let $complexType := $cc/ns1:case/ns2:complexType
     let $elements := (
            for $segment in $cc/ns1:case/ns2:segment
                return <ns3:segment>{ data($segment) }</ns3:segment>,
            for $subSegment in $cc/ns1:case/ns2:subSegment
                return <ns3:subSegment>{ data($subSegment) }</ns3:subSegment>,
            for $param1 in $complexType/ns2:param1
                return <ns3:param1>{ data($param1) }</ns3:param1>,
            for $param2 in $complexType/ns2:param2
                return <ns3:param2>{ data($param2) }</ns3:param2>
         )
         return 
           if (exists($elements)) 
           then <ns3:complexType>{ $elements } </ns3:complexType>
           else ()
     }