преобразование xquery во встроенный тип

Я пишу преобразование .xq для службы osb:

У меня есть следующая структура тегов:

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

так что, если содержимое в сегменте/подсегменте/параме1/параме2 пусто, эти теги отсутствуют (одновременно) вообще, после преобразования не будет тегов сложного типа:

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

Пожалуйста, дайте мне подсказку о том, как это исправить. Спасибо!


person Karina Am    schedule 29.06.2018    source источник


Ответы (1)


Привяжите все свои элементы к переменной, а затем вы можете просто проверить, пуста ли эта последовательность элементов или нет. Что-то в этом роде:

{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 ()
 }
person dirkk    schedule 29.06.2018
comment
Благодарю вас! именно это и искал - person Karina Am; 02.07.2018
comment
Пожалуйста. Однако нет необходимости в благодарственном комментарии, способ сделать это на SO - проголосовать и отметить ответ как правильный. - person dirkk; 02.07.2018