2015-12-14 120 views
1

我有一個來自最終系統的XML,它需要刪除所有具有empty or null值的空元素或屬性。XQuery刪除元素 - 屬性

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

回答

0

這部分是造成問題:

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

感謝您的回答。如果我想刪除屬性,如果該值爲空,是否有任何建議?請參閱上面的更新。 – randytan

+0

@randytan參見上面的**更新**部分 – har07