SlideShare ist ein Scribd-Unternehmen logo
1 von 51
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

Weitere ähnliche Inhalte

Ähnlich wie Schematron für Technische Redakteure

Einsatz von Subversion bei der Entwicklung technisch-wissenschaftlicher Software
Einsatz von Subversion bei der Entwicklung technisch-wissenschaftlicher SoftwareEinsatz von Subversion bei der Entwicklung technisch-wissenschaftlicher Software
Einsatz von Subversion bei der Entwicklung technisch-wissenschaftlicher Software
Andreas Schreiber
 
Agiles Modellieren mit Domain Specific Languages
Agiles Modellieren mit Domain Specific LanguagesAgiles Modellieren mit Domain Specific Languages
Agiles Modellieren mit Domain Specific Languages
Dominik Hirt
 
Oracle Forms: How to create a Framework
Oracle Forms: How to create a FrameworkOracle Forms: How to create a Framework
Oracle Forms: How to create a Framework
OPITZ CONSULTING Deutschland
 

Ähnlich wie Schematron für Technische Redakteure (20)

Einsatz von Subversion bei der Entwicklung technisch-wissenschaftlicher Software
Einsatz von Subversion bei der Entwicklung technisch-wissenschaftlicher SoftwareEinsatz von Subversion bei der Entwicklung technisch-wissenschaftlicher Software
Einsatz von Subversion bei der Entwicklung technisch-wissenschaftlicher Software
 
Am Ende ist doch alles HTML (Jax 2010)
Am Ende ist doch alles HTML (Jax 2010)Am Ende ist doch alles HTML (Jax 2010)
Am Ende ist doch alles HTML (Jax 2010)
 
Web Entwicklung mit PHP - Teil 3 Beta
Web Entwicklung mit PHP - Teil 3 BetaWeb Entwicklung mit PHP - Teil 3 Beta
Web Entwicklung mit PHP - Teil 3 Beta
 
Python, Plone und Zope in der Luft- und Raumfahrtforschung
Python, Plone und Zope in der Luft- und RaumfahrtforschungPython, Plone und Zope in der Luft- und Raumfahrtforschung
Python, Plone und Zope in der Luft- und Raumfahrtforschung
 
Am Ende ist doch alles HTML (Uni Mainz)
Am Ende ist doch alles HTML (Uni Mainz)Am Ende ist doch alles HTML (Uni Mainz)
Am Ende ist doch alles HTML (Uni Mainz)
 
Einstieg in Xpath für SEO (Campixx2021)
Einstieg in Xpath für SEO (Campixx2021)Einstieg in Xpath für SEO (Campixx2021)
Einstieg in Xpath für SEO (Campixx2021)
 
Einführung in ASP.NET Core Middlewares
Einführung in ASP.NET Core MiddlewaresEinführung in ASP.NET Core Middlewares
Einführung in ASP.NET Core Middlewares
 
Top 10 Internet Trends 2007
Top 10 Internet Trends 2007Top 10 Internet Trends 2007
Top 10 Internet Trends 2007
 
Reactive Programming
Reactive ProgrammingReactive Programming
Reactive Programming
 
Agiles Modellieren mit Domain Specific Languages
Agiles Modellieren mit Domain Specific LanguagesAgiles Modellieren mit Domain Specific Languages
Agiles Modellieren mit Domain Specific Languages
 
Suchmaschinenoptimierung für Professoren
Suchmaschinenoptimierung für ProfessorenSuchmaschinenoptimierung für Professoren
Suchmaschinenoptimierung für Professoren
 
HTML5 - presentation at W3C-Tag 2009
HTML5 - presentation at W3C-Tag 2009HTML5 - presentation at W3C-Tag 2009
HTML5 - presentation at W3C-Tag 2009
 
Top 10 Internet Trends 2006
Top 10 Internet Trends 2006Top 10 Internet Trends 2006
Top 10 Internet Trends 2006
 
Node.js
Node.jsNode.js
Node.js
 
Top 10 Internet Trends 2004
Top 10 Internet Trends 2004Top 10 Internet Trends 2004
Top 10 Internet Trends 2004
 
[DE] Glossar zu Dokumenten-Technologien | PROJECT CONSULT | Hamburg 2010
 [DE] Glossar zu Dokumenten-Technologien | PROJECT CONSULT | Hamburg 2010 [DE] Glossar zu Dokumenten-Technologien | PROJECT CONSULT | Hamburg 2010
[DE] Glossar zu Dokumenten-Technologien | PROJECT CONSULT | Hamburg 2010
 
Oracle Forms: How to create a Framework
Oracle Forms: How to create a FrameworkOracle Forms: How to create a Framework
Oracle Forms: How to create a Framework
 
magnolia mit thymeleaf - ein agiler prozess-beschleuniger
magnolia mit thymeleaf - ein agiler prozess-beschleunigermagnolia mit thymeleaf - ein agiler prozess-beschleuniger
magnolia mit thymeleaf - ein agiler prozess-beschleuniger
 
AndroMDA - Einführung in eine Open Source Model Driven Architecture Lösung
AndroMDA - Einführung in eine Open Source Model Driven Architecture LösungAndroMDA - Einführung in eine Open Source Model Driven Architecture Lösung
AndroMDA - Einführung in eine Open Source Model Driven Architecture Lösung
 
Developing UXD - weitere Tipps, Tricks und Argumente
Developing UXD - weitere Tipps, Tricks und ArgumenteDeveloping UXD - weitere Tipps, Tricks und Argumente
Developing UXD - weitere Tipps, Tricks und Argumente
 

Schematron für Technische Redakteure

  • 1. SCHEMATRON FÜR TECHNISCHE REDAKTEURE Stefan Krause – Ovidius GmbH, Berlin
  • 2. 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
  • 3. 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
  • 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. Was kann Schematron? → Agenda
  • 6. Was kann Schematron I?  Texte inspizieren  verbotene Zeichen  »z.B.« vs. »z. B.«  Worte, die mit »u« anfangen © Ovidius Seite 6
  • 7. 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
  • 8. Was kann Schematron III?  informative, sachgerechte Fehlermeldungen ausgeben  mit beliebiger Detailliertheit  mit unterschiedlichen Schweregraden © Ovidius Seite 8
  • 9. Was kann Schematron IV?  auf externe Dateien und WebServices lesend zugreifen  (in WebServices schreiben) © Ovidius Seite 9
  • 10. demo.xml/demo.sch in OxygenXML © Ovidius Seite 10
  • 11. demo.xml/demo.sch in antillesXML © Ovidius Seite 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
  • 15. 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
  • 16. Hello World in OxygenXML © Ovidius Seite 16
  • 17. 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
  • 18. 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
  • 19. 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
  • 20. 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
  • 21. 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
  • 22. XPath für Anfänger → Agenda
  • 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> <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
  • 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 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
  • 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
  • 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 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
  • 35. 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
  • 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 • technische vs. fachliche Probleme • Schemata in OxygenXML einbinden • gefährlicher =-Operator • solved-Attribute → Agenda
  • 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 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
  • 51. 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

Hinweis der Redaktion

  1. demo.xml, demo.sch