Weitere ähnliche Inhalte
Ähnlich wie Schematron für Technische Redakteure (20)
Schematron für Technische Redakteure
- 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
- 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
- 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
- 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
- 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&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
- 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
- demo.xml, demo.sch