2016-04-29 11 views
3

我想从递归一个特定的点列出所有类别:如何列出集合/资源recursivelly 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/') 

这没有返回值(没有错误,没有结果)。我受this article的启发,并认为它是递归设置权限等的一个很好的起点。

回答

4

请参阅函数在Wolfgang Meier的文章higher order functions with XQuery在eXist-db 2.0+中。这篇文章总的来说非常有启发性。这几天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.699s中返回了4125个集合名称。

+1

谢谢你的回答,我忘了它。然而,在xquery中使用HoF是相当先进的,但它可能有些复杂。 – DiZzZz

4

您的查询确实递归查找集合,但没有输出。我会建议做类似

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') 

但肯定乔的建议是更清洁。

+0

谢谢,实际上,我喜欢这两种解决方案!乔的一个可能更优雅,但我需要了解它发生了什么。这是基于更谦虚的逻辑,对我来说很明显。 –

+0

只是一个说明:我不知道为什么,但似乎这个函数实际上并没有列出树中的所有东西。它似乎只返回一些更深的分支。在eXide中彻底测试它是非常困难的(它只允许我返回10个项目)。 –

+0

其实,这个返回14个项目,其他31个项目(这似乎是真的)。这个有一些小故障。它似乎停止列出当前父集合,如果**有**孩子。 –