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

时间:2016-01-27 15:43:24

标签: marklogic

我正在编写需要传递绝对路径作为参数的xquery脚本,如果我把项目放在端口root上,这个脚本将完美地运行,但如果我将它转移到子目录v2,v3 ......它将不会工作。

如果项目根目录中的被调用函数,

相对路径将完美工作,但我的被调用函数是像搜索:Mark一样的Marklogic库。所以我必须通过它的绝对路径。

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

我在以下链接中找到了一个名为“文件模块”的模块库:

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

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

示例:

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

这是我的选择的快照。这部分将custom-constrains文件的绝对路径传递给search:search。现在,如果我将项目放在weberver端口根目录www.test.com:8050上,那么每件事情都可以正常工作,但如果我将项目移到子目录www.test.com:8050/v1中,则选项中的链接应为/ V1 / UTILITES /定制constrains.xqy

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

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

3 个答案:

答案 0 :(得分:3)

我强烈建议不要在文件系统中工作(在群集上,你必须在每台服务器上部署),并考虑数据库uris。此外,如果请求来自app-server,您可以利用xdmp:get-request-path()来获取您所在位置的上下文。

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

HTH!

答案 1 :(得分:3)

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

粘土

答案 2 :(得分:1)

这里的问题是,尽管您可以使用相对路径,但它与/Modules/Marklogic/appservices/search中执行该Search API扩展的代码相关。

有关路径解析的更多说明,请查看Application Developer's Guide,其中详细介绍了它,但声明它将会显示:

  1. 在Modules目录中。
  2. 在相对于调用模块的目录中。
  3. 在App Server根目录下,该目录是模块数据库中的指定目录(当App Server设置为模块数据库时)或文件系统上的指定目录(当App Server设置为查找模块中的模块时)文件系统)。
  4. 由于选项#2已经用完,其他两个中的任何一个都应该有效。

    1. 将模块移动到App Server根目录或根目录下的路径。
    2. 将模块移动到/Modules目录或该根目录下的路径。
    3. 我同意@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 ...