我有一个来自终端系统的XML,它需要删除所有具有empty or null
值的空元素或属性。
实施例
<Element>
<fn att=""></fn>
<fn att="1"></fn>
<fn></fn>
<fn att="">
<child>1</child>
</fn>
</Element>
这是我使用XQuery检查并删除它们的脚本
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(normalize-space($node/@*)))
)
then ()
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
};
这是成功删除单个元素和标记节点。但是当我在一个元素中放置多个属性时
e.g。
<fn att1="Data" att2="1"></fn>
该功能本身失败。
任何想法如何实现这一目标?
谢谢你。
**更新**
根据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
};
答案 0 :(得分:0)
这部分导致了问题:
Dialog d=new Dialog(getActivity());
d.setTitle("Image Title");
d.setContentView(R.layout.cus);
d.show();
在个别属性的谓词中调用and (not(normalize-space($node/@*)))
函数,而不是立即将所有属性传递给函数,如下所示:
normalize-space()
更新:
关于问题更新,您可以使用相同的谓词来过滤属性,这样您最终只会得到非空属性。在内部and (not($node/@*[normalize-space(.)]))
块中,设置返回元素的内容如下:
else