首页 文章

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

提问于
浏览
1

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

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

Source document

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

XQuery file

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)中那样构造元素,i . 即不在XPath表达式中使用名称空间 . 不幸的是,这似乎不起作用 . 相反,我必须像第二条规则(bar2)那样使用更费力的语法 .

一个变通方法(好吧,而不是黑客)将在引入名称空间之前声明变量(参见第3条),但我怀疑这是否是一个好主意a)它可能无法扩展到更大的文档和b)它防止声明默认元素名称空间"properly",i . 即正如XQuery通过文档头中的单独声明所预期的那样 .

有谁知道如何实现理想的行为?非常感谢你提前!

1 回答

  • 2

    不幸的是,在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这是必要的,并且失败了 .

相关问题