过滤 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')
为我抛出错误 "No namespace declared for prefix abc"(在 BaseX 中测试)。
您可以使用 fn:QName()
which return 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')]
}
使用 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')
为我抛出错误 "No namespace declared for prefix abc"(在 BaseX 中测试)。
您可以使用 fn:QName()
which return 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')]
}