Xquery 如何在marklogic中列出目录中所有文档的所有URI
您好,我如何检索目录中所有文档的URI。我创建下面的xquery来实现这一点,但这没有帮助Xquery 如何在marklogic中列出目录中所有文档的所有URI,xquery,marklogic,Xquery,Marklogic,您好,我如何检索目录中所有文档的URI。我创建下面的xquery来实现这一点,但这没有帮助 for $i in xdmp:directory("/Test/performance/results/","infinity") let $k := document-uri(fn:doc($i)) return <li>{$k}</li> xdmp:directory(“/Test/performance/results/”,“infinity”)中$i的 设$k:=文档ur
for $i in xdmp:directory("/Test/performance/results/","infinity")
let $k := document-uri(fn:doc($i))
return <li>{$k}</li>
xdmp:directory(“/Test/performance/results/”,“infinity”)中$i的
设$k:=文档uri(fn:doc($i))
返回{$k}
那么:
xdmp:directory("/Test/performance/results/","infinity") !
<li>{fn:document-uri(.)}</li>
xdmp:directory(“/Test/performance/results/”,“infinity”)!
{fn:文档uri(.)}
XQuery不正确,因为$i已经是文档而不是URI
所以运行fn:doc($i)是行不通的
Adam的解决方案将起作用(使深度变深),但可能会非常缓慢,因为它需要
获取每个文档。在大型数据库上,速度非常慢
如果启用URI词典,则可以做得更好。
以下是xmlsh marklogic“ls”命令的源代码。。。嵌入其中的是相当简单的XQuery
相关代码:
xquery version "1.0-ml";
declare variable $root external;
for $p in fn:distinct-values(
for $d in cts:uris($root,"document",
if( $root eq "" ) then () else cts:directory-query($root,"infinity"))
let $p := substring-after( $d , $root )
where $d ne $root
return
if( contains($p,"/") ) then fn:concat($root , substring-before( $p , "/" ) , "/" )
else
concat($root ,$p)
)
where $p eq "" or $p ne $root
return $p
这仅列出使用uri词典的目录的直接子目录
这个程序有点复杂-它尝试使用uri词典,但如果失败,将恢复到xdmp:目录。。。它根据-r标志列出直接或递归
为了提高效率,您应该使用URI词典
cts:uris((), (), cts:directory-query("/Test/performance/results/","infinity"))
有关文档,请参阅。SMO的良好使用。或者
xdmp:directory(“/Test/performance/results/”,“infinity”)/document uri(.)/element li{.}
也应该可以。当然可以,但我个人认为SMO(简单映射操作符)方法更具可读性。它真的需要获取每个文档吗?我更希望ML能够足够聪明地优化这一点。