Xml XQuery:省略不包含名称空间的源文档的名称空间

Xml XQuery:省略不包含名称空间的源文档的名称空间,xml,xpath,namespaces,xquery,Xml,Xpath,Namespaces,Xquery,我想使用XQuery在两个XML文档之间进行映射。虽然源文档不包含任何名称空间声明,但目标文档需要一个目标名称空间(根据处理它的系统,必须是默认名称空间)。我知道XQuery总是需要一个名称空间(XQuery中的所有内容都在一个名称空间中)。然而,我希望如此简化我的XQuery的XPath表达式,尤其希望尽可能省略名称空间 以下示例说明了这种情况: 源文档 <?xml version="1.0" encoding="UTF-8"?> <!-- note that this do

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

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

源文档

<?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>
xquery版本“1.0”;
声明变量$doc:=。;
设$abc:=$doc/a/b/c
返回
{$doc/a/b/c/text()}
{$doc/*:a/*:b/*:c/text()}
{$abc/text()}
这将生成以下内容(Saxon HE 9.5.1.3):


基础知识
基础知识
基本上,我希望能够像第一条规则(bar1)中那样构造元素,即。E在XPath表达式中不使用名称空间。不幸的是,这似乎不起作用。相反,我必须使用第二条规则(bar2)中更为复杂的语法

一种解决方法(好的,更像是一种黑客)是在引入名称空间之前声明变量(参见bar3),但我怀疑这是否是一个好主意 a) 它可能无法扩展到更大的文档和 b) 它阻止“正确地”声明默认元素名称空间,即。E按照XQuery的预期,通过文档标题中的单独声明


有没有人知道如何实现期望的行为?提前非常感谢

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

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

element Q{http://www.example.org}foo {    
    element Q{http://www.example.org}bar1 {$doc/a/b/c/text()}
}
我同意,这并不漂亮


XSLT2.0正确地实现了这一点,为输入和输出提供了单独的默认名称空间。我记得我试图说服XQuery工作组这是必要的,但失败了。

我同意,为输入和输出单独设置默认名称空间将对解决这个问题有很大好处(并使XQuery更加明确和可读性更好)。由于这不可用,我将在XPath表达式中使用通配符(例如$doc/*:a/*:b/*:c/text())
element Q{http://www.example.org}foo {    
    element Q{http://www.example.org}bar1 {$doc/a/b/c/text()}
}