编辑
我想将相关函数组合在一起以表明它们是相关的。
如果我有 local:f1()
和 local:f2()
那么我可以将它们的名称更改为 local:menu-f1()
和 local:menu-f2()
但是 XQuery 语言中是否有一种机制可以对相关函数进行分组?
操作
我非常兴奋地发现 XQuery 函数可以在 local:
以外的命名空间中声明。我在哪里可以找到有关其工作原理的信息?
始终以这种方式声明函数;
declare function local:foo() {
3+4
};
..并以这种方式使用它们;
local:foo()
..我发现它们可以这样声明;
declare namespace baz = "fred:bloggs";
declare function baz:foo() {
3+4
};
..像这样使用;
baz:foo()
但我只能分别找到有关声明命名空间
和声明函数
的类似引用的信息,而不是有关 XQuery 函数命名空间一般如何工作的类似教程的信息。
有 XQuery 函数命名空间的新手指南吗?
我正在使用 Saxon 处理器 - XQuery 1.0。
最佳答案
您可能使用的是普通的 XQuery 命名空间 - 您可能正在寻找的是模块。您可以将一堆函数放入其自己的模块命名空间中,如下所示:
module namespace foo = "http://www.myurl.com/foo";
declare function foo:bar($args as item()*) as item()* {
() (: do something cool :)
};
之后,您可以在主查询中导入模块并调用函数:
import module namespace foo = "http://www.myurl.com/foo";
foo:bar(<my-element/>)
问题是,处理器如何找到查询还没有标准化。而且我不知道 Saxon 如何实现模块解析机制(您应该查看文档和/或写入 Saxon 邮件列表)。
但是大多数 XQuery 处理器都会查看由相对于查询位置的“at”子句给出的路径。因此,要拥有适用于大多数实现的东西:例如,您可以将模块存储在名为 foo.xq 的文件中,并将其放入与主查询相同的目录中,然后对于模块导入,您将编写:
import module namespace foo = "http://www.myurl.com/foo" at "foo.xq";
它向 XQuery 引擎提供了一个提示,它应该在哪里查找模块。
您可以在 http://www.xquery.me/ 找到一些(目前不是很多)有关此内容的文档。 - 希望这有帮助。
编辑
好的,我明白了,您只想对函数进行分组。为此,您已经了解了需要了解的所有内容。但我仍然想强调,将查询拆分为模块可能是适合您的用例的更好解决方案(它只是在某种程度上更好,因为您有更多的模块化性,并且在即将推出的 XQuery 3.0 建议中,您甚至可以将诸如私有(private)函数和变量之类的东西)。但是如果你的查询没有变大,你的解决方案当然也可以。 您可以像考虑 C++ 中的命名空间一样来考虑 XML 命名空间。在 XQuery 中,函数、元素、集合、变量、属性等可以位于自己的命名空间中(同样 - 就像在 C++ 中一样)。有一些隐式定义的命名空间,例如 xs(XML 模式命名空间,您可以在其中找到 bool 值、整数等数据类型)、local(可以在其中放入函数的命名空间,这样您就不必在主查询)、fn(其中定义了“XQuery 1.0 和 XPath 2.0 函数和运算符”建议中的所有函数)。但这个函数的前缀只是一个别名——你可以使用任何你想要的。 假设您的查询的序言中有以下代码:
declare namespace blubb = "http://www.w3.org/2001/XMLSchema";
blubb:integer 与 xs:integer 的类型完全相同 - 这同样适用于函数:
declare namespace l = "http://www.w3.org/2005/xquery-local-functions";
声明您可以使用“l”前缀访问本地命名空间中的每个函数(如果 local:bar() 存在,则 l:bar() )。
如果您不键入前缀,XQuery 假定该函数位于“fn” namespace 中。这就是为什么机器人
fn:concat("Hello ", "World!")
和
concat("Hello ", "World!")
是等价的。您可以更改此行为。您可以将此行包含到序言中:
declare default function namespace "http://www.w3.org/2005/xquery-local-functions";
这将告诉 XQuery 处理器您不想为本地函数添加前缀(因此 bar() 相当于 local:bar())。
我不确定我是否回答了您的问题,或者至少能够澄清一些问题。我不知道这方面的教程(因为一开始它有点令人困惑,但最终您意识到没有太多可说的,因为这些机制比它们一开始看起来要简单得多)。我经常查找内容的文档是 http://www.w3.org/TR/xquery/ 上的推荐。
如果这对您没有帮助,请尝试获得资格,我可以再次尝试并提供解释。
关于function - XQuery 函数命名空间如何工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6480876/