2016-03-03 5 views
6

In der Dokumentation für xdmp:invoke ist es möglich Parameter als zweites Argument übergeben.marklogic invoke Funktion mit Parametern

Für xdmp:invoke-function ist diese Option nicht verfügbar. Gibt es einen Workaround, um dies zu erreichen?

Die Zuordnung einer Liste zu einer Funktion ist einfach. Was ich versuche zu erreichen, ist eine Art aspektorientierte Funktion, die prüft, was erfolgreich war und fehlgeschlagen ist, und Standardprotokollnachrichten für alle Funktionen, die auf diese Weise aufgerufen werden. Etwas wie:

declare function my-mapper ($array, $fn) { 
    (: standard logging and checks :) 

    for $a in $array 
    return try { 
     (: now call the function with parameter :) 
     xdmp:invoke-function($fn($a),<options>...</options>) 

    } catch ($e) { 
     (: standard housekeeping if something goes wrong :)  
     ... 
    } 
}) 


my-mapper($array, function ($item) { 
    (: do stuff with item :) 
}) 

Gibt es eine Möglichkeit, dies in XQuery mit MarkLogic zu erreichen?

Antwort

9

Man führt ein Hauptmodul ohne Zugriff auf den Kontext aus, der es aufgerufen hat, und das andere führt eine Funktion mit diesem Kontext aus. Ich denke, die Idee ist, dass Sie keine Parameter über die Aufruf-Installation übergeben müssen, da Sie sie als Teil des Aufrufs an xdmp:invoke-function an die Funktion übergeben können. Sie müssten es nur in eine 0-arity-Funktion einbinden:

xdmp:invoke-function(
    function() { $fn($a) }, 
    <options>...</options>)