Die Streaming Transformation mit dem Iterator Konzept sieht so aus:
template name="main"> <xsl:source-document href="{$input-file}" streamable='yes'> <result> <xsl:iterate select="page/title"> <xsl:variable name="json-call" select="json-to-xml( unparsed-text( concat($server-url,'/scrap-title.xqy?', 'title=',encode-for-uri(.))))"/> <state> <xsl:sequence select="$json-call/descendant::*[@key='state']/text()"/> </state> </xsl:iterate> </result> </xsl:source-document> </xsl:template>Plain Text
Hier werden in einer Ergebnis Struktur mit einem <result> Element einzelne <state> Elemente ausgegeben.
Der Inhalt dieser Elemente ist Rückgabewert eines Webrequests über die Funktion fn:unparsed-text() .
An das Skript scrap-title.xqy wird ein Parameter title übergeben:
xquery version "1.0-ml"; import module namespace json = "http://marklogic.com/xdmp/json" at "/MarkLogic/json/json.xqy"; declare namespace local = 'local:'; declare variable $title := xdmp:get-request-field('title'); declare function local:render-response($response) { xdmp:add-response-header("Pragma", "no-cache"), xdmp:add-response-header("Cache-Control", "no-cache"), xdmp:add-response-header("Expires", "0"), xdmp:set-response-content-type('text/json; charset=utf-8'), xdmp:unquote($response) }; let $root := <title>{ $title }</title>, $options := <options xmlns="xdmp:document-insert"> <permissions>{ xdmp:default-permissions() }</permissions> <collections> <collection>/wikimedia-titles</collection> </collections> </options>, $fname := concat('/wikimedia-titles/', xdmp:md5($title), ".xml"), $td := xdmp:document-insert($fname, $root, $options) return local:render-response(concat('{"state":"success","title":"',$title,'"}'))Plain Text
Wenn alles gut läuft, sollte die Transformation nach einer halben Stunde abgeschlossen sein. Es sollten sich in der
Collection /wikimedia-titles viele Einträge befinden, mit Dateinamen wie:
<fname>/wikimedia-titles/b00bb36cf9dd18f12141f463f59947e6.xml</fname>Plain Text