SCHEMATRON FÜR 
TECHNISCHE 
REDAKTEURE 
Stefan Krause – Ovidius GmbH, Berlin
Ziele für den Workshop 
 Ich möchte Schematron populär machen. 
 Ich möchte erste oder zweite Schritte mit 
Ihnen gemeinsam gehen. 
 Was sind Ihre Ziele? 
© Ovidius Seite 2
Agenda 
 Was kann Schematron? 
 Schematron für Anfänger 
 XPath für Anfänger 
 Diskussion 
 Schematron für Fortgeschrittene 
 Praxistipps 
 Schematron für Profis 
 Diskussion 
© Ovidius Seite 3
über mich 
 Consultant/Application Developer bei der 
Ovidius GmbH (CMS-Anbieter) 
 davor 10 Jahre Projektmanager bei XML-lastigen 
Content-Digitalisierungsprojekten, 
vor allem für Archive, Bibliotheken und 
Verlage 
© Ovidius Seite 4
Was kann Schematron? 
→ Agenda
Was kann Schematron I? 
 Texte inspizieren 
 verbotene Zeichen 
 »z.B.« vs. »z. B.« 
 Worte, die mit »u« anfangen 
© Ovidius Seite 6
Was kann Schematron II? 
 Strukturen überprüfen 
 in Abhängigkeit von Attributen oder Text 
testen 
 Beispiel: Reihenfolge von Kapiteln 
 Beispiel: keine fette Schrift in kursiver Schrift 
 in Abhängigkeit von Berechnungen prüfen 
 Beispiel: Prozentangaben müssen sich zu 
100% addieren 
© Ovidius Seite 7
Was kann Schematron III? 
 informative, sachgerechte 
Fehlermeldungen ausgeben 
 mit beliebiger Detailliertheit 
 mit unterschiedlichen Schweregraden 
© Ovidius Seite 8
Was kann Schematron IV? 
 auf externe Dateien und WebServices 
lesend zugreifen 
 (in WebServices schreiben) 
© Ovidius Seite 9
demo.xml/demo.sch in OxygenXML 
© Ovidius Seite 10
demo.xml/demo.sch in antillesXML 
© Ovidius Seite 11
Was ist Schematron? 
 Schemasprache für XML-Dokumente 
 in Ergänzung zu DTD, XML Schema oder 
RNG 
 eher nicht für vollständige Grammatiken 
geeignet 
 ISO-Standard 
 Referenzimplementierung als Open 
Source 
 XPath als Abfragesprache 
 XSLT als Programmiersprache 
© Ovidius Seite 12
Warum Schematron? 
 Es ist einfach! 
 Es ist leicht zu erlernen. 
 Tests sind einfach zu schreiben und zu 
warten. 
 Deshalb werden Tests möglich, die bei 
anderen Ansätzen wegen hohen Aufwänden 
nicht durchgeführt werden. 
 Es ist mächtig! 
 XPath ist eine vollständige 
