Xml XQuery删除元素-属性
我有一个来自终端系统的XML,它需要删除所有具有Xml XQuery删除元素-属性,xml,xpath,xquery,Xml,Xpath,Xquery,我有一个来自终端系统的XML,它需要删除所有具有空或null值的空元素或属性 范例 <Element> <fn att=""></fn> <fn att="1"></fn> <fn></fn> <fn att=""> <child>1</child> </fn> </Element> 这将成功删除单个
空或null值的空元素或属性
范例
<Element>
<fn att=""></fn>
<fn att="1"></fn>
<fn></fn>
<fn att="">
<child>1</child>
</fn>
</Element>
这将成功删除单个元素和标记节点。但是当我在一个元素中放置多个属性时
e、 g。
函数本身失败
有什么办法可以做到这一点吗
谢谢你
**更新**
根据har07答案,如果我想更改函数以删除具有空值的属性,是否有任何建议?我尝试使用下面的逻辑,但仍然发送相同的结果
declare function local:remove-empty-elements($nodes as node()*) as node()* {
for $node in $nodes
return
if ($node instance of element())
then if (
(normalize-space($node) = '')
and (not($node/@*[normalize-space(.)]))
)
then (
/* updated code here */
if(($node/@*[normalize-space(.)])= '') then ()
else
$node/@*[normalize-space(.)]
)
else element { node-name($node)
}
{ $node/@*, local:remove-empty-elements($node/node())}
else if ($node instance of document-node())
then local:remove-empty-elements($node/node())
else $node
};
这部分是导致问题的原因:
and (not(normalize-space($node/@*)))
在谓词中为单个属性调用normalize-space()
函数,而不是一次性将所有属性传递给函数,如下所示:
and (not($node/@*[normalize-space(.)]))
更新:
关于问题更新,您可以使用相同的谓词来过滤属性,从而只得到非空属性。在内部else
块中,按如下方式设置返回元素的内容:
else element {node-name($node)}
{
$node/@*[normalize-space(.)],
local:remove-empty-elements($node/node())
}
谢谢你的回答。如果我想删除值为空的属性,有什么建议吗?请参阅上面的更新。
else element {node-name($node)}
{
$node/@*[normalize-space(.)],
local:remove-empty-elements($node/node())
}