Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xml XQuery删除元素-属性_Xml_Xpath_Xquery - Fatal编程技术网

Xml XQuery删除元素-属性

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> 这将成功删除单个

我有一个来自终端系统的XML,它需要删除所有具有
空或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())
             }