Programmiersprache. 
© Ovidius Seite 13
Schematron für Anfänger 
→ Agenda
Hello World! 
<?xml version="1.0" encoding="UTF-8"?> 
<schema 
xmlns="http://purl.oclc.org/dsdl/schematron"> 
<pattern> 
<rule context="/"> 
<report test="true()">Hello World!</report> 
</rule> 
</pattern> 
</schema> 
<?xml version="1.0" encoding="UTF-8"?> 
<literatur> 
<buecher> 
<buch xml:id="b1"> 
<autor ref="p1">Mann, Thomas</autor> 
<titel>Der Zauberberg</titel> 
<isbn>978-3-596-29433-7</isbn> 
<href>http://d-nb.info/942764498</href> 
</buch> 
<buch xml:id="b2"> 
<autor ref="p2">Mann,Klaus</autor> 
<titel> Mephisto</titel> 
<isbn>3 10 046705 1</isbn> 
<href>http://d nb.info/959653694</href> 
</buch> 
<buch xml:id="b3"> 
[…] 
01_Hello_World.sch example_01.xml 
© Ovidius Seite 15
Hello World in OxygenXML 
© Ovidius Seite 16
erste Prüfung 
<?xml version="1.0" encoding="UTF-8"?> 
<schema 
xmlns="http://purl.oclc.org/dsdl/schematron"> 
<pattern> 
<rule context="isbn"> 
<report test="not(contains(., '-'))">ISBNs 
sollen mit Bindestrich geschrieben 
werden!</report> 
</rule> 
</pattern> 
</schema> 
<?xml version="1.0" encoding="UTF-8"?> 
<literatur> 
<buecher> 
<buch xml:id="b1"> 
<autor ref="p1">Mann, Thomas</autor> 
<titel>Der Zauberberg</titel> 
<isbn>978-3-596-29433-7</isbn> 
<href>http://d-nb.info/942764498</href> 
</buch> 
<buch xml:id="b2"> 
<autor ref="p2">Mann,Klaus</autor> 
<titel> Mephisto</titel> 
<isbn>3 10 046705 1</isbn> 
<href>http://d nb.info/959653694</href> 
</buch> 
<buch xml:id="b3"> 
[…] 
02_Erste_Pruefung.sch example_01.xml 
© Ovidius Seite 17
erste Prüfung mit assert 
<?xml version="1.0" encoding="UTF-8"?> 
<schema 
xmlns="http://purl.oclc.org/dsdl/schematron"> 
<pattern> 
<rule context="isbn"> 
<assert test="contains(., '-')">ISBNs sollen 
mit Bindestrich geschrieben werden!</assert> 
</rule> 
</pattern> 
</schema> 
<?xml version="1.0" encoding="UTF-8"?> 
<literatur> 
<buecher> 
<buch xml:id="b1"> 
<autor ref="p1">Mann, Thomas</autor> 
<titel>Der Zauberberg</titel> 
<isbn>978-3-596-29433-7</isbn> 
<href>http://d-nb.info/942764498</href> 
</buch> 
<buch xml:id="b2"> 
<autor ref="p2">Mann,Klaus</autor> 
<titel> Mephisto</titel> 
<isbn>3 10 046705 1</isbn> 
<href>http://d nb.info/959653694</href> 
</buch> 
<buch xml:id="b3"> 
[…] 
02_Erste_Pruefung_mit_assert.sch example_01.xml 
© Ovidius Seite 18
mehrere Prüfungen 
<?xml version="1.0" encoding="UTF-8"?> 
<schema 
xmlns="http://purl.oclc.org/dsdl/schematron"> 
<pattern> 
<rule context="isbn"> 
<assert test="contains(., '-')">ISBNs sollen 
mit Bindestrich geschrieben werden!</assert> 
<report test="string-length(.) != 17">Es sollen 
ISBN-13 verwendet werden</report> 
</rule> 
</pattern> 
<pattern> 
<rule context="text()"> 
<report test="starts-with(., ' ')">Text soll nicht 
mit Leerzeichen beginnen.</report> 
</rule> 
</pattern> 
</schema> 
<?xml version="1.0" encoding="UTF-8"?> 
<literatur> 
<buecher> 
<buch xml:id="b1"> 
<autor ref="p1">Mann, Thomas</autor> 
<titel>Der Zauberberg</titel> 
<isbn>978-3-596-29433-7</isbn> 
<href>http://d-nb.info/942764498</href> 
</buch> 
<buch xml:id="b2"> 
<autor ref="p2">Mann,Klaus</autor> 
<titel> Mephisto</titel> 
<isbn>3 10 046705 1</isbn> 
<href>http://d nb.info/959653694</href> 
</buch> 
<buch xml:id="b3"> 
[…] 
03_mehrere_Pruefungen.sch example_01.xml 
© Ovidius Seite 19
gute Fehlermeldungen 
<?xml version="1.0" encoding="UTF-8"?> 
<schema xmlns="http://purl.oclc.org/dsdl/schematron"> 
<pattern> 
<rule context="isbn" role="error"> 
<assert test="contains(., '-')">ISBNs sollen mit Bindestrich geschrieben werden!</assert> 
<report test="string-length(.) != 17" role="info">Es sollen ISBN-13 verwendet 
werden</report> 
</rule> 
</pattern> 
<pattern> 
<rule context="text()" role="warn"> 
<report test="starts-with(., ' ')">Text soll nicht mit Leerzeichen beginnen.</report> 
</rule> 
</pattern> 
</schema> 
03_mehrere_Pruefungen_mit_unterschiedlichen_Schweregraden.sc 
h 
© Ovidius Seite 20
Zwischenstand 
 nur 6 Elemente genügen 
 schema, pattern, rule, assert/report 
 (ns) 
 die Mächtigkeit kommt aus XPath 
 So schwer ist das doch gar nicht! 
© Ovidius Seite 21
XPath für Anfänger 
→ Agenda
XML als Baum & Knotentypen 
0 
1 
2 
3 
9 
4 
5 
6 7 
8 
10 
11 
<wurzelelement> 
<eltern> 
<kind attribut="wert"> 
Text 
</kind> 
<kind attribut="value"> 
other text 
</kind> 
</eltern> 
<eltern> 
<!--Kommentar--> 
<?processing instruction?> 
</eltern> 
</wurzelelement> 
© Ovidius Seite 23
Achsenschritte I 
 / 
 /wurzelelement 
 /wurzelelement/eltern 
 //eltern 
 //kind/text() 
 //kind/@attribut 
 //* 
 //@* 
0 
1 
2 
3 
9 
<wurzelelement> 
4 
5 
6 7 
8 
10 
11 
<eltern> 
<kind attribut 
Text 
</kind> 
<kind attribut 
other text 
</kind> 
</eltern> 
<eltern> 
<!--Kommentar 
<?processing 
</eltern> 
</wurzelelement> 
© Ovidius Seite 24
Achsenschritte II 
 . 
 .. 
 ancestor::node() 
 descendant::text() 
 descendant-or-self::* 
 following::* 
 following-sibling::* 
 preceding::* 
