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

问题描述:

我想使用XQuery来映射两个XML文档。尽管源文档不包含任何名称空间声明,但目标文档需要一个目标名称空间(根据处理它的系统,它必须是默认名称空间)。我知道XQuery总是需要一个命名空间(并且XQuery中的所有内容都在命名空间中)。不过,我想简化我的XQuery的XPath表达式,特别是想尽可能省略名称空间。XQuery:为不包含名称空间的源文档省略名称空间

下面的示例示出了情况:

源文件

<?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> 

这会产生以下的(撒克逊-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)那样构造元素,即i。即而不使用XPath表达式中的名称空间。不幸的是,似乎没有工作。相反,我必须使用第二条规则(bar2)中更费力的语法。

一种解决方法(当然,而是黑客攻击)是引入的命名空间(见BAR3)之前已经宣布变量,但我怀疑这是否是一个好主意,因为 一)它可能无法扩展对于较大的文档和 b)它阻止声明默认元素名称空间“正确”,即。即正如XQuery通过文档头中的单独声明所预期的那样。

有没有人有一个想法如何实现所需的行为?非常感谢您提前!

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

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

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

我同意,这不是漂亮。

XSLT 2.0使用单独的默认命名空间输入和输出了这一个。我记得试图说服XQuery WG这是需要的,并且失败了。

+1

我同意,输入和输出的单独默认名称空间对于这个问题会有很大的好处(并且使XQuery更加明确和更好的可读性)。由于这是不可用的,我将在XPath表达式中使用通配符(例如$ doc/*:a/*:b/*:c/text()) –