您可能使用的是普通的 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/>)
问题是,它不是标准化的,处理器必须如何找到查询。而且我不知道撒克逊如何实现模块解析机制(您应该查看文档和/或写信给撒克逊邮件列表)。
但是大多数 XQuery 处理器会查看“at”子句给出的相对于查询位置的路径。因此,要拥有适用于大多数实现的东西:例如,您可以将模块存储在名为 foo.xq 的文件中,并将其放置在与主查询相同的目录中,然后对于模块导入,您将编写:
import module namespace foo = "http://www.myurl.com/foo" at "foo.xq";
它提示 XQuery 引擎应该在哪里寻找模块。
您可以在http://www.xquery.me/找到一些(目前不是很多)关于这些东西的文档- 希望这会有所帮助。
编辑
好的,我明白了,您只想对功能进行分组。为此,您已经弄清楚了您需要知道的一切。但我仍然想强调,将您的查询拆分为模块可能是您的用例的更好解决方案(它只是在某种程度上更好,因为您有更多的模块化,并且在即将发布的 XQuery 3.0 推荐中,您甚至可以将里面的私有函数和变量之类的东西)。但是,如果您的查询没有变大,您的解决方案当然也可以。您可以像考虑 C++ 中的命名空间一样考虑 XML 命名空间。在 XQuery 中,函数、元素、集合、变量、属性等可以在自己的名称空间中(再次 - 就像在 C++ 中一样)。有一些隐含定义的命名空间,如 xs(XML Schema 命名空间,您可以在其中找到布尔值等数据类型,整数等),本地(您可以在其中放入函数的名称空间,这样您就不必在主查询中定义自己的名称空间),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”名称空间中。这就是为什么机器人
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/上的推荐
如果这对您没有帮助,请尝试获得资格,我可以再次尝试解释..