【发布时间】: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