过滤XML属性(fn:node-name与fn:name)

时间:2015-06-26 17:52:54

标签: xml xpath xsd xquery

使用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的第一种方法不像我期望的那样工作?

1 个答案:

答案 0 :(得分:1)

看起来这不是创建预期xs:QName实例的正确方法。此表达式xs:QName('abc:selected')正在抛出错误&#34;没有为前缀abc&#34; 声明的名称空间(在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')]             
    }