是否可以从外部变量动态声明默认名称空间?

Is it possible to dynamically declare a default namespace from an external variable?

对于我执行的所有 XQuery 查询,我定义了一个默认元素命名空间,如下所示:

declare default element namespace 'http://example.com';
(: rest of the query :)

但是硬编码这个命名空间有点麻烦。我可以从外部变量动态定义默认命名空间吗?

它尝试过:

declare default element namespace $namespace;
(: error: Expecting quote, found '$'. :)

.. 和:

declare variable $namespace external;
declare default element namespace $namespace;
(: error: Default declarations must be declared first. :)

...但不幸的是,它们不起作用。


顺便说一下,我目前使用的是 BaseX 7.7.2。

不幸的是,只能静态声明默认命名空间,因为语法只允许在这个地方使用 URILiteral。默认元素命名空间在查询的静态上下文中。

但是,您可以使用动态包含名称空间的变量(从变量)构建 QName。您可以使用计算元素构造函数使用此类 QName 构建新元素。然而,XPath 导航会更加复杂,因为您必须显式过滤命名空间。

通常假设如果您静态地知道源文档中元素的本地名称,那么您也会静态地知道它们的命名空间。这个假设并不总是正确的;您有时会遇到使用相同本地名称的一系列命名空间(例如,不同版本的命名空间);但是 XQuery(和 XSLT)并没有很好地设计来处理这种情况。

因此,如果您静态地知道元素的名称,并使用像 invoice/customer/address 这样的路径表达式,那么此路径中的名称只是完整扩展名称的 shorthand,并且假定shorthand 可以由编译器解析。这就是命名空间声明全部静态固定的原因。

如果您不知道要静态查询的元素的名称,那么您可能正在编写一个使用通配符(例如 child::*)的查询,而不是像 "invoice" 这样的显式本地名称.在这种情况下,默认命名空间声明永远不会发挥作用。

所以我能看到您遇到麻烦的唯一情况是上面的多个名称空间使用相似的本地名称集的情况。出于这个原因,大多数人建议不要以这种方式使用命名空间,但不幸的是,并不是每个人都听从了这个建议。