如何在 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 的建议更简洁。