如何在 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,其中有更多详细信息,但声明它将看起来:
- 在模块目录中。
- 在相对于调用模块的目录中。
- App Server根目录下,可以是Modules数据库中的指定目录(当App Server设置为Modules数据库时),也可以是文件系统中的指定目录(当App Server设置为查找模块时)在文件系统中)。
由于选项 #2 不适用,因此其他两个中的任何一个都应该有效。
- 将模块移动到 App Server 根目录,或根目录下的路径。
- 将模块移动到
/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 可能对您的尝试有用。
黏土
我正在编写需要传递绝对路径作为参数的 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,其中有更多详细信息,但声明它将看起来:
- 在模块目录中。
- 在相对于调用模块的目录中。
- App Server根目录下,可以是Modules数据库中的指定目录(当App Server设置为Modules数据库时),也可以是文件系统中的指定目录(当App Server设置为查找模块时)在文件系统中)。
由于选项 #2 不适用,因此其他两个中的任何一个都应该有效。
- 将模块移动到 App Server 根目录,或根目录下的路径。
- 将模块移动到
/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 可能对您的尝试有用。
黏土