如何从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

在执行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: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