Schematron für Technische Redakteure

744 Aufrufe

Veröffentlicht am

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

Veröffentlicht in: Software
  • Als Erste(r) kommentieren

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

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

×