function - XQuery 函数命名空间如何工作?

标签 function namespaces xquery saxon

编辑

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

如果我有 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/

相关文章:

c - libxml : building a DOM tree from a xmlTextReaderPtr , 处理命名空间

php - 升级到 Laravel 5 后的命名空间问题

count - XQuery:如何计算一个元素为空或不存在?

javascript - 将值作为函数参数传递给匿名函数

javascript - 输入中仅允许数字和 "K"字符

javascript - 更改 Kendo UI 中的语言

xquery - 如何将 xml 中的项目转换为 xdmp :function?

python 2.7.11 :Why does a function call work for one function but not for another?

docker - 从特权容器输入主机命名空间

java - XQuery 使用 Saxon 9-HE 执行 Java 函数