0 
1 
2 
3 
9 
<wurzelelement> 
4 
5 
6 7 
8 
10 
11 
<eltern> 
<kind attribut 
Text 
</kind> 
<kind attribut 
other text 
</kind> 
</eltern> 
<eltern> 
<!--Kommentar 
<?processing 
</eltern> 
</wurzelelement> 
© Ovidius Seite 25
<wurzelelement> 
<eltern> 
<kind attribut="wert"> 
Text 
</kind> 
<kind attribut="value"> 
other text 
</kind> 
</eltern> 
<eltern> 
<!--Kommentar--> 
<?processing instruction?> 
</eltern> 
</wurzelelement> 
Filterausdrücke 
 //*[true()] 
 //*[parent::eltern] 
 //*[child::eltern] 
 //*[@attribut = "wert"] 
 //*[count(*) = 2] 
 //*[position() = 2] 
 //*[2] 
 //*[1]/*[2]/comment() 
© Ovidius Seite 26
Funktionen 
 count(), position(), not() 
 starts-with(), ends-with(), matches() 
 upper-case(), lower-case() 
 substring(), substring-before(), 
substring-after() 
 tokenize(), string-join() 
 doc() 
© Ovidius Seite 27
seltsame Funktionen 
 text(), comment(), processing-instruction(), 
document-node(), node() 
 Dies sind auch Knotentests! 
© Ovidius Seite 28
Operatoren und Ausdrücke 
 =, != 
 eq, ne, lt, gt 
 and, or, | 
 +, -, *, div, mod 
 (…, …) 
 if … then … else 
 for $i in … return 
 some/every $i in … satisfies … 
© Ovidius Seite 29
wichtige Konzepte von XPath 
 Kontextknoten 
 Datentypen 
 Knotentypen: Element, Attribut, Text-Knoten, 
Dokumenten-Knoten, Kommentar, PI 
 sind Teil des Baumes, mit Eltern und Kindern 
 atomare Werte: String, Integer, Datum usw. 
 sind nicht Teil des Baumes 
 Sequencen bzw. Listen 
© Ovidius Seite 30
Tools 
 OxygenXML 
 Editor und IDE für XML und XML-Techniken 
 sehr gute Unterstützung von Schematron 
beim Entwickeln und Prüfen 
 AntillesXML 
 GUI für verschiedene XML-Tools 
 kostenlos 
 Ant, Java, cmd/.bat … 
© Ovidius Seite 31
Diskussion 
→ Agenda
Was kann Schematron? 
 Haben alle Teilnehmer eine Vorstellung 
davon, was mit Schematron möglich ist? 
 Gibt es schon erste Ideen für eigene 
Prüfungen? 
© Ovidius Seite 33
Ein Blick aus der Vogelperspektive I 
 gute Fehlermeldungen 
 Fehler vs. Warnung 
 eindeutige Fehlerbeschreibung 
Fehlermeldung mit IDs oder Weblink 
 Schematron im Workflow der Technischen 
Redaktion 
 zur Überprüfung von Meilensteinen 
 als ständiger Begleiter 
 Anwender vs. Software-Entwickler 
© Ovidius Seite 34
Ein Blick aus der Vogelperspektive II 
 Schematron als Ergänzung von DTD/XML 
Schema 
 ermöglicht zusätzliche Prüfungen, ohne in 
die bestehende Infrastruktur eingreifen zu 
müssen 
 ermöglicht großzügige DTDs 
© Ovidius Seite 35
Schematron für Fortgeschrittene 
→ Agenda
value-of und let 
[…] 
<rule context="row[@type = 'dimensions']/cell[4]"> 
<let name="volumen" value="../cell[1] * ../cell[2] * ../cell[3] div 1000000"/> 
<assert test="false()" role="error">Das berechnete Volumen beträgt 
<value-of select="$volumen"/>l</assert> 
</rule> 
[…] 
demo.sch 
© Ovidius Seite 37
Phasen 
<schema xmlns="http://purl.oclc.org/dsdl/schematron" queryBinding="xslt2"> 
<phase id="text"> 
<active pattern="text_01"/> 
</phase> 
<phase id="structure"> 
<active pattern="struct_01"/> 
<active pattern="calc_01"/> 
</phase> 
[…] 
<pattern id="text_01"> 
[…] 
<pattern id="struct_01"> 
[…] 
<pattern id="calc_01"> 
demo.sch 
© Ovidius Seite 38
externe Referenzen (lokal) 
<schema xmlns="http://purl.oclc.org/dsdl/schematron" queryBinding="xslt2"> 
<pattern> 
<rule context="isbn" role="error"> 
<let name="current-isbn" value="text()"/> 
<assert test="doc('example_02.xml')//isbn/text()[. eq $current-isbn]">ISBN 
<value-of select="$current-isbn"/> nicht in externer Referenz 
aufgelistet.</assert> 
</rule> 
</pattern> 
</schema> 
04_externe_Referenzen.sch 
© Ovidius Seite 39
externe Referenzen (WebService) 
<?xml version="1.0" encoding="UTF-8"?> 
<schema xmlns="http://purl.oclc.org/dsdl/schematron" queryBinding="xslt2"> 
<pattern> 
<rule context="isbn" role="error"> 
<let name="current-isbn" value="text()"/> 
<let name="query-url" 
value="concat('http://xisbn.worldcat.org/webservices/xid/isbn/', $current-isbn, 
'?method=fixChecksum&amp;format=xml')"/> 
<let name="result" value="doc($query-url)"/> 
<assert test="$result//*:isbn/text()[. eq $current-isbn]">ISBN <value-of 
select="$current-isbn"/> nicht in WebService gefunden.</assert> 
</rule> 
</pattern> 
</schema> 
04_externe_Referenzen_web.sch 
© Ovidius Seite 40
Praxistipps 
• technische vs. fachliche Probleme 
• Schemata in OxygenXML einbinden 
• gefährlicher =-Operator 
• solved-Attribute 
→ Agenda
Schematron für Profis 
→ Agenda
XSLT verwenden – Warum? 
 einfacher und übersichtlicher zu 
