XQuery函数名称空间如何工作?

Nig*_*ton 3 xquery namespaces saxon function

编辑

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

如果我有local:f1(),local:f2()然后我可以更改他们的名称local:menu-f1(),local:menu-f2()但是XQuery语言中是否有一个机制来分组相关的功能?

OP

我很高兴地发现XQuery函数可以在除了之外的命名空间中声明local:.我在哪里可以找到有关其工作原理的信息?

总是以这种方式宣布功能;

declare function local:foo() {
   3+4
};
Run Code Online (Sandbox Code Playgroud)

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

local:foo()
Run Code Online (Sandbox Code Playgroud)

..我发现他们可以像这样宣布;

declare namespace baz = "fred:bloggs";
declare function baz:foo() {
   3+4
};
Run Code Online (Sandbox Code Playgroud)

..并像这样使用;

baz:foo()
Run Code Online (Sandbox Code Playgroud)

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

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

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

Mar*_*man 6

你可能正在使用的是普通的XQuery命名空间 - 你可能正在寻找的是模块.你可以将一堆函数放在它自己的模块命名空间中,如下所示:

module namespace foo = "http://www.myurl.com/foo";

declare function foo:bar($args as item()*) as item()* {
  () (: do something cool :)
};
Run Code Online (Sandbox Code Playgroud)

之后您可以在主查询中导入模块并调用该函数:

import module namespace foo = "http://www.myurl.com/foo";

foo:bar(<my-element/>)
Run Code Online (Sandbox Code Playgroud)

问题是,它没有标准化,处理器必须如何查找查询.我不知道Saxon如何实现模块解析机制(您应该查看文档和/或写入Saxon邮件列表).

但是大多数XQuery处理器都会查看相对于查询位置的"at"子句给出的路径.所以要有一些应该适用于大多数实现的东西:例如,您可以将模块存储在名为foo.xq的文件中,并将其放在与主查询相同的目录中,然后对于模块导入,您将编写:

import module namespace foo = "http://www.myurl.com/foo" at "foo.xq";
Run Code Online (Sandbox Code Playgroud)

它提示XQuery引擎应该在哪里寻找模块.

你可以在http://www.xquery.me/找到一些关于这个东西的文档(目前不是很多)- 希望这会有所帮助.

编辑

好的,我看,你只想分组你的功能.要做到这一点,你已经找到了你需要知道的一切.但我仍然想强调,将你的查询分解为模块可能是更好的解决方案用于你的用例(它只是在某种程度上更好,因为你有更多的模块化,在即将到来的XQuery 3.0推荐中,你甚至可以放置像私人函数和变量那样的东西).但是,如果您的查询不是很大,那么您的解决方案当然也可以.您可以像考虑C++中的命名空间一样考虑XML命名空间.在XQuery中,函数,元素,集合,变量,属性等可以在自己的命名空间中(再次 - 就像在C++中一样).有一些隐含定义的命名空间,比如xs(XML Schema命名空间,你可以在其中找到数据类型,如boolean,integer等),local(一个命名空间,你可以放入函数,这样你就不必在一个命名空间中定义自己的命名空间)主要查询),fn(其中定义了"XQuery 1.0和XPath 2.0函数和运算符"建议中的所有函数).但是这个函数的前缀只是一个别名 - 你可以使用你想要的任何东西.因此,假设您在查询的序言中包含以下代码:

declare namespace blubb = "http://www.w3.org/2001/XMLSchema";
Run Code Online (Sandbox Code Playgroud)

blubb:整数与xs完全相同的类型:整数 - 同样适用于函数:

declare namespace l = "http://www.w3.org/2005/xquery-local-functions";
Run Code Online (Sandbox Code Playgroud)

声明可以使用"l"前缀访问本地命名空间中的每个函数(如果local:bar()存在,则l:bar()).

如果您不键入前缀,XQuery假定此函数位于"fn"命名空间中.这就是机器人的原因

fn:concat("Hello ", "World!")
Run Code Online (Sandbox Code Playgroud)

concat("Hello ", "World!")
Run Code Online (Sandbox Code Playgroud)

是等价的.您可以更改此行为.您可以将此行包含在序言中:

declare default function namespace "http://www.w3.org/2005/xquery-local-functions";
Run Code Online (Sandbox Code Playgroud)

这将告诉XQuery处理器你不想为本地函数添加前缀(因此bar()将等同于local:bar()).

我不确定我是否回答了你的问题,或者至少能够提出一些清晰的问题.我不知道有关于这方面的教程(因为在开始时它有点令人困惑,但最终你意识到没有太多可说的,因为机制比它们首先看起来要简单得多).我总是查找内容的文件是http://www.w3.org/TR/xquery/上的建议.

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