2016-04-29 4 views
3

ich alle Sammlungen rekursiv von einem bestimmten Punkt zur Liste mag:Wie zur Liste Sammlungen/Ressourcen 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/') 

Das gibt nichts (keine Fehler, keine Ergebnisse). Ich bin inspiriert von this article und halte es für einen guten Ausgangspunkt für die rekursive Einstellung von Berechtigungen und so weiter.

Antwort

4

Siehe die dbutil:scan-*() Funktionen in Wolfgang Meier's Artikel auf higher order functions with XQuery in eXist-db 2.0 +. Der Artikel ist im Allgemeinen ein sehr lehrreicher Artikel. In diesen Tagen die dbutil Modul ist in dem shared-resources-Paket zur Verfügung, die standardmäßig mit eXist installiert ist, so können Sie davon Gebrauch machen, wie folgt:

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

Diese Funktionen gut erfüllen. Ich habe das einfach in eXide ausgeführt und die Abfrage gab 4125 Sammlungsnamen in 0.699s zurück.

+1

Vielen Dank für Ihre Antwort, ich habe es vergessen. Die Verwendung von HoF ist jedoch in xquery ziemlich fortgeschritten, es könnte ein bisschen zu komplex sein. – DiZzZz

4

Ihre Abfrage findet rekursiv Sammlungen, aber es gibt keine Ausgabe. Ich würde vorschlagen, etwas zu tun wie

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

Aber sicher Joe Vorschlag ist viel sauberer.

+0

Danke, eigentlich mag ich beide Lösungen! Der Joe's ist wahrscheinlich eleganter, aber ich muss verstehen, was darin vorgeht. Dieser basiert auf einer demütigeren Logik und für mich ist es klar. –

+0

Nur eine Anmerkung: Ich weiß nicht warum, aber es scheint, dass diese Funktion tatsächlich nicht alles im Baum auflistet. Es scheint, dass es nur einige tiefere Zweige zurückgibt. Es ist ziemlich schwierig, dies gründlich in eXide zu testen (es erlaubt mir, nur 10 Artikel zurückzugeben). –

+0

Eigentlich gibt dieser 14 Artikel zurück, die anderen 31 Artikel (was wahr zu sein scheint). Es gibt einige Störungen in diesem. Es scheint, dass es aufhört, die aktuelle Elternkollektion aufzulisten, wenn ** Kinder sind. –