簡體   English   中英

過濾XML屬性(fn:node-name與fn:name)

[英]Filtering XML attributes (fn:node-name vs. fn:name)

我正在嘗試使用XQuery(在eXist-db 2.2中)處理一組XML元素,並從結果集中的每個元素中刪除單個屬性。

XML示例:

<results xmlns:abc="http://example.org">
    <abc:element1 abc:selected="false" type="Class"/>
    <abc:element2 abc:selected="false" type="Property"/>        
</results>

要刪除的屬性是@abc:selected 我的問題是,當屬性具有xs:QName時,過濾由fn:name與fn:node-name設置的屬性之間有什么區別?

如果我使用fn:node-name並與屬性的xs:QName進行比較,則不會刪除@abc:selected

XQuery:

for $r in $results
let $name := node-name($r)
return
    element {$name} {
        $r/@*[node-name(.) != xs:QName('abc:selected')]             
    }

結果:

<results xmlns:abc="http://example.org">
    <abc:element1 abc:selected="false" type="Class"/>
    <abc:element2 abc:selected="false" type="Property"/>        
</results>

但是,如果我使用fn:name並與該屬性的字符串值進行比較,則@abc:selected已成功刪除。

XQuery:

for $r in $results
let $name := node-name($r)
return
    element {$name} {
        $r/@*[name(.) != 'abc:selected']
    }

結果:

<results xmlns:abc="http://example.org">
    <abc:element1 type="Class"/>
    <abc:element2 type="Property"/>        
</results>

這里有什么區別? 為什么使用fn:node-name和xs:QName的第一種方法不能按我期望的那樣工作?

看起來這不是創建預期的xs:QName實例的正確方法。 此表達式xs:QName('abc:selected')對我拋出錯誤“沒有為前綴abc聲明任何名稱空間” (在BaseX中測試)。

您可以使用fn:QName() ,它返回xs:QName實例,並且應該正確刪除abc:selected屬性:

for $r in $results
let $name := node-name($r)
return
    element {$name} {
        $r/@*[node-name(.) ne QName('http://example.org', 'selected')]             
    }

暫無
暫無

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

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