【问题标题】:XQuery: omit namespaces for source documents containing no namespacesXQuery:省略不包含名称空间的源文档的名称空间
【发布时间】:2017-05-29 08:40:10
【问题描述】:

我想使用 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>

这会生成以下内容 (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 表达式中不使用命名空间。不幸的是,这似乎不起作用。相反,我必须使用第二条规则 (bar2) 中更费力的语法。

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

有没有人知道如何实现所需的行为?非常感谢您!

【问题讨论】:

    标签: xml xpath namespaces xquery


    【解决方案1】:

    不幸的是,在 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 相信这是必要的,但失败了。

    【讨论】:

    • 我同意将输入和输出分开的默认名称空间对解决这个问题有很大的好处(并使 XQuery 更加明确和可读性更好)。由于这不可用,我将在 XPath 表达式中使用通配符(例如 $doc/*:a/*:b/*:c/text())
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-12-30
    • 1970-01-01
    • 1970-01-01
    • 2012-07-01
    • 2016-11-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多