3

编辑

我想将相关功能组合在一起以表明它们是相关的。

如果我有local:f1()local:f2()然后我可以将它们的名称更改为local:menu-f1()local:menu-f2()但是 XQuery 语言中是否有一种机制来对相关函数进行分组?

OP

我很高兴地发现 XQuery 函数可以在除local:. 我在哪里可以找到有关其工作原理的信息?

总是以这种方式声明函数;

declare function local:foo() {
   3+4
};

..并以这种方式使用它们;

local:foo()

..我发现它们可以这样声明;

declare namespace baz = "fred:bloggs";
declare function baz:foo() {
   3+4
};

..并像这样使用;

baz:foo()

但是我只能找到关于declare namespacedeclare function单独的参考类信息,而不是关于 XQuery 函数名称空间一般如何工作的类似教程的信息。

是否有 XQuery 函数名称空间的新手指南?

我正在使用 Saxon 处理器 - XQuery 1.0。

4

1 回答 1

6

您可能使用的是普通的 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/上的推荐

如果这对您没有帮助,请尝试获得资格,我可以再次尝试解释..

于 2011-06-26T05:22:15.323 回答