如何在 XQuery 中递归地列出 collections/resources
How to list collections/resources recursivelly in XQuery
我想递归地列出特定点的所有集合:
declare function local:list-collections($collection as xs:string) {
for $child in xmldb:get-child-collections($collection)
return
local:list-collections(concat($collection, '/', $child))
};
local:list-collections('/db/apps/tested-bunny/data/')
这个returns什么都没有(没有错误,没有结果)。我受到 this article 的启发,并将其视为递归设置权限等的良好起点。
请参阅 Wolfgang Meier 关于 eXist-db 2.0+ 中 higher order functions with XQuery 的文章中的 dbutil:scan-*()
函数。总的来说,这篇文章是非常有指导意义的文章。现在,dbutil
模块在默认随 eXist 安装的 shared-resources
包中可用,因此您可以按如下方式使用它:
xquery version "3.0";
import module namespace dbutil="http://exist-db.org/xquery/dbutil"
at "/db/apps/shared-resources/content/dbutils.xql";
dbutil:scan-collections(
xs:anyURI('/db'),
function($collection) { $collection }
)
这些功能表现良好。我只是 运行 在 eXide 中执行此操作,查询在 0.699 秒内返回了 4125 个集合名称。
您的查询确实以递归方式查找集合,但没有输出。我建议做一些像
declare function local:list-collections($collection as xs:string) {
for $child in xmldb:get-child-collections($collection)
let $childCollection := concat($collection, '/', $child)
return
(local:list-collections($childCollection), $childCollection)
};
local:list-collections('/db/apps/fundocs')
但可以肯定的是,Joe 的建议更简洁。
我想递归地列出特定点的所有集合:
declare function local:list-collections($collection as xs:string) {
for $child in xmldb:get-child-collections($collection)
return
local:list-collections(concat($collection, '/', $child))
};
local:list-collections('/db/apps/tested-bunny/data/')
这个returns什么都没有(没有错误,没有结果)。我受到 this article 的启发,并将其视为递归设置权限等的良好起点。
请参阅 Wolfgang Meier 关于 eXist-db 2.0+ 中 higher order functions with XQuery 的文章中的 dbutil:scan-*()
函数。总的来说,这篇文章是非常有指导意义的文章。现在,dbutil
模块在默认随 eXist 安装的 shared-resources
包中可用,因此您可以按如下方式使用它:
xquery version "3.0";
import module namespace dbutil="http://exist-db.org/xquery/dbutil"
at "/db/apps/shared-resources/content/dbutils.xql";
dbutil:scan-collections(
xs:anyURI('/db'),
function($collection) { $collection }
)
这些功能表现良好。我只是 运行 在 eXide 中执行此操作,查询在 0.699 秒内返回了 4125 个集合名称。
您的查询确实以递归方式查找集合,但没有输出。我建议做一些像
declare function local:list-collections($collection as xs:string) {
for $child in xmldb:get-child-collections($collection)
let $childCollection := concat($collection, '/', $child)
return
(local:list-collections($childCollection), $childCollection)
};
local:list-collections('/db/apps/fundocs')
但可以肯定的是,Joe 的建议更简洁。