xquery 转换为嵌入式类型
xquery tranformation to embedded type
我正在为 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>
}
}
它几乎可以完成工作,但万一所有内容都是空的或不存在,它仍然 returns 空的 complexType 标签:
<case>
<complexType></complexType>
</case>
请提示我如何解决此问题。谢谢!
将你所有的元素绑定到一个变量,然后你就可以简单地检查这个元素序列是否为空。类似这样的事情:
{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 ()
}
我正在为 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>
}
}
它几乎可以完成工作,但万一所有内容都是空的或不存在,它仍然 returns 空的 complexType 标签:
<case>
<complexType></complexType>
</case>
请提示我如何解决此问题。谢谢!
将你所有的元素绑定到一个变量,然后你就可以简单地检查这个元素序列是否为空。类似这样的事情:
{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 ()
}