- 1 Intro
- 2 Anwendungsgebiete
- 2.1 XSLT - die Programmiersprache im XML Bereich
- 2.2 Aktuelle und vergangene Anwendungen
- 2.3 Professionelle XML Verarbeitung
- 2.4 Technische Dokumentation
- 3 Wichtige Konzepte
- 3.1 Push vs. Pull Stylesheets
- 3.2 Eindeutigkeit der Regelbasis
- 3.3 Namespaces
- 3.4 Schemata
- 3.5 Standards
- 3.5.1 DITA
- 3.5.2 DITA Inhaltsmodell
- 3.5.1 DITA
- 4 Ausgewählte Themen
- 4.1 Transformationen mit XSLT
- 4.1.1 Vortransformationen
- 4.1.2 Komplexe XML-2-XML Transformationen
- 4.1.2.8 Vererbung
- 4.1.2.8 Vererbung
- 4.1.3 XSLT Streaming
- 4.1.3.1 XSLT Akkumulator
- 4.1.3.2 XSLT Iterator
- 4.1.4 Reguläre Ausdrücke
- 4.1.5 Modus vs. Tunnel Lösung
- 4.1.6 Identifikation mit
generate-id()
- 4.1.6.4 XPath-Achsenbereich selektieren
- 4.1.6.4.1 Funktionen und Module
- 4.1.6.4.1 Funktionen und Module
- 4.1.6.4 XPath-Achsenbereich selektieren
- 4.1.7 Webservice Calls mit doc() und unparsed-text()
- 4.1.8 Stylesheet-Parameter auf der Kommandozeile
- 4.1.9 Leerzeichenbehandlung
- 4.1.10 Mit
translate
Zeichen ersetzen
- 4.1.10.1 Spass mit dem Sequenzvergleich
- 4.1.11 Character Mappings in der Ausgabe
- 4.1.12 JSON mit XSLT 1.0 und Python lxml
- 4.1.1 Vortransformationen
- 4.2 Abfragen mit XQuery
- 4.2.5 XQuery als Programmiersprache
- 4.2.5.3
if..then..else
Ausdrücke
- 4.2.5.3.2 SQL Views in MarkLogic
- 4.2.5.3
if..then..else
Ausdrücke
- 4.2.6 Hilfreiche XQuery Schippsel
- 4.2.5 XQuery als Programmiersprache
- 4.3 XML Datenbanken
- 4.3.1 Connector zu Marklogic in Oxygen
- 4.3.2 Bi-Temporale Dokumente
- 4.3.2.1 Anlegen des Testszenarios auf der ML Konsole
- 4.3.2.2 Ausführen einiger Beispiel-Queries
- 4.3.3 Webapps mit MarkLogic
- 4.3.3.5 Wikipedia Scrapper Applikation
- 4.3.3.5 Wikipedia Scrapper Applikation
- 4.3.4 Dokument-Rechte in MarkLogic
- 4.3.5 MarkLogic Tools
- 4.3.5.1 EXPath Konsole
- 4.3.5.2 mlcp - MarkLogic Content Pump
- 4.3.5.3 Deployment-Tools
- 4.4 XSL-FO mit XSLT1.x
- 4.5 Testing
- 4.5.1 Validierung mit Schematron
- 4.5.2 Erste Schritte mit XSpec
- 4.5.1 Validierung mit Schematron
- 4.6 Performanz-Optimierung
- 4.1 Transformationen mit XSLT
- 5 Zusätzliches Know-How
- 5.1 XML Editoren
- 5.2 Quellcode-Versionskontrolle
- 5.2.1 Kurze Geschichte zur Versionskontrolle Test
- 5.2.2 GIT Kommandos
- 5.2.1 Kurze Geschichte zur Versionskontrolle Test
- 5.1 XML Editoren
- 6 Glossary
- 7 Tektur CCMS
4.3.2.1 Anlegen des Testszenarios auf der ML Konsole
Die Codefragmente aus dem vorherigen Kapitel sind folgend für eine ML Konsolensitzung aufbereitet:
-
Anlegen der temporalen Properties: validStart , validEnd , systemStart , systemEnd
-
Anlegen der Indizes zum Suchen über Zeitbereiche: database-range-field-index("dateTime", "systemStart",...
-
Anlegen der zwei Zeitachsen system und valid
-
Anlegen der temporalen Collection /perso-verluste
-
Anlegen des Originals am 1.2.2019
-
Aktualisierung am 6.2.2019
xquery version "1.0-ml"; import module namespace admin = "http://marklogic.com/xdmp/admin" at "/MarkLogic/admin.xqy"; import module namespace temporal = "http://marklogic.com/xdmp/temporal" at "/MarkLogic/temporal.xqy"; declare namespace local = 'local:'; declare variable $db := "alex-test"; declare function local:create-temporal-fields() { let $config := admin:get-configuration(), $dbid := xdmp:database($db) return try { admin:save-configuration( admin:database-add-field($config, $dbid, admin:database-metadata-field("validStart"))), admin:save-configuration( admin:database-add-field($config, $dbid, admin:database-metadata-field("validEnd"))), admin:save-configuration( admin:database-add-field($config, $dbid, admin:database-metadata-field("systemStart"))), admin:save-configuration( admin:database-add-field($config, $dbid, admin:database-metadata-field("systemEnd"))) } catch ($err) {} }; declare function local:create-range-index-fields() { let $config := admin:get-configuration(), $dbid := xdmp:database($db) return try { admin:save-configuration( admin:database-add-range-field-index($config, $dbid, admin:database-range-field-index("dateTime", "validStart", "", fn:true()))), admin:save-configuration( admin:database-add-range-field-index($config, $dbid, admin:database-range-field-index("dateTime", "validEnd", "", fn:true()))), admin:save-configuration( admin:database-add-range-field-index($config, $dbid, admin:database-range-field-index("dateTime", "systemStart", "", fn:true()))), admin:save-configuration( admin:database-add-range-field-index($config, $dbid, admin:database-range-field-index("dateTime", "systemEnd", "", fn:true()))) } catch ($err) {} }; declare function local:create-axes() { try { let $t1 := temporal:axis-create( "valid", cts:field-reference("validStart", "type=dateTime"), cts:field-reference("validEnd", "type=dateTime")), $t2 := temporal:axis-create( "system", cts:field-reference("systemStart", "type=dateTime"), cts:field-reference("systemEnd", "type=dateTime")) return () } catch ($err) {} }; declare function local:create-temporal-collection() { try { let $t:= temporal:collection-create("/perso-verluste", "system", "valid") return () } catch ($err) {} }; declare function local:insert-original() { let $root := <vorgang> <perso-id>XYZ</perso-id> <name>Alex Düsel</name> <status>gestohlen</status> </vorgang>, $options := <options xmlns="xdmp:document-insert"> <metadata> <map:map xmlns:map="http://marklogic.com/xdmp/map"> <map:entry key="validStart"> <map:value>2019-02-01T08:23:11</map:value> </map:entry> <map:entry key="validEnd"> <map:value>9999-12-31T11:59:59Z</map:value> </map:entry> </map:map> </metadata> </options> return temporal:document-insert("/perso-verluste", "duesel_alex_270774.xml", $root, $options) }; declare function local:insert-update() { let $root := <vorgang> <perso-id>XYZ</perso-id> <name>Alex Düsel</name> <status>gefunden</status> </vorgang>, $options := <options xmlns="xdmp:document-insert"> <metadata> <map:map xmlns:map="http://marklogic.com/xdmp/map"> <map:entry key="validStart"> <map:value>2019-02-06T08:00:00</map:value> </map:entry> <map:entry key="validEnd"> <map:value>9999-12-31T11:59:59Z</map:value> </map:entry> </map:map> </metadata> </options> return temporal:document-insert("/perso-verluste", "duesel_alex_270774.xml", $root, $options) }; ( xdmp:invoke-function(local:create-temporal-fields#0), xdmp:invoke-function(local:create-range-index-fields#0), xdmp:invoke-function(local:create-axes#0), xdmp:invoke-function(local:create-temporal-collection#0), xdmp:invoke-function(local:insert-original#0), xdmp:sleep(50000), xdmp:invoke-function(local:insert-update#0))
Beachtenswert ist hier,
1. | dass die einzelnen Schritte als Funktion über xdmp:invoke-function aufgerufen werden. Dieses Konstrukt wird normalerweise benutzt um eine Funktion anonym ↗ zu deklarieren und als Transaktion aufzurufen. Marklogic bietet weitere Möglichkeiten ↗ transaktional zu arbeiten. |
2. | Um die 5 Tage zwischen Verlustmeldung und Wiederauffinden zu simulieren, wurde zwischem dem Anlegen der Dokumente ein xdmp:sleep Statement eingefügt. |
Lassen wir diese Query auf einer frischen Datenbank laufen, so erhalten wir die folgendes Ergebnis:
Nach der Ausführung obiger Query gibt es in der DB drei Dokumente, das Orginal, das Split-Dokument und die Aktualisierung. Das Split-Dokuments und das Original sind als Vorgänger mit Suffix gekennzeichnet.
