xml - XQuery:省略不包含 namespace 的源文档的 namespace

标签 xml xpath namespaces xquery

我想使用 XQuery 在两个 XML 文档之间进行映射。而源文档不包含任何命名空间声明,目标文档需要一个目标命名空间(必须是系统处理它的默认命名空间)。我知道 XQuery 总是需要一个命名空间(并且 XQuery 中的所有内容都在一个命名空间中)。但是,我希望如此简化我的 XQuery 的 XPath 表达式,尤其希望尽可能省略 namespace 。

以下示例说明了这种情况:

源文件

<?xml version="1.0" encoding="UTF-8"?>
<!-- note that this documents does not declare any namespace -->
<a>
    <b>
        <c>ABC</c>
    </b>
</a>

XQuery 文件
xquery version "1.0";

declare variable $doc := .;

let $abc := $doc/a/b/c
return
<foo xmlns="http://www.example.org">    
    <bar1>{$doc/a/b/c/text()}</bar1>    
    <bar2>{$doc/*:a/*:b/*:c/text()}</bar2>
    <bar3>{$abc/text()}</bar3>    
</foo>

这会生成以下内容 (Saxon-HE 9.5.1.3):
<?xml version="1.0" encoding="UTF-8"?>
<foo xmlns="http://www.example.org">
   <bar1/>
   <bar2>ABC</bar2>
   <bar3>ABC</bar3>
</foo>

基本上我希望能够像第一条规则(bar1)一样构造元素,即。 e.在 XPath 表达式中不使用 namespace 。不幸的是,这似乎不起作用。相反,我必须使用更费力的语法,如第二条规则 (bar2)。

一种解决方法(好吧,而不是 hack)是在引入命名空间之前声明变量(参见 bar3),但我怀疑这是否是一个好主意,因为
a) 对于较大的文档,它可能无法扩展,并且
b) 它阻止了“正确地”声明默认元素命名空间,i。 e.正如 XQuery 通过文档标题中的单独声明所预期的那样。

有谁知道如何实现所需的行为?非常感谢您提前!

最佳答案

不幸的是,在 XQuery 中,XPath 表达式中名称的默认 namespace 始终与构造元素的默认 namespace 相同。

一种解决方法是使用计算元素构造函数:

element Q{http://www.example.org}foo {    
    element Q{http://www.example.org}bar1 {$doc/a/b/c/text()}
}

我同意,它不漂亮。

XSLT 2.0 为输入和输出提供了单独的默认 namespace ,从而正确地实现了这一点。我记得我试图说服 XQuery WG 需要这样做,但失败了。

关于xml - XQuery:省略不包含 namespace 的源文档的 namespace ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44238090/

相关文章:

namespaces - 设置 ReSharper 将 'using' 导入放在命名空间之外

javascript - 在 Javascript 中将 "This"放入命名空间

asp.net - VB.NET 检查带有 ID 的 XML 节点是否存在

javascript - 如何使用 Javascript 在浏览器中解析非 UTF8 XML?

java xpath 无效 xpath 错误

xml - 如何将以下标签中的所有文本项收集到名称为键,年份为值的字典中?

c# - ASP.net 核心命名空间不同步

xml - 在 Oracle 数据库中存储 XML 的最佳列是什么?

java - XML 缩进并且没有独立的

javascript - 如何从 Xpath 中的 javascript 事件处理程序获取链接?