- 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.1.7 Webservice Calls mit doc() und unparsed-text()
Eine verbreitete Paxis ist es, mit der Funktion
document()
oder kurz
doc()
entfernte Ressourcen in die Transformation einzubinden.
Bei einer Schematron-Validierung, würde bspw. eine Regel, wie:
<sch:not-assert id="personal-check" role="error" test="doc(concat('https://tekturcms.de/personal.xqy?personal-id=',personal-id))/kuendigung"> Angestellter mit ID "<sch:value-of select="personal-id"/>" hat gekündigt! </sch:not-assert>
einen entferneten Webservice aufrufen und prüfen, ob für den Angestellten mit
personal-id
eine Kündigung vorliegt. Ist dies der Fall, so ist die negative Zusicherung
not-assert
nicht
erfüllt, und die Schematron Regel feuert - was sich wohl im einfachsten Fall in einem
Logfile Eintrag äussern sollte.
Was vermutlich viele noch nicht kennen - ich nehme jetzt einfach mal an, dass mein
bisheriger Kenntnisstand dem der Mehrheit der XML-Entwickler entspricht - ist der Umstand,
dass auch die Funktion
unparsed-text()
eine URL als Parameter nimmt:
<xsl:template match="angestellter" <xsl:copy> <xsl:apply-templates select="node()|@*"/> <hat-gekuendigt> <xsl:sequence select="json-to-xml( unparsed-text( concat('https://tekturcms.de/personal.xqy?personal-id=', personal-id))))/descendant::*[@key='gekuendigt']/text()"/> </hat-gekuendigt> </xsl:copy> </xsl:template>
Während mit
doc()
oder
document()
ein zurückgeliefertes XML Fragment
prozessiert wird, erwartet
unparsed-text()
z.B. einen JSON-String, der dann mittels
der Funktion
json-to-xml()
nach XML konvertiert werden kann.
Beispielsweise könnte die Gegenseite zum
angestellter
Template mittels XQuery
folgendermassen realisiert sein:
xquery version "1.0-ml"; declare variable $personal-id := xdmp:get-request-field('personal-id'); let $gekuendigt := if (collection('/personal')/*[personal-id = $personal-id and fn:exists(kuendingung)] then 'ja' else 'nein' return common:render-response(concat('{"gekuendigt":"',$gekuendigt,'", "personal-id":"',$personal-id,'"}'))
(Mehr zu XQuery und den hier verwendeten Konstrukten, wie
render-response()
)
Das zurückgeklieferte JSON Dokument sieht dann so aus:
{"gekuendig":"ja","personal-id":"q5687500"}
Konvertiert nach XML erhält man eine Map Struktur:
<map xmlns="http://www.w3.org/2005/xpath-functions"> <string key="gekuedigt">ja</string> <string key="personal-id">q5687500</string> </map>
was den Selektorausdruck im obigen XPATH erklärt:
json-to-xml( unparsed-text( concat('https://tekturcms.de/personal.xqy?personal-id=', personal-id))))/descendant::*[@key='gekuendigt']/text()
Resultat der Konvertierung wäre - wie erwartet - ein um
das
gekuendigt
Flag erweitertes
<angestellter>
Element:
<angestellter> <perosnal-id>q5687500</perosnal-id> <name>Alex</name> [...] <gekuendigt>nein</gekuendigt> </angestellter>
Sicherlich wird der XML Entwickler eine XML Datenbank, wie MarkLogic, vorziehen
und sich gleich XML Fragmente ausliefern lassen. Tektur ist aber bspw. mit
MongoDB ↗
realisiert, die auf JSON arbeitet... Nicht zuletzt deshalb finde ich JSON Verarbeitung
mit XSLT recht spannend.