XQuery:如何使用计算命名空间构造函数设置默认命名空间?

ARX*_*ARX 1 xquery saxon basex

使用直接元素构造函数设置默认命名空间非常简单.例如:

<map xmlns="http://www.w3.org/2013/XSL/json"/>
Run Code Online (Sandbox Code Playgroud)

如上所述,上述直接构造函数输出完全相同的元素.但是,如果我尝试对计算元素和命名空间构造函数执行相同操作,那么我运气不好:

element {"map"} {
  namespace {""} { "http://www.w3.org/2013/XSL/json" }
}
Run Code Online (Sandbox Code Playgroud)

以上内容Duplicate namespace declaration: ''在BaseX 8.2中引发错误; 和XTDE0440: Cannot output a namespace node for the default namespace when the element is in no namespaceSaxon-HE 9.6中的一个.

如果我传递前缀,没有问题.以下效果很好:

element {"map"} {
  namespace { "e" } {"http://www.w3.org/2013/XSL/json"}
}
Run Code Online (Sandbox Code Playgroud)

在上述情况下,BaseX和Saxon都没有抱怨.但我想将命名空间设置为默认命名空间.

关于计算机命名空间构造函数,XQuery 3.0规范:

如果构造函数指定了PrefixExpr,则前缀表达式的计算方法如下:

湾 如果结果是空序列或零长度xs:string或xs:untypedAtomic值,则新命名空间节点没有名称(此类命名空间节点表示默认命名空间的绑定).

该规范还提供了"具有空前缀的计算命名空间构造函数"的类似示例:

namespace { "" } {"http://a.example.com" }
Run Code Online (Sandbox Code Playgroud)

为什么然后,错误消息?显然,计算的命名空间构造函数尝试重新声明已由计算元素构造函数声明的命名空间.另一方面,直接构造函数将直接初始化元素的命名空间到我的选择.但这只是我的猜测.我唯一确定的是我的困惑.

在任何情况下,有没有办法用计算构造函数获得与直接构造函数相同的结果?

Mic*_*Kay 5

基本原因是元素的名称(即名称的前缀,本地和uri部分)由元素构造函数本身确定,而不是由添加到元素的动态内容确定.

当你这样做:

element {"map"} {
  namespace {""} { "http://www.w3.org/2013/XSL/json" }
}
Run Code Online (Sandbox Code Playgroud)

您正在创建一个没有前缀且没有命名空间的元素,然后您将为它提供一个命名空间节点,该节点将默认命名空间绑定到"无命名空间"之外的其他内容.你不可能两种方式.动态添加命名空间到元素的内容永远不会更改元素名称.