【问题标题】:where to declare xquery functions?在哪里声明 xquery 函数?
【发布时间】:2013-01-08 07:00:02
【问题描述】:

让我们来看看我能想到的用 xquery 写的最简单的函数:

declare function local:identityFunction($v as xs:integer) 
{
  return ($v)
}; 

在哪里申报?

我正在尝试exist-db 和basex,但是如果我在查询处理器窗口中编写它,它们会给我一些错误(尽管正常的xqueries 可以工作)。

例如 basex 抱怨以下消息:“期望表达式”。

【问题讨论】:

    标签: xml xquery basex exist-db


    【解决方案1】:

    您可以在普通表达式之前插入它们。

    你的错误是使用'return',这既不需要也不允许,因为xquery函数总是返回最后一个(也是唯一的)值。

    分号后面应该跟另一个表达式。

    因此这将起作用:

    declare function local:identityFunction($v as xs:integer) 
    {
      $v
    };     
    local:identityFunction(17)
    

    【讨论】:

    • 非常感谢。我知道这是一个简单的问题。请问xml数据库是如何管理这些功能的?在关系数据库中,您可以存储它们。在这种情况下也一样吗?
    • 我实际上对数据库一无所知。但是在独立的 xquery 中,您可以将它们保留在表达式中,也可以将它们放入模块中。
    • 好的,谢谢。对于模块,您的意思是包含所有这些声明的简单文本文件?
    • 有点复杂。你开始,例如module namespace test = "pseudo://test-module"; 并调用所有函数test:functionname,然后您可以使用import module "pseudo://test-module"; 加载所有这些函数。 (它实际上如何找到具有函数的文件取决于实现)
    • 在 eXist-db 中,您可以将模块存储为 .xq 文件,然后通过浏览器调用它们。例如,您可以将 my-module.xq 存储在 /db/apps/my-app/my-module.xq 中,然后您可以通过访问 localhost:8080/exist/apps/my-app/my-module.xq 来执行此查询。有几种方法可以将文件上传到 eXist-db。见demo.exist-db.org/exist/apps/doc/uploading-files.xml