51
SCHEMATRON FÜR TECHNISCHE REDAKTEURE Stefan Krause – Ovidius GmbH, Berlin

Schematron für Technische Redakteure

Embed Size (px)

Citation preview

SCHEMATRON FÜR TECHNISCHE REDAKTEURE

Stefan Krause – Ovidius GmbH, Berlin

© 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

→ Agenda

Was kann Schematron?

© 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 10

demo.xml/demo.sch in OxygenXML

© Ovidius Seite 11

demo.xml/demo.sch in antillesXML

© 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.

→ Agenda

Schematron für Anfänger

© 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 16

Hello World in OxygenXML

© 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!

→ Agenda

XPath für Anfänger

© 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 …

→ Agenda

Diskussion

© 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

→ Agenda

Schematron für Fortgeschrittene

© 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&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

• technische vs. fachliche Probleme• Schemata in OxygenXML einbinden• gefährlicher =-Operator• solved-Attribute

→ Agenda

Praxistipps

→ Agenda

Schematron für Profis

© 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>[…]

• Fragen?• Diskussion?

→ Agenda

Diskussion

© 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!