如何从xquery中删除空属性
在执行xquery转换时,我遇到了一个条件,在这个条件下,我希望删除元素的空属性 例如:如何从xquery中删除空属性,xquery,osb,Xquery,Osb,在执行xquery转换时,我遇到了一个条件,在这个条件下,我希望删除元素的空属性 例如: <product name="{data($cBRequestType1/ns0:BCAmessage/ns0:BCAservice/ns0:BCAservice-data/ns0:request/ns0:VerificationEnquiryRequest/ns0:product/@name)}" a="{data($cBRequestType1/ns0:BCAmessage/ns0
<product
name="{data($cBRequestType1/ns0:BCAmessage/ns0:BCAservice/ns0:BCAservice-data/ns0:request/ns0:VerificationEnquiryRequest/ns0:product/@name)}"
a="{data($cBRequestType1/ns0:BCAmessage/ns0:BCAservice/ns0:BCAservice-data/ns0:request/ns0:VerificationEnquiryRequest/ns0:product/@a)}"
b="{data($cBRequestType1/ns0:BCAmessage/ns0:BCAservice/ns0:BCAservice-data/ns0:request/ns0:VerificationEnquiryRequest/ns0:product/@b)}"
c="{data($cBRequestType1/ns0:BCAmessage/ns0:BCAservice/ns0:BCAservice-data/ns0:request/ns0:VerificationEnquiryRequest/ns0:product/@c)}"
/>
测试时,输出为
这里我想删除具有null值的属性,即c。
我尝试了很多事情,但都解决不了。
有人知道怎么做吗?如果需要构造属性,请测试它是否为空字符串。为了可读性,我使用了计算元素构造函数和
let
子句,但代码的操作与您相同,为@c
添加了属性检查
element Product {
let $product = $cBRequestType1/ns0:BCAmessage/ns0:BCAservice/ns0:BCAservice-data/ns0:request/ns0:VerificationEnquiryRequest/ns0:product
return
attribute name { $product/@name },
attribute a {$product/@a },
attribute b {$product/@b },
if ($product/@c != '') then attribute c {$product/@c } else ()
}
如果输入数据中不存在产品,最好只添加原始属性,而不是构建它们:
element product {
let $product = $cBRequestType1/ns0:BCAmessage/ns0:BCAservice/ns0:BCAservice-data/ns0:request/ns0:VerificationEnquiryRequest/ns0:product
return $product/@name, $product/@a, $product/@b, $product/@c
}
如果需要构造属性,请测试它是否为空字符串。为了可读性,我使用了计算元素构造函数和
let
子句,但代码的操作与您相同,为@c
添加了属性检查
element Product {
let $product = $cBRequestType1/ns0:BCAmessage/ns0:BCAservice/ns0:BCAservice-data/ns0:request/ns0:VerificationEnquiryRequest/ns0:product
return
attribute name { $product/@name },
attribute a {$product/@a },
attribute b {$product/@b },
if ($product/@c != '') then attribute c {$product/@c } else ()
}
如果输入数据中不存在产品,最好只添加原始属性,而不是构建它们:
element product {
let $product = $cBRequestType1/ns0:BCAmessage/ns0:BCAservice/ns0:BCAservice-data/ns0:request/ns0:VerificationEnquiryRequest/ns0:product
return $product/@name, $product/@a, $product/@b, $product/@c
}
如果需要构造属性,请测试它是否为空字符串。为了可读性,我使用了计算元素构造函数和
let
子句,但代码的操作与您相同,为@c
添加了属性检查
element Product {
let $product = $cBRequestType1/ns0:BCAmessage/ns0:BCAservice/ns0:BCAservice-data/ns0:request/ns0:VerificationEnquiryRequest/ns0:product
return
attribute name { $product/@name },
attribute a {$product/@a },
attribute b {$product/@b },
if ($product/@c != '') then attribute c {$product/@c } else ()
}
如果输入数据中不存在产品,最好只添加原始属性,而不是构建它们:
element product {
let $product = $cBRequestType1/ns0:BCAmessage/ns0:BCAservice/ns0:BCAservice-data/ns0:request/ns0:VerificationEnquiryRequest/ns0:product
return $product/@name, $product/@a, $product/@b, $product/@c
}
如果需要构造属性,请测试它是否为空字符串。为了可读性,我使用了计算元素构造函数和
let
子句,但代码的操作与您相同,为@c
添加了属性检查
element Product {
let $product = $cBRequestType1/ns0:BCAmessage/ns0:BCAservice/ns0:BCAservice-data/ns0:request/ns0:VerificationEnquiryRequest/ns0:product
return
attribute name { $product/@name },
attribute a {$product/@a },
attribute b {$product/@b },
if ($product/@c != '') then attribute c {$product/@c } else ()
}
如果输入数据中不存在产品,最好只添加原始属性,而不是构建它们:
element product {
let $product = $cBRequestType1/ns0:BCAmessage/ns0:BCAservice/ns0:BCAservice-data/ns0:request/ns0:VerificationEnquiryRequest/ns0:product
return $product/@name, $product/@a, $product/@b, $product/@c
}
您还可以混合使用直接构造函数和计算构造函数,有时这种语法感觉更自然。只要将计算属性构造函数(用于可选属性)作为直接元素构造函数中的第一件事,就可以实现您的需求 例如:
<product mandatory="foo">
{
if($some-condition)then
attribute optional { "bar" }
else()
}
</product>
当$some条件为false()
时,将导致:
<product mandatory="foo" optional="bar">
</product>
<product mandatory="foo">
</product>
因此,对于您提供的示例,您可以这样做:
<product name="{data($cBRequestType1/ns0:BCAmessage/ns0:BCAservice/ns0:BCAservice-data/ns0:request/ns0:VerificationEnquiryRequest/ns0:product/@name)}"
a="{(data($cBRequestType1/ns0:BCAmessage/ns0:BCAservice/ns0:BCAservice-data/ns0:request/ns0:VerificationEnquiryRequest/ns0:product/@a)) }"
b="{(data($cBRequestType1/ns0:BCAmessage/ns0:BCAservice/ns0:BCAservice-data/ns0:request/ns0:VerificationEnquiryRequest/ns0:product/@b))}">
{
if(data($cBRequestType1/ns0:BCAmessage/ns0:BCAservice/ns0:BCAservice-data/ns0:request/ns0:VerificationEnquiryRequest/ns0:product/@c))then
attribute c {
data($cBRequestType1/ns0:BCAmessage/ns0:BCAservice/ns0:BCAservice-data/ns0:request/ns0:VerificationEnquiryRequest/ns0:product/@c)
}
else()
}
</product>
{
如果(数据($cBRequestType1/ns0:BCAmessage/ns0:BCAservice/ns0:BCAservice数据/ns0:request/ns0:verificationnequiryrequest/ns0:product/@c)),则
属性c{
数据($cBRequestType1/ns0:BCAmessage/ns0:BCAservice/ns0:BCAservice数据/ns0:request/ns0:verificationnequiryrequest/ns0:product/@c)
}
else()
}
但是,在我看来,您正在将属性从源节点复制到目标节点,并且您实际上只想从源节点复制可用的特定属性。如果是这种情况,那么只需这样做就简单得多:
let $product := $cBRequestType1/ns0:BCAmessage/ns0:BCAservice/ns0:BCAservice-data/ns0:request/ns0:VerificationEnquiryRequest/ns0:product
return
<product>
{
$product/(@name | @a | @b | @c)
}
</product>
let$product:=$cBRequestType1/ns0:BCAmessage/ns0:BCAservice/ns0:BCAservice数据/ns0:request/ns0:verificationnequiryrequest/ns0:product
返回
{
$product/(@name |@a |@b |@c)
}
如果要复制所有可用的属性,只需使用
$product/@*
还可以混合使用直接构造函数和计算构造函数,有时这种语法感觉更自然。只要将计算属性构造函数(用于可选属性)作为直接元素构造函数中的第一件事,就可以实现您的需求
例如:
<product mandatory="foo">
{
if($some-condition)then
attribute optional { "bar" }
else()
}
</product>
当$some条件为false()
时,将导致:
<product mandatory="foo" optional="bar">
</product>
<product mandatory="foo">
</product>
因此,对于您提供的示例,您可以这样做:
<product name="{data($cBRequestType1/ns0:BCAmessage/ns0:BCAservice/ns0:BCAservice-data/ns0:request/ns0:VerificationEnquiryRequest/ns0:product/@name)}"
a="{(data($cBRequestType1/ns0:BCAmessage/ns0:BCAservice/ns0:BCAservice-data/ns0:request/ns0:VerificationEnquiryRequest/ns0:product/@a)) }"
b="{(data($cBRequestType1/ns0:BCAmessage/ns0:BCAservice/ns0:BCAservice-data/ns0:request/ns0:VerificationEnquiryRequest/ns0:product/@b))}">
{
if(data($cBRequestType1/ns0:BCAmessage/ns0:BCAservice/ns0:BCAservice-data/ns0:request/ns0:VerificationEnquiryRequest/ns0:product/@c))then
attribute c {
data($cBRequestType1/ns0:BCAmessage/ns0:BCAservice/ns0:BCAservice-data/ns0:request/ns0:VerificationEnquiryRequest/ns0:product/@c)
}
else()
}
</product>
{
如果(数据($cBRequestType1/ns0:BCAmessage/ns0:BCAservice/ns0:BCAservice数据/ns0:request/ns0:verificationnequiryrequest/ns0:product/@c)),则
属性c{
数据($cBRequestType1/ns0:BCAmessage/ns0:BCAservice/ns0:BCAservice数据/ns0:request/ns0:verificationnequiryrequest/ns0:product/@c)
}
else()
}
但是,在我看来,您正在将属性从源节点复制到目标节点,并且您实际上只想从源节点复制可用的特定属性。如果是这种情况,那么只需这样做就简单得多:
let $product := $cBRequestType1/ns0:BCAmessage/ns0:BCAservice/ns0:BCAservice-data/ns0:request/ns0:VerificationEnquiryRequest/ns0:product
return
<product>
{
$product/(@name | @a | @b | @c)
}
</product>
let$product:=$cBRequestType1/ns0:BCAmessage/ns0:BCAservice/ns0:BCAservice数据/ns0:request/ns0:verificationnequiryrequest/ns0:product
返回
{
$product/(@name |@a |@b |@c)
}
如果要复制所有可用的属性,只需使用
$product/@*
还可以混合使用直接构造函数和计算构造函数,有时这种语法感觉更自然。只要将计算属性构造函数(用于可选属性)作为直接元素构造函数中的第一件事,就可以实现您的需求
例如:
<product mandatory="foo">
{
if($some-condition)then
attribute optional { "bar" }
else()
}
</product>
当$some条件为false()
时,将导致:
<product mandatory="foo" optional="bar">
</product>
<product mandatory="foo">
</product>
因此,对于您提供的示例,您可以这样做:
<product name="{data($cBRequestType1/ns0:BCAmessage/ns0:BCAservice/ns0:BCAservice-data/ns0:request/ns0:VerificationEnquiryRequest/ns0:product/@name)}"
a="{(data($cBRequestType1/ns0:BCAmessage/ns0:BCAservice/ns0:BCAservice-data/ns0:request/ns0:VerificationEnquiryRequest/ns0:product/@a)) }"
b="{(data($cBRequestType1/ns0:BCAmessage/ns0:BCAservice/ns0:BCAservice-data/ns0:request/ns0:VerificationEnquiryRequest/ns0:product/@b))}">
{
if(data($cBRequestType1/ns0:BCAmessage/ns0:BCAservice/ns0:BCAservice-data/ns0:request/ns0:VerificationEnquiryRequest/ns0:product/@c))then
attribute c {
data($cBRequestType1/ns0:BCAmessage/ns0:BCAservice/ns0:BCAservice-data/ns0:request/ns0:VerificationEnquiryRequest/ns0:product/@c)
}
else()
}
</product>
{
如果(数据($cBRequestType1/ns0:BCAmessage/ns0:BCAservice/ns0:BCAservice数据/ns0:request/ns0:verificationnequiryrequest/ns0:product/@c)),则
属性c{
数据($cBRequestType1/ns0:BCAmessage/ns0:BCAservice/ns0:BCAservice数据/ns0:request/ns0:verificationnequiryrequest/ns0:product/@c)
}
else()
}
但是,在我看来,您正在将属性从源节点复制到目标节点,并且您实际上只想从源节点复制可用的特定属性。如果是这种情况,那么只需这样做就简单得多:
let $product := $cBRequestType1/ns0:BCAmessage/ns0:BCAservice/ns0:BCAservice-data/ns0:request/ns0:VerificationEnquiryRequest/ns0:product
return
<product>
{
$product/(@name | @a | @b | @c)
}
</product>
let$product:=$cBRequestType1/ns