programmieren als reines XPath 
 zusätzliche Funktionen 
 Zugriff auf vorhanden 
Funktionsbibliotheken wie XSLT-SB 
© Ovidius Seite 43
XSLT verwenden – Wie gehts? 
1. XSLT-Namespace im Schematron 
deklarieren: 
<?xml version="1.0" encoding="UTF-8"?> 
<schema xmlns="http://purl.oclc.org/dsdl/schematron" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
queryBinding="xslt2"> 
[…] 
© Ovidius Seite 44
XSLT verwenden – Wie gehts? 
2. Fremde Elemente bei der 
Schemaverarbeitung erlauben: 
© Ovidius Seite 45
XSLT verwenden – xsl:key und key() 
<?xml version="1.0" encoding="UTF-8"?> 
<schema xmlns="http://purl.oclc.org/dsdl/schematron" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
queryBinding="xslt2"> 
<xsl:key name="myKey" match="person" 
use="@xml:id"/> 
<pattern id="p3"> 
<rule context="autor"> 
<assert test="key('myKey', @ref)">[p3] autor/@ref 
muss auf ein person/@xml:id verweisen</assert> 
</rule> 
</pattern> 
</schema> 
<?xml version="1.0" encoding="UTF- 
<literatur> 
<buecher> 
[…] 
<buch xml:id="b3"> 
<autor ref="b1"/> 
<titel/> 
</buch> 
</buecher> 
<autoren> 
<person xml:id="p1"> 
<vorname>Thomas</vorname> 
<nachname>Mann</nachname> 
</person> 
[…] 
05_SCH_mit_XSLT_key.sch example_01.xml 
© Ovidius Seite 46
XSLT verwenden – interne 
Funktionen 
<schema xmlns="http://purl.oclc.org/dsdl/schematron" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
queryBinding="xslt2"> 
<ns prefix="my" uri="test"/> 
<?xml version="1.0" encoding="UTF- 
<literatur> 
<buecher> 
[…] 
<buch xml:id="b2"> 
<xsl:function name="my:literal-autor" as="xs:string?"> 
<xsl:param name="vorname" as="xs:string?"/> 
<xsl:param name="nachname" as="xs:string?"/> 
<xsl:sequence select="concat($nachname, ', ', $vorname)"/> 
</xsl:function> 
<pattern id="p3"> 
<rule context="autor"> 
<assert test="my:literal-autor(//person[@xml:id eq 
<autor ref="p2">Mann,Klaus</autor 
<titel> Mephisto</titel> 
<isbn>3 10 046705 1</isbn> 
<href>http://d nb.info/959653694</ 
</buch> 
[…] 
</buecher> 
<autoren> 
<person xml:id="p1"> 
current()/@ref]/vorname, //person[@xml:id eq 
current()/@ref]/nachname) eq .">[p3] autor muss […] </assert> 
<vorname>Thomas</vorname> 
<nachname>Mann</nachname> 
</person> 
</rule> 
[…] 
[…] 
06_SCH_mit_interner_XSLT-Funktion.sch example_01.xml 
© Ovidius Seite 47
XSLT verwenden – externe 
Funktionen 
<schema xmlns="http://purl.oclc.org/dsdl/schematron" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
queryBinding="xslt2"> 
<ns prefix="my" uri="test"/> 
<xsl:include href="example_01.xsl"/> 
<pattern id="p3"> 
<rule context="autor"> 
<assert test="my:literal-autor(//person[@xml:id eq 
<?xml version="1.0" encoding="UTF- 
<literatur> 
<buecher> 
[…] 
<buch xml:id="b2"> 
<autor ref="p2">Mann,Klaus</autor 
<titel> Mephisto</titel> 
<isbn>3 10 046705 1</isbn> 
<href>http://d nb.info/959653694</ 
</buch> 
[…] 
</buecher> 
<autoren> 
<person xml:id="p1"> 
current()/@ref]/vorname, //person[@xml:id eq 
current()/@ref]/nachname) eq .">[p3] autor muss […] </assert> 
<vorname>Thomas</vorname> 
<nachname>Mann</nachname> 
</person> 
</rule> 
[…] 
[…] 
07_SCH_mit_externer_XSLT-Funktion.sch example_01.xml 
© Ovidius Seite 48
Diskussion 
• Fragen? 
• Diskussion? 
→ Agenda
zum Weiterlesen und Ausprobieren 
 Beispiele aus den Folien zum Download hier 
 Marko Hedler/Manuel Montero Pineda/Nico 
