- 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.2.5.3 if..then..else Ausdrücke
In nicht-funktionalen Programmiersprachen sind die Schlüsselwörter
if
und
then
dazu da, um dem Compiler oder Interpreter mitzuteilen, dass eine bedingte Anweisung ausgewertet werden soll.
Was für den Nicht-funktionalen Programmierer etwas befremdlich erscheint, ist der Umstand, dass in XQuery
if..then
als Ausdrücke ausgewertet werden.
Das ist einerseits sehr praktisch, weil es richtig angewandt den Code verkürzt und damit das Wesentliche herausstellt, kann aber auch weiter zur allg. Verwirrung bzgl. des kryptischen XQuery Codes beitragen.
4.2.5.3.1 Beispiel: Konditionale Server App
Betrachten wir ein einfaches Beispiel: Wir generieren auf einer Marklogic-Webapp eine JSON Response. Da wir diesen Mechanismus an mehreren Stellen im Code einsetzen, empfiehlt es sich das Rendern des Headers in eine Funktion auszulagern.
declare function common:wrap-response($json) { 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'), $json };
In unserem Request-Handler wird je nach Auswertung einer Variablen eine
bedingte Anweisung ausgeführt, diese sieht bspw. so aus:
let $name := xdmp:get-request-field('name'), $is-afternoon := xs:time(current-dateTime()) gt xs:time('12:00:00') return if ($is-afternoon) then common:wrap-response(xdmp:unquote(concat('{"greeting":"Good Afternoon! ',$name,'!"}'))) else common:wrap-response(xdmp:unquote(concat('{"greeting":"Good Morning! ',$name,'!"}')))
Als prozeduraler Programmierer wäre ich mit diesem Switch voll und ganz zufrieden,
der funktionale Programmierer erkennt aber sofort einen Optimierungsbedarf.
Da es sich bei der bedingten Anweisung auch um einen Ausdruck handelt, der
true
oder
false
zurückgibt, können wir die gleichen Funktionsaufrufe herausziehen:
ommon:wrap-response(xdmp:unquote( let $is-afternoon := xs:time(current-dateTime()) gt xs:time('12:00:00') return if ($is-afternoon) then concat('{"greeting":"Good Afternoon! ',$name,'!"}') else concat('{"greeting":"Good Morning! ',$name,'!"}') )
Hier wird der abstrakt denkende Programmierer aber einwenden, dass eine abstrakte
Logik nicht in eine Low-Level Funktion, wie
xdmp:unquote
gewrapped werden sollte.
Das stimmt - und mehr noch, die Maskierung mit
xdmp:unquote
sollte auch noch in unsere
Funktion gepackt werden. So dass der Code schliesslich so aussehen würde:
declare function common:render-response($json) { 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($json) }; common:render-response( let $is-afternoon := xs:time(current-dateTime()) gt xs:time('12:00:00') return if ($is-afternoon) then concat('{"greeting":"Good Afternoon! ',$name,'!"}') else concat('{"greeting":"Good Morning! ',$name,'!"}') )
Sicherlich lässt sich darüber streiten, ob nun der funktionale Ansatz besser lesbar ist, oder der prozedurale von oben.
Ich denke jeder Programmierer hat hier seinen eigenen, individuellen
und bewährten Programmierstil entwickelt, den er auch beibehalten sollte.