xml - 如何在 XQuery 上声明多个默认命名空间

标签 xml namespaces xquery xmlbeans

再会!

我一直在搜索是否可以在 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/

相关文章:

java - 解析 XML 不会显示所有项目

c# - 与 android xamarin 中的命名空间混淆

c# - xpath 查询在网页中搜索字符串

xml - 如何使用 XQuery 打印 "<"和 ">"?

sql-server - 根据使用 T-SQL 连接 xml 字段中的值来更新表中的 xml 特定节点

xml - 是Dart Server还是执行Xsl转换的浏览器?

c# - 从代码编写 visual studio 项目

php - 在php中使用Xpath,返回一个空数组

apache-flex - "' borderThickness ' is only supported by the halo theme"Flex 命名空间警告

c++ - 命名空间中的内联函数给出了对 C++ 的 undefined reference