Kutscherauer: Schematron. Effiziente 
Business Rules für XML-Dokumente. 
Heidelberg: dpunkt.verlag, 2011. 
ISBN 978-3-89864-721-2 
 Dave Pawson/Roger Costello/Florent 
Georges: ISO Schematron tutorial. An 
introductroy guide. 2007. 
http://www.dpawson.co.uk/schematron/ 
 diverse Beiträge in meinem Blog 
© Ovidius Seite 50
Ihre Meinung ist uns wichtig! Sagen Sie uns bitte, wie Ihnen der Vortrag 
gefallen hat. Wir freuen uns auf Ihr Feedback per Smartphone oder Tablet 
unter http://OTS9.honestly.de oder scannen Sie den QR-Code 
Das Bewertungstool steht Ihnen auch noch nach der Tagung zur Verfügung! 
© Ovidius Seite 51

Schematron für Technische Redakteure

  • 1.
    SCHEMATRON FÜR TECHNISCHE REDAKTEURE Stefan Krause – Ovidius GmbH, Berlin
  • 2.
    Ziele für denWorkshop  Ich möchte Schematron populär machen.  Ich möchte erste oder zweite Schritte mit Ihnen gemeinsam gehen.  Was sind Ihre Ziele? © Ovidius Seite 2
  • 3.
    Agenda  Waskann Schematron?  Schematron für Anfänger  XPath für Anfänger  Diskussion  Schematron für Fortgeschrittene  Praxistipps  Schematron für Profis  Diskussion © Ovidius Seite 3
  • 4.
    über mich Consultant/Application Developer bei der Ovidius GmbH (CMS-Anbieter)  davor 10 Jahre Projektmanager bei XML-lastigen Content-Digitalisierungsprojekten, vor allem für Archive, Bibliotheken und Verlage © Ovidius Seite 4
  • 5.
  • 6.
    Was kann SchematronI?  Texte inspizieren  verbotene Zeichen  »z.B.« vs. »z. B.«  Worte, die mit »u« anfangen © Ovidius Seite 6
  • 7.
    Was kann SchematronII?  Strukturen überprüfen  in Abhängigkeit von Attributen oder Text testen  Beispiel: Reihenfolge von Kapiteln  Beispiel: keine fette Schrift in kursiver Schrift  in Abhängigkeit von Berechnungen prüfen  Beispiel: Prozentangaben müssen sich zu 100% addieren © Ovidius Seite 7
  • 8.
    Was kann SchematronIII?  informative, sachgerechte Fehlermeldungen ausgeben  mit beliebiger Detailliertheit  mit unterschiedlichen Schweregraden © Ovidius Seite 8
  • 9.
    Was kann SchematronIV?  auf externe Dateien und WebServices lesend zugreifen  (in WebServices schreiben) © Ovidius Seite 9
  • 10.
    demo.xml/demo.sch in OxygenXML © Ovidius Seite 10
  • 11.
  • 12.
    Was ist Schematron?  Schemasprache für XML-Dokumente  in Ergänzung zu DTD, XML Schema oder RNG  eher nicht für vollständige Grammatiken geeignet  ISO-Standard  Referenzimplementierung als Open Source  XPath als Abfragesprache  XSLT als Programmiersprache © Ovidius Seite 12
  • 13.
    Warum Schematron? Es ist einfach!  Es ist leicht zu erlernen.  Tests sind einfach zu schreiben und zu warten.  Deshalb werden Tests möglich, die bei anderen Ansätzen wegen hohen Aufwänden nicht durchgeführt werden.  Es ist mächtig!  XPath ist eine vollständige Programmiersprache. © Ovidius Seite 13
  • 14.
  • 15.
    Hello World! <?xmlversion="1.0" encoding="UTF-8"?> <schema xmlns="http://purl.oclc.org/dsdl/schematron"> <pattern> <rule context="/"> <report test="true()">Hello World!</report> </rule> </pattern> </schema> <?xml version="1.0" encoding="UTF-8"?> <literatur> <buecher> <buch xml:id="b1"> <autor ref="p1">Mann, Thomas</autor> <titel>Der Zauberberg</titel> <isbn>978-3-596-29433-7</isbn> <href>http://d-nb.info/942764498</href> </buch> <buch xml:id="b2"> <autor ref="p2">Mann,Klaus</autor> <titel> Mephisto</titel> <isbn>3 10 046705 1</isbn> <href>http://d nb.info/959653694</href> </buch> <buch xml:id="b3"> […] 01_Hello_World.sch example_01.xml © Ovidius Seite 15
  • 16.
    Hello World inOxygenXML © Ovidius Seite 16
  • 17.
    erste Prüfung <?xmlversion="1.0" encoding="UTF-8"?> <schema xmlns="http://purl.oclc.org/dsdl/schematron"> <pattern> <rule context="isbn"> <report test="not(contains(., '-'))">ISBNs sollen mit Bindestrich geschrieben werden!</report> </rule> </pattern> </schema> <?xml version="1.0" encoding="UTF-8"?> <literatur> <buecher> <buch xml:id="b1"> <autor ref="p1">Mann, Thomas</autor> <titel>Der Zauberberg</titel> <isbn>978-3-596-29433-7</isbn> <href>http://d-nb.info/942764498</href> </buch> <buch xml:id="b2"> <autor ref="p2">Mann,Klaus</autor> <titel> Mephisto</titel> <isbn>3 10 046705 1</isbn> <href>http://d nb.info/959653694</href> </buch> <buch xml:id="b3"> […] 02_Erste_Pruefung.sch example_01.xml © Ovidius Seite 17
  • 18.
    erste Prüfung mitassert <?xml version="1.0" encoding="UTF-8"?> <schema xmlns="http://purl.oclc.org/dsdl/schematron"> <pattern> <rule context="isbn"> <assert test="contains(., '-')">ISBNs sollen mit Bindestrich geschrieben werden!</assert> </rule> </pattern> </schema> <?xml version="1.0" encoding="UTF-8"?> <literatur> <buecher> <buch xml:id="b1"> <autor ref="p1">Mann, Thomas</autor> <titel>Der Zauberberg</titel> <isbn>978-3-596-29433-7</isbn> <href>http://d-nb.info/942764498</href> </buch> <buch xml:id="b2"> <autor ref="p2">Mann,Klaus</autor> <titel> Mephisto</titel> <isbn>3 10 046705 1</isbn> <href>http://d nb.info/959653694</href> </buch> <buch xml:id="b3"> […] 02_Erste_Pruefung_mit_assert.sch example_01.xml © Ovidius Seite 18
  • 19.
    mehrere Prüfungen <?xmlversion="1.0" encoding="UTF-8"?> <schema xmlns="http://purl.oclc.org/dsdl/schematron"> <pattern> <rule context="isbn"> <assert test="contains(., '-')">ISBNs sollen mit Bindestrich geschrieben werden!</assert> <report test="string-length(.) != 17">Es sollen ISBN-13 verwendet werden</report> </rule> </pattern> <pattern> <rule context="text()"> <report test="starts-with(., ' ')">Text soll nicht mit Leerzeichen beginnen.</report> </rule> </pattern> </schema> <?xml version="1.0" encoding="UTF-8"?> <literatur> <buecher> <buch xml:id="b1"> <autor ref="p1">Mann, Thomas</autor> <titel>Der Zauberberg</titel> <isbn>978-3-596-29433-7</isbn> <href>http://d-nb.info/942764498</href> </buch> <buch xml:id="b2"> <autor ref="p2">Mann,Klaus</autor> <titel> Mephisto</titel> <isbn>3 10 046705 1</isbn> <href>http://d nb.info/959653694</href> </buch> <buch xml:id="b3"> […] 03_mehrere_Pruefungen.sch example_01.xml © Ovidius Seite 19
  • 20.
    gute Fehlermeldungen <?xmlversion="1.0" encoding="UTF-8"?> <schema xmlns="http://purl.oclc.org/dsdl/schematron"> <pattern> <rule context="isbn" role="error"> <assert test="contains(., '-')">ISBNs sollen mit Bindestrich geschrieben werden!</assert> <report test="string-length(.) != 17" role="info">Es sollen ISBN-13 verwendet werden</report> </rule> </pattern> <pattern> <rule context="text()" role="warn"> <report test="starts-with(., ' ')">Text soll nicht mit Leerzeichen beginnen.</report> </rule> </pattern> </schema> 03_mehrere_Pruefungen_mit_unterschiedlichen_Schweregraden.sc h © Ovidius Seite 20
  • 21.
    Zwischenstand  nur6 Elemente genügen  schema, pattern, rule, assert/report  (ns)  die Mächtigkeit kommt aus XPath  So schwer ist das doch gar nicht! © Ovidius Seite 21
  • 22.
  • 23.
    XML als Baum& Knotentypen 0 1 2 3 9 4 5 6 7 8 10 11 <wurzelelement> <eltern> <kind attribut="wert"> Text </kind> <kind attribut="value"> other text </kind> </eltern> <eltern> <!--Kommentar--> <?processing instruction?> </eltern> </wurzelelement> © Ovidius Seite 23
  • 24.
    Achsenschritte I /  /wurzelelement  /wurzelelement/eltern  //eltern  //kind/text()  //kind/@attribut  //*  //@* 0 1 2 3 9 <wurzelelement> 4 5 6 7 8 10 11 <eltern> <kind attribut Text </kind> <kind attribut other text </kind> </eltern> <eltern> <!--Kommentar <?processing </eltern> </wurzelelement> © Ovidius Seite 24
  • 25.
    Achsenschritte II .  ..  ancestor::node()  descendant::text()  descendant-or-self::*  following::*  following-sibling::*  preceding::* 0 1 2 3 9 <wurzelelement> 4 5 6 7 8 10 11 <eltern> <kind attribut Text </kind> <kind attribut other text </kind> </eltern> <eltern> <!--Kommentar <?processing </eltern> </wurzelelement> © Ovidius Seite 25
  • 26.
    <wurzelelement> <eltern> <kindattribut="wert"> Text </kind> <kind attribut="value"> other text </kind> </eltern> <eltern> <!--Kommentar--> <?processing instruction?> </eltern> </wurzelelement> Filterausdrücke  //*[true()]  //*[parent::eltern]  //*[child::eltern]  //*[@attribut = "wert"]  //*[count(*) = 2]  //*[position() = 2]  //*[2]  //*[1]/*[2]/comment() © Ovidius Seite 26
  • 27.
    Funktionen  count(),position(), not()  starts-with(), ends-with(), matches()  upper-case(), lower-case()  substring(), substring-before(), substring-after()  tokenize(), string-join()  doc() © Ovidius Seite 27
  • 28.
    seltsame Funktionen text(), comment(), processing-instruction(), document-node(), node()  Dies sind auch Knotentests! © Ovidius Seite 28
  • 29.
    Operatoren und Ausdrücke  =, !=  eq, ne, lt, gt  and, or, |  +, -, *, div, mod  (…, …)  if … then … else  for $i in … return  some/every $i in … satisfies … © Ovidius Seite 29
  • 30.
    wichtige Konzepte vonXPath  Kontextknoten  Datentypen  Knotentypen: Element, Attribut, Text-Knoten, Dokumenten-Knoten, Kommentar, PI  sind Teil des Baumes, mit Eltern und Kindern  atomare Werte: String, Integer, Datum usw.  sind nicht Teil des Baumes  Sequencen bzw. Listen © Ovidius Seite 30
  • 31.
    Tools  OxygenXML  Editor und IDE für XML und XML-Techniken  sehr gute Unterstützung von Schematron beim Entwickeln und Prüfen  AntillesXML  GUI für verschiedene XML-Tools  kostenlos  Ant, Java, cmd/.bat … © Ovidius Seite 31
  • 32.
  • 33.
    Was kann Schematron?  Haben alle Teilnehmer eine Vorstellung davon, was mit Schematron möglich ist?  Gibt es schon erste Ideen für eigene Prüfungen? © Ovidius Seite 33
  • 34.
    Ein Blick ausder Vogelperspektive I  gute Fehlermeldungen  Fehler vs. Warnung  eindeutige Fehlerbeschreibung Fehlermeldung mit IDs oder Weblink  Schematron im Workflow der Technischen Redaktion  zur Überprüfung von Meilensteinen  als ständiger Begleiter  Anwender vs. Software-Entwickler © Ovidius Seite 34
  • 35.
    Ein Blick ausder Vogelperspektive II  Schematron als Ergänzung von DTD/XML Schema  ermöglicht zusätzliche Prüfungen, ohne in die bestehende Infrastruktur eingreifen zu müssen  ermöglicht großzügige DTDs © Ovidius Seite 35
  • 36.
  • 37.
    value-of und let […] <rule context="row[@type = 'dimensions']/cell[4]"> <let name="volumen" value="../cell[1] * ../cell[2] * ../cell[3] div 1000000"/> <assert test="false()" role="error">Das berechnete Volumen beträgt <value-of select="$volumen"/>l</assert> </rule> […] demo.sch © Ovidius Seite 37
  • 38.
    Phasen <schema xmlns="http://purl.oclc.org/dsdl/schematron"queryBinding="xslt2"> <phase id="text"> <active pattern="text_01"/> </phase> <phase id="structure"> <active pattern="struct_01"/> <active pattern="calc_01"/> </phase> […] <pattern id="text_01"> […] <pattern id="struct_01"> […] <pattern id="calc_01"> demo.sch © Ovidius Seite 38
  • 39.
    externe Referenzen (lokal) <schema xmlns="http://purl.oclc.org/dsdl/schematron" queryBinding="xslt2"> <pattern> <rule context="isbn" role="error"> <let name="current-isbn" value="text()"/> <assert test="doc('example_02.xml')//isbn/text()[. eq $current-isbn]">ISBN <value-of select="$current-isbn"/> nicht in externer Referenz aufgelistet.</assert> </rule> </pattern> </schema> 04_externe_Referenzen.sch © Ovidius Seite 39
  • 40.
    externe Referenzen (WebService) <?xml version="1.0" encoding="UTF-8"?> <schema xmlns="http://purl.oclc.org/dsdl/schematron" queryBinding="xslt2"> <pattern> <rule context="isbn" role="error"> <let name="current-isbn" value="text()"/> <let name="query-url" value="concat('http://xisbn.worldcat.org/webservices/xid/isbn/', $current-isbn, '?method=fixChecksum&amp;format=xml')"/> <let name="result" value="doc($query-url)"/> <assert test="$result//*:isbn/text()[. eq $current-isbn]">ISBN <value-of select="$current-isbn"/> nicht in WebService gefunden.</assert> </rule> </pattern> </schema> 04_externe_Referenzen_web.sch © Ovidius Seite 40
  • 41.
    Praxistipps • technischevs. fachliche Probleme • Schemata in OxygenXML einbinden • gefährlicher =-Operator • solved-Attribute → Agenda
  • 42.
  • 43.
    XSLT verwenden –Warum?  einfacher und übersichtlicher zu programmieren als reines XPath  zusätzliche Funktionen  Zugriff auf vorhanden Funktionsbibliotheken wie XSLT-SB © Ovidius Seite 43
  • 44.
    XSLT verwenden –Wie gehts? 1. XSLT-Namespace im Schematron deklarieren: <?xml version="1.0" encoding="UTF-8"?> <schema xmlns="http://purl.oclc.org/dsdl/schematron" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" queryBinding="xslt2"> […] © Ovidius Seite 44
  • 45.
    XSLT verwenden –Wie gehts? 2. Fremde Elemente bei der Schemaverarbeitung erlauben: © Ovidius Seite 45
  • 46.
    XSLT verwenden –xsl:key und key() <?xml version="1.0" encoding="UTF-8"?> <schema xmlns="http://purl.oclc.org/dsdl/schematron" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" queryBinding="xslt2"> <xsl:key name="myKey" match="person" use="@xml:id"/> <pattern id="p3"> <rule context="autor"> <assert test="key('myKey', @ref)">[p3] autor/@ref muss auf ein person/@xml:id verweisen</assert> </rule> </pattern> </schema> <?xml version="1.0" encoding="UTF- <literatur> <buecher> […] <buch xml:id="b3"> <autor ref="b1"/> <titel/> </buch> </buecher> <autoren> <person xml:id="p1"> <vorname>Thomas</vorname> <nachname>Mann</nachname> </person> […] 05_SCH_mit_XSLT_key.sch example_01.xml © Ovidius Seite 46
  • 47.
    XSLT verwenden –interne Funktionen <schema xmlns="http://purl.oclc.org/dsdl/schematron" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" queryBinding="xslt2"> <ns prefix="my" uri="test"/> <?xml version="1.0" encoding="UTF- <literatur> <buecher> […] <buch xml:id="b2"> <xsl:function name="my:literal-autor" as="xs:string?"> <xsl:param name="vorname" as="xs:string?"/> <xsl:param name="nachname" as="xs:string?"/> <xsl:sequence select="concat($nachname, ', ', $vorname)"/> </xsl:function> <pattern id="p3"> <rule context="autor"> <assert test="my:literal-autor(//person[@xml:id eq <autor ref="p2">Mann,Klaus</autor <titel> Mephisto</titel> <isbn>3 10 046705 1</isbn> <href>http://d nb.info/959653694</ </buch> […] </buecher> <autoren> <person xml:id="p1"> current()/@ref]/vorname, //person[@xml:id eq current()/@ref]/nachname) eq .">[p3] autor muss […] </assert> <vorname>Thomas</vorname> <nachname>Mann</nachname> </person> </rule> […] […] 06_SCH_mit_interner_XSLT-Funktion.sch example_01.xml © Ovidius Seite 47
  • 48.
    XSLT verwenden –externe Funktionen <schema xmlns="http://purl.oclc.org/dsdl/schematron" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" queryBinding="xslt2"> <ns prefix="my" uri="test"/> <xsl:include href="example_01.xsl"/> <pattern id="p3"> <rule context="autor"> <assert test="my:literal-autor(//person[@xml:id eq <?xml version="1.0" encoding="UTF- <literatur> <buecher> […] <buch xml:id="b2"> <autor ref="p2">Mann,Klaus</autor <titel> Mephisto</titel> <isbn>3 10 046705 1</isbn> <href>http://d nb.info/959653694</ </buch> […] </buecher> <autoren> <person xml:id="p1"> current()/@ref]/vorname, //person[@xml:id eq current()/@ref]/nachname) eq .">[p3] autor muss […] </assert> <vorname>Thomas</vorname> <nachname>Mann</nachname> </person> </rule> […] […] 07_SCH_mit_externer_XSLT-Funktion.sch example_01.xml © Ovidius Seite 48
  • 49.
    Diskussion • Fragen? • Diskussion? → Agenda
  • 50.
    zum Weiterlesen undAusprobieren  Beispiele aus den Folien zum Download hier  Marko Hedler/Manuel Montero Pineda/Nico Kutscherauer: Schematron. Effiziente Business Rules für XML-Dokumente. Heidelberg: dpunkt.verlag, 2011. ISBN 978-3-89864-721-2  Dave Pawson/Roger Costello/Florent Georges: ISO Schematron tutorial. An introductroy guide. 2007. http://www.dpawson.co.uk/schematron/  diverse Beiträge in meinem Blog © Ovidius Seite 50
  • 51.
    Ihre Meinung istuns wichtig! Sagen Sie uns bitte, wie Ihnen der Vortrag gefallen hat. Wir freuen uns auf Ihr Feedback per Smartphone oder Tablet unter http://OTS9.honestly.de oder scannen Sie den QR-Code Das Bewertungstool steht Ihnen auch noch nach der Tagung zur Verfügung! © Ovidius Seite 51

Hinweis der Redaktion

  • #7 demo.xml, demo.sch