Upload
stefan-krause
View
125
Download
3
Embed Size (px)
Citation preview
© Ovidius Seite 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 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 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 6
Was kann Schematron I?
Texte inspizieren verbotene Zeichen »z.B.« vs. »z. B.« Worte, die mit »u« anfangen
© Ovidius Seite 7
Was kann Schematron II?
Strukturen überprüfen in Abhängigkeit von Attributen oder
Text testenBeispiel: Reihenfolge von KapitelnBeispiel: keine fette Schrift in kursiver
Schrift in Abhängigkeit von Berechnungen
prüfenBeispiel: Prozentangaben müssen sich zu
100% addieren
© Ovidius Seite 8
Was kann Schematron III?
informative, sachgerechte Fehlermeldungen ausgeben
mit beliebiger Detailliertheit mit unterschiedlichen
Schweregraden
© Ovidius Seite 9
Was kann Schematron IV?
auf externe Dateien und WebServices lesend zugreifen
(in WebServices schreiben)
© Ovidius Seite 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 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 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 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 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 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 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.sch
© Ovidius Seite 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 23
0
1
2
3
9
4
5
6 7
8
10
11
XML als Baum & Knotentypen
<wurzelelement><eltern>
<kind attribut="wert">
Text</kind><kind
attribut="value">other text
</kind></eltern><eltern>
<!--Kommentar--><?processing
instruction?></eltern>
</wurzelelement>
© Ovidius Seite 24
Achsenschritte I
/ /wurzelelement /wurzelelement/eltern //eltern //kind/text() //kind/@attribut //* //@*
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 25
Achsenschritte II
. .. ancestor::node() descendant::text() descendant-or-self::* following::* following-sibling::* preceding::*
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 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 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 28
seltsame Funktionen
text(), comment(), processing-instruction(), document-node(), node() Dies sind auch Knotentests!
© Ovidius Seite 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 30
wichtige Konzepte von XPath
Kontextknoten Datentypen
Knotentypen: Element, Attribut, Text-Knoten, Dokumenten-Knoten, Kommentar, PIsind Teil des Baumes, mit Eltern und
Kindern atomare Werte: String, Integer, Datum
usw.sind nicht Teil des Baumes
Sequencen bzw. Listen
© Ovidius Seite 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 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 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 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 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 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 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 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&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
• technische vs. fachliche Probleme• Schemata in OxygenXML einbinden• gefährlicher =-Operator• solved-Attribute
→ Agenda
Praxistipps
© Ovidius Seite 43
XSLT verwenden – Warum?
einfacher und übersichtlicher zu programmieren als reines XPath
zusätzliche Funktionen Zugriff auf vorhanden
Funktionsbibliotheken wie XSLT-SB
© Ovidius Seite 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 45
XSLT verwenden – Wie gehts?
2. Fremde Elemente bei der Schemaverarbeitung erlauben:
© Ovidius Seite 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>
05_SCH_mit_XSLT_key.sch example_01.xml
<?xml version="1.0" encoding="UTF-8"?><literatur> <buecher> […]
<buch xml:id="b3"> <autor ref="b1"/> <titel/> </buch> </buecher> <autoren> <person xml:id="p1"> <vorname>Thomas</vorname> <nachname>Mann</nachname> </person>
[…]
© Ovidius Seite 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"/>
<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 current()/@ref]/vorname, //person[@xml:id eq current()/@ref]/nachname) eq .">[p3] autor muss […] </assert> </rule> […]
06_SCH_mit_interner_XSLT-Funktion.sch example_01.xml
<?xml version="1.0" encoding="UTF-8"?><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</href> </buch> […] </buecher> <autoren> <person xml:id="p1"> <vorname>Thomas</vorname> <nachname>Mann</nachname> </person>[…]
© Ovidius Seite 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 current()/@ref]/vorname, //person[@xml:id eq current()/@ref]/nachname) eq .">[p3] autor muss […] </assert> </rule> […]07_SCH_mit_externer_XSLT-Funktion.sch example_01.xml
<?xml version="1.0" encoding="UTF-8"?><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</href> </buch> […] </buecher> <autoren> <person xml:id="p1"> <vorname>Thomas</vorname> <nachname>Mann</nachname> </person>[…]
© Ovidius Seite 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 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!