簡體   English   中英

XQuery刪除元素-屬性

[英]XQuery Remove Elements - Attributes

我有一個來自最終系統的XML,它要求刪除所有具有empty or nullempty 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
};

這樣可以成功刪除單個元素和標簽節點。 但是當我將多個屬性放在一個元素中時

例如 <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
};

這是造成問題的原因:

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())
             }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM