如何在 Xquery 中获取当前工作目录?

How to get the current working directory in Xquery?

我正在编写需要传递绝对路径作为参数的 xquery 脚本,如果我将项目放在端口根目录下,此脚本将完美运行,但如果我将其移动到子目录 v2、v3 ...不管用。

如果调用函数在项目根目录中,相对路径将完美运行,但我调用的函数是 Marklogic 库之一,如 search:search。所以我必须将绝对路径传递给它。

这种状态使我的代码不那么动态,而解决方案是找到一个给我当前工作目录的函数,这样我就可以动态构建绝对路径。

在下面link找到了一个叫"file module"的模块库:

http://expath.org/spec/file#pr.current-dir

Marklogic 中是否有任何功能可以帮助我解决这个问题,或者他们是否支持这个库?。如果这些选项中的 none 可用,除了定义全局变量来处理绝对路径的变化之外,任何人都可以给我解决方案吗?

示例:

<constraint name="Title">
            <custom facet="true">
                <parse apply="parse-facet-thesourous"
                       ns="......"
                       at="/utilites/custom-constrains.xqy"/>
                    .....
            </custom>
</constraint> 

这是我的选项的快照。这部分将自定义约束文件的绝对路径传递给 search:search。现在,如果我将项目放在 weberver 端口根目录 www.test.com:8050 上,一切都会正常进行,但是如果我将项目移动到子目录 www.test.com:8050/v1 中的 link选项应该是 /v1/utilites/custom-constrains.xqy

另一方面,使路径成为相对路径是无用的,因为该路径将传递给外部 marklogic 模块。

但如果我能以某种方式获得当前工作目录的绝对路径或当前 运行 脚本的 uri,那么我就可以动态构建绝对路径

这里的问题是,虽然您可以使用相对路径,但它将相对于在 /Modules/Marklogic/appservices/search 中执行搜索 API 扩展的代码。

有关路径解析的更多说明,请查看 Application Developer's Guide,其中有更多详细信息,但声明它将看起来:

  1. 在模块目录中。
  2. 在相对于调用模块的目录中。
  3. App Server根目录下,可以是Modules数据库中的指定目录(当App Server设置为Modules数据库时),也可以是文件系统中的指定目录(当App Server设置为查找模块时)在文件系统中)。

由于选项 #2 不适用,因此其他两个中的任何一个都应该有效。

  1. 将模块移动到 App Server 根目录,或根目录下的路径。
  2. 将模块移动到 /Modules 目录,或该根目录下的路径。

我同意 @grtjn,这几乎在所有情况下都是一个坏主意,但如果您绝对必须检查文件系统,那么您唯一的选择是 xdmp:filesystem-file-exists。这不会为您提供当前文件系统路径,但您可以使用它来检查可能的已知路径:

let $location :=
  if (xdmp:filesystem-file-exists('/utilites/custom-constrains.xqy'))
  then '/utilites/custom-constrains.xqy'
  else if (xdmp:filesystem-file-exists('v1/utilites/custom-constrains.xqy'))
  then ...
  else ...

我强烈建议不要从 file-system 开始工作(在集群上,您必须在每台服务器上部署),而是考虑数据库 uris。此外,如果请求来自 app-server,您可以利用 xdmp:get-request-path() 来获取您 'are'.

所在位置的一些上下文

我也不建议根据请求输入动态创建搜索选项,这有代码注入的风险。灵活性是一回事,安全性又是另一回事..

HTH!

我相信 xdmp:function-module 可能对您的尝试有用。

黏土