XQuery删除元素 - 属性

时间:2015-12-14 08:00:49

标签: xml xpath xquery

我有一个来自终端系统的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
};

1 个答案:

答案 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