xquery转换为嵌入式类型

时间:2018-06-29 11:57:30

标签: xquery osb

我正在为osb服务编写.xq转换:

我具有以下标签结构:

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

我想将它们对应地映射到

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

使得如果segment / subSegment / param1 / param2中的内容为空,则这些标签完全不存在(同时),则转换后将没有complexType标签:

<case>
</case>

所以,当我这样做时:

{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>
        }
 }

几乎可以完成这项工作,但是如果所有内容为空或不存在,它仍然会返回空的complexType标记:

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

请给我有关如何解决此问题的提示。谢谢!

1 个答案:

答案 0 :(得分:0)

将所有元素绑定到变量中,然后可以简单地检查此元素序列是否为空。与此类似:

{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 ()
 }