[英]XQuery Remove Elements - Attributes
我有一個來自最終系統的XML,它要求刪除所有具有empty or null
值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
};
這樣可以成功刪除單個元素和標簽節點。 但是當我將多個屬性放在一個元素中時
例如 <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.