再会!
我一直在搜索是否可以在 XQuery 中声明多个默认 namespace ?
我使用的示例 XML 有 2 个默认命名空间:
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
....
<wsMessageHeader xmlns="http://integration.sampleabc.com/common/header/WSMessageHeader/v2">
........
</wsMessageHeader>
<queryContactGlobalPreferences xmlns="http://integration.sampleabc.com/interfaces/queryContactGlobalPreferences/v1/queryContactGlobalPreferences.xsd">
</queryContactGlobalPreferences >
...
</soapenv:Envelope>
所以我在查询中声明了两个默认命名空间:
declare namespace soapenv='.......';
declare default element namespace '......';
declare default element namespace '........';
结论:当我执行查询时,我总是收到此错误。
如果我删除一个默认命名空间,它可以在该节点上工作,但我还需要查询另一个节点。似乎它只允许 1 个默认命名空间。
有没有办法解决这个问题?
这是错误:
Error on line 1 column 264
XPST0003: XQuery syntax error in #...lare default element namespace#:
Namespace declarations cannot follow variables, functions, or options
最佳答案
对于特定的解决方法,您需要提供一个您遇到问题的查询示例,但这是正确的。只能有一个默认元素命名空间。
通常,您会将默认命名空间声明为查询中最常用的命名空间。为其他人分配一个前缀(正如您已经为 soapenv
所做的那样),并将该前缀用于该命名空间中的任何元素。但是,您可能可以避免一些困惑,只需为所有内容分配一个前缀,这样在阅读查询时就不会产生歧义。
for $e in $doc//soapenv:Envelope
let $header := $e/headerns:wsMessageHeader
let $prefs := $e/prefsns:queryContactGlobalPreferences
return element stuff {
$header, $prefs
}
这里的关键概念是 namespace 在选择元素时才是真正重要的。您可以为它们分配或不分配前缀,并且您不必使用文档中使用的相同前缀,只要与您声明的前缀关联的 namespace 与您打算从文档中选择的元素关联的 namespace 相同即可.
关于xml - 如何在 XQuery 上声明多个默认命名空间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33817348/