Schematron für Technische Redakteure

575 Aufrufe

Veröffentlicht am

Erste Schritte mit Schematron und XPath. Workshop auf der tekom Herbsttagung 2014 in Stuttgart

Veröffentlicht in: Software
0 Kommentare
0 Gefällt mir
Statistik
Notizen
  • Als Erste(r) kommentieren

  • Gehören Sie zu den Ersten, denen das gefällt!

Keine Downloads
Aufrufe
Aufrufe insgesamt
575
Auf SlideShare
0
Aus Einbettungen
0
Anzahl an Einbettungen
3
Aktionen
Geteilt
0
Downloads
2
Kommentare
0
Gefällt mir
0
Einbettungen 0
Keine Einbettungen

Keine Notizen für die Folie
  • demo.xml, demo.sch
  • Schematron für Technische Redakteure

    1. 1. SCHEMATRON FÜR TECHNISCHE REDAKTEURE Stefan Krause – Ovidius GmbH, Berlin
    2. 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. 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. 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. 5. Was kann Schematron? → Agenda
    6. 6. Was kann Schematron I?  Texte inspizieren  verbotene Zeichen  »z.B.« vs. »z. B.«  Worte, die mit »u« anfangen © Ovidius Seite 6
    7. 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. 8. Was kann Schematron III?  informative, sachgerechte Fehlermeldungen ausgeben  mit beliebiger Detailliertheit  mit unterschiedlichen Schweregraden © Ovidius Seite 8
    9. 9. Was kann Schematron IV?  auf externe Dateien und WebServices lesend zugreifen  (in WebServices schreiben) © Ovidius Seite 9
    10. 10. demo.xml/demo.sch in OxygenXML © Ovidius Seite 10
    11. 11. demo.xml/demo.sch in antillesXML © Ovidius Seite 11
    12. 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. 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. 14. Schematron für Anfänger → Agenda
    15. 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. 16. Hello World in OxygenXML © Ovidius Seite 16
    17. 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. 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. 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. 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. 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. 22. XPath für Anfänger → Agenda
    23. 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. 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. 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. 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. 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. 28. seltsame Funktionen  text(), comment(), processing-instruction(), document-node(), node()  Dies sind auch Knotentests! © Ovidius Seite 28
    29. 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. 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. 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. 32. Diskussion → Agenda
    33. 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. 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. 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
    36. 36. Schematron für Fortgeschrittene → Agenda
    37. 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. 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. 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. 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. 41. Praxistipps • technische vs. fachliche Probleme • Schemata in OxygenXML einbinden • gefährlicher =-Operator • solved-Attribute → Agenda
    42. 42. Schematron für Profis → Agenda
    43. 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. 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. 45. XSLT verwenden – Wie gehts? 2. Fremde Elemente bei der Schemaverarbeitung erlauben: © Ovidius Seite 45
    46. 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. 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. 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. 49. Diskussion • Fragen? • Diskussion? → Agenda
    50. 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. 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

    ×