SCHEMATRON IN DER            QUALITÄTSSICHERUNGWorkshop »Digitale Editionen – Methoden und Technologien                  f...
Gliederung• Allgemeines• Schematron    für Anfänger• Schematron    für Fortgeschrittene• Praxisbeispiele• Schematron    fü...
ALLGEMEINES
typischer Projektablauf• ggfs. Scannen• Vorlagen   sichten, Erfassungsanweisungen erstellen• Datenerfassung(bei Editura ty...
typischer Projektablauf• ggfs. Scannen• Vorlagen   sichten, Erfassungsanweisungen erstellen• Datenerfassung(bei Editura ty...
Kontrolle, Korrektur, Redaktion• Vollständigkeit• Fehlerfreiheit   der Texterfassung und des Tagging• Einhaltung   der Erf...
inhaltliche vs. technische Prüfung• inhaltlicheProbleme können nur durch intellektuelle Beurteilung gefunden werden• techn...
inhaltliche vs. technische Prüfung• inhaltlicheProbleme können nur durch intellektuelle Beurteilung gefunden werden• techn...
Fehler vs. Warnung• Fehler       verhindern die weitere Verarbeitung der Daten (Show-Stopper). Sie sind oft technisch bedi...
Wie entstehen Prüfwerkzeuge?• systematische Analyseder Erfassungsanweisung und Festlegung, mit welchem Werkzeug technische...
SCHEMATRON FÜR   ANFÄNGER
Warum Schematron I?• ManchePrüfungen lassen sich mit den anderen Schemaarten nicht oder nur schwer durchführen, z. B. • Ki...
Warum Schematron II?• Eskönnen aussagekräftige Fehlermeldungen formuliert werden.• Essind punktuelle Prüfungen möglich, d....
Was ist Schematron?• eine   Schema-Sprache für XML-Dokumente• ISO-Standard• basiert    auf XPath, mit dessen ganzer Mächti...
Hello World!                                                example_01.xml                                                ...
Hello World!Stefan Krause • Editura GmbH & Co. KG, Berlin • http://www.editura.de
Prüfung: report                                                           • gibt   eine Meldung aus,                      ...
Kontext: rule                                                           • bestimmt in @context                            ...
Gruppieren: pattern<?xml version="1.0" encoding="UTF-8"?><schema xmlns="http://purl.oclc.org/dsdl/schematron">!!    <patte...
Hello World!<?xml version="1.0" encoding="UTF-8"?><schema xmlns="http://purl.oclc.org/dsdl/schematron">! <pattern>! ! <rul...
erste »echte« Prüfung                                                          example_01.xml                             ...
erste »echte« Prüfung   Stefan Krause • Editura GmbH & Co. KG, Berlin • http://www.editura.de
auch Prüfung: assert                                   02_Erste_Prüfung.sch<?xml version="1.0" encoding="UTF-8"?><schema x...
auch Prüfung: assert                                   02_Erste_Prüfung.sch<?xml version="1.0" encoding="UTF-8"?><schema x...
mehrere Tests                                              example_01.xml                                 02_mehrere_Tests...
mehrere TestsStefan Krause • Editura GmbH & Co. KG, Berlin • http://www.editura.de
Namespaces: ns                                                                                       example_02_Dingler_Bd...
Namespaces: ns                                                                       example_02_Dingler_Bd-333.xml        ...
Namespaces: ns                                                                                      example_02_Dingler_Bd-...
Zwischenstand• Sechs      Elemente – schema, pattern, rule, assert/report, ns – genügen, um Schematron-Prüfungen zu schrei...
Tipp: Schema einbinden• zumeinfachen Validieren in OxygenXML kann das Schema in die XML-Datei eingebunden werden: • Dokume...
Tipp: Schema einbinden    Stefan Krause • Editura GmbH & Co. KG, Berlin • http://www.editura.de
Tipp: ein pattern, ein rule• Wenn man nicht ganz genau weiß, was man macht (Und wer weiß das schon?), gilt: • Je   pattern...
Tipp: Fehler-IDs vergeben• Esist gute Praxis, Meldungen mit einer ID zu versehen. • Prüfungs-Listen      lassen sich leich...
Tipp: Fehler-IDs vergeben<?xml version="1.0" encoding="UTF-8"?><schema xmlns="http://purl.oclc.org/dsdl/schematron">!!    ...
Tipp: Fehler vs. Warnung                                                  04_namespace_mit_Tipps.sch   example_02_Dingler_...
Tipp: Fehler vs. Warnung    Stefan Krause • Editura GmbH & Co. KG, Berlin • http://www.editura.de
SCHEMATRON FÜRFORTGESCHRITTENE
XPath 2.0                                                                          05_XPath_2_usw.sch• XPath     2.0 macht...
Vergleich mit externen Referenzen I•   ist ein XPath-Thema, nicht Schematron-spezifisch    <pattern>    !      <rule contex...
Vergleich mit externen Referenzen II•   doc() funktioniert auch mit Web-Services•   http://xisbn.worldcat.org/webservices/...
let + value-of<pattern>                                                   07_let_value-of.sch example_01.xml! <rule contex...
PRAXISBEISPIELE
Attribute ausgefüllt?                                                                    example_02_Dingler_Bd-333.xml<tei...
Kindelement vorhanden?                                                                     example_02_Dingler_Bd-333.xml<t...
Tipp: gefährlicher =-Operator                                                                    example_02_Dingler_Bd-333...
Element genau einmal vorhanden?<pattern>                                    08_Praxisbeispiele.sch example_02_Dingler_Bd-3...
interne Referenzen vorhanden?                                                                        example_02_Dingler_Bd...
externe Referenzen vorhanden?     <tei:pb n="interleaf" facs="32199908Z/00000004" xml:id="pj333_pbinterleaf_003"/><pattern...
SCHEMATRON FÜR PROFIS
xsl:key und key()<schema xmlns="http://purl.oclc.org/dsdl/schematron"                • Bei                                ...
xsl:key und key()<schema xmlns="http://purl.oclc.org/dsdl/schematron"                • Bei                                ...
xsl:key und key()<schema xmlns="http://purl.oclc.org/dsdl/schematron"                • Bei                                ...
xsl:key und key()<schema xmlns="http://purl.oclc.org/dsdl/schematron"                • Bei                                ...
Funktions-Definitionen I• Benutzerdefinierte        XPath-Funktionen ermöglichen: • die Wiederverwendung                von ...
Funktions-Definitionen II<schema xmlns="http://purl.oclc.org/dsdl/schematron"!   xmlns:xsl="http://www.w3.org/1999/XSL/Tran...
Funktions-Definitionen II<schema xmlns="http://purl.oclc.org/dsdl/schematron"!   xmlns:xsl="http://www.w3.org/1999/XSL/Tran...
Funktions-Definitionen II<schema xmlns="http://purl.oclc.org/dsdl/schematron"!   xmlns:xsl="http://www.w3.org/1999/XSL/Tran...
Funktions-Definitionen II<schema xmlns="http://purl.oclc.org/dsdl/schematron"!   xmlns:xsl="http://www.w3.org/1999/XSL/Tran...
Funktions-Definitionen II<schema xmlns="http://purl.oclc.org/dsdl/schematron"!   xmlns:xsl="http://www.w3.org/1999/XSL/Tran...
Funktions-Definitionen II<schema xmlns="http://purl.oclc.org/dsdl/schematron"!   xmlns:xsl="http://www.w3.org/1999/XSL/Tran...
Funktions-Definitionen II<schema xmlns="http://purl.oclc.org/dsdl/schematron"!   xmlns:xsl="http://www.w3.org/1999/XSL/Tran...
Funktions-Definitionen II<schema xmlns="http://purl.oclc.org/dsdl/schematron"!   xmlns:xsl="http://www.w3.org/1999/XSL/Tran...
Funktions-Definitionen IIIVoraussetzung: XSLT-Verarbeitung in Schematron muss freigeschaltet werden.Z. B. in OxygenXML: Opt...
externe Funktionen I• projektübergreifende         Standardfunktionen • wiederverwendbarer  Code, v. a. im Hinblick auf   ...
externe Funktionen II                          11_Funktionen_extern.sch                                                   ...
externe Funktionen II                          11_Funktionen_extern.sch                                                   ...
externe Funktionen II                          11_Funktionen_extern.sch                                                   ...
externe Funktionen II                          11_Funktionen_extern.sch                                                   ...
Tipp: solved-Attribute I• Ein    zusätzliches, optionales Attribut am Kontext-Element unterdrückt Schematron-Meldungen.• D...
Tipp: solved-Attribute II<schema xmlns="http://purl.oclc.org/dsdl/schematron"                                         12_s...
Tipp: solved-Attribute II<schema xmlns="http://purl.oclc.org/dsdl/schematron"                                         12_s...
Tipp: solved-Attribute II<schema xmlns="http://purl.oclc.org/dsdl/schematron"                                         12_s...
Tipp: solved-Attribute II<schema xmlns="http://purl.oclc.org/dsdl/schematron"                                         12_s...
Tipp: solved-Attribute II<schema xmlns="http://purl.oclc.org/dsdl/schematron"                                         12_s...
Schematron-Code-Prüfung I• Überprüfung, ob      Programmier-Regeln eingehalten werden • Regeln    müssen aufgestellt werde...
Schematron-Code-Prüfung II                                                                            13_Schematron_Test.s...
Heute nicht besprochen wurden• phase     zum logischen Aufteilen von Prüfungen,• include      zum Modularisieren,• diverse...
LITERATUR
Zum Weiterlesen• Marko Hedler/Manuel Montero Pineda/Nico Kutscherauer: Schematron. Effiziente Business Rules für XML-Dokume...
SCHEMATRON IN DER QUALITÄTSSICHERUNG   Herzlichen Dank für Ihre Aufmerksamkeit!                                           ...
FRAGEN?         PROJEKTE:     ÜBUNGEN, LÖSUNGENAnmerkung: Die folgenden Folien beziehen sich auf Fragen, diewährend des Pr...
Worte, die mit »u« beginnen                                                         Nicht_mit_u.sch               example_...
Warum sind = und != böse?<palette>!     <braun>!     !    <farbe>rot</farbe>!     !    <farbe>grün</farbe>!     </braun>! ...
Nächste SlideShare
Wird geladen in …5
×

Schematron in der Qualitätssicherung

641 Aufrufe

Veröffentlicht am

Einführung in die Schemasprache Schematron aus der Perspektive der Qualitätssicherung in Volltext-Digitalisierungsprojekten mit TEI

Veröffentlicht in: Bildung
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
641
Auf SlideShare
0
Aus Einbettungen
0
Anzahl an Einbettungen
3
Aktionen
Geteilt
0
Downloads
4
Kommentare
0
Gefällt mir
0
Einbettungen 0
Keine Einbettungen

Keine Notizen für die Folie
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • Schematron in der Qualitätssicherung

    1. 1. SCHEMATRON IN DER QUALITÄTSSICHERUNGWorkshop »Digitale Editionen – Methoden und Technologien für Fortgeschrittene« 10. Oktober 2012 Stefan Krause Editura GmbH & Co. KG, Berlin http://www.editura.de
    2. 2. Gliederung• Allgemeines• Schematron für Anfänger• Schematron für Fortgeschrittene• Praxisbeispiele• Schematron für Profis• Literatur• Fragen? Projekte: Übungen, Lösungen Stefan Krause • Editura GmbH & Co. KG, Berlin • http://www.editura.de
    3. 3. ALLGEMEINES
    4. 4. typischer Projektablauf• ggfs. Scannen• Vorlagen sichten, Erfassungsanweisungen erstellen• Datenerfassung(bei Editura typischerweise in Rumänien, Indien, China u. a.)• Projektbetreuung, Verfeinerung der Erfassungsanweisungen• Kontrolle, Korrektur, Redaktion• Auslieferung Stefan Krause • Editura GmbH & Co. KG, Berlin • http://www.editura.de
    5. 5. typischer Projektablauf• ggfs. Scannen• Vorlagen sichten, Erfassungsanweisungen erstellen• Datenerfassung(bei Editura typischerweise in Rumänien, Indien, China u. a.)• Projektbetreuung, Verfeinerung der Erfassungsanweisungen• Kontrolle, Korrektur, Redaktion• Auslieferung Stefan Krause • Editura GmbH & Co. KG, Berlin • http://www.editura.de
    6. 6. Kontrolle, Korrektur, Redaktion• Vollständigkeit• Fehlerfreiheit der Texterfassung und des Tagging• Einhaltung der Erfassungsanweisung• Korrekturen, Ergänzungen, Datenanreicherung, Verknüpfungen Stefan Krause • Editura GmbH & Co. KG, Berlin • http://www.editura.de
    7. 7. inhaltliche vs. technische Prüfung• inhaltlicheProbleme können nur durch intellektuelle Beurteilung gefunden werden• technische Probleme können mit technischen Hilfsmitteln geprüft werden, z.B. • XML-Schema, DTD, RNG • Schematron • Prüfskripte Stefan Krause • Editura GmbH & Co. KG, Berlin • http://www.editura.de
    8. 8. inhaltliche vs. technische Prüfung• inhaltlicheProbleme können nur durch intellektuelle Beurteilung gefunden werden• technische Probleme können mit technischen Hilfsmitteln geprüft werden, z.B. • XML-Schema, DTD, RNG • Schematron • Prüfskripte Stefan Krause • Editura GmbH & Co. KG, Berlin • http://www.editura.de
    9. 9. Fehler vs. Warnung• Fehler verhindern die weitere Verarbeitung der Daten (Show-Stopper). Sie sind oft technisch bedingt.• Warnungen können auf fehlende Informationen, unerwünschte Eigenschaften, hässliche Darstellung u.v.m. hinweisen, sind aber (irgendwie) tolerabel.• Dieser Unterschied sollte immer im Auge behalten werden. Alle Projektbeteiligten müssen diese Unterscheidung treffen können, was v. a. ein kommunikatives Problem ist. Stefan Krause • Editura GmbH & Co. KG, Berlin • http://www.editura.de
    10. 10. Wie entstehen Prüfwerkzeuge?• systematische Analyseder Erfassungsanweisung und Festlegung, mit welchem Werkzeug technische Prüfungen durchgeführt werden • Schema (XSD, RNG) • Schematron • spezielle Skripte und Prüfsoftware• laufende Ergänzung während der Projektlaufzeit Stefan Krause • Editura GmbH & Co. KG, Berlin • http://www.editura.de
    11. 11. SCHEMATRON FÜR ANFÄNGER
    12. 12. Warum Schematron I?• ManchePrüfungen lassen sich mit den anderen Schemaarten nicht oder nur schwer durchführen, z. B. • Kind-Elemente in Abhängigkeit von Attributen • fehlerhafte Textinhalte: »z.B.« vs. »z. B.« • Berechnungen Stefan Krause • Editura GmbH & Co. KG, Berlin • http://www.editura.de
    13. 13. Warum Schematron II?• Eskönnen aussagekräftige Fehlermeldungen formuliert werden.• Essind punktuelle Prüfungen möglich, d. h. es wird kein vollständiges Schema benötigt.• Schematron ist sehr gut in OxygenXML integriert.• (Trennung von Fehlern und Warnungen durch Aufteilung auf verschiedene Schemata.) Stefan Krause • Editura GmbH & Co. KG, Berlin • http://www.editura.de
    14. 14. Was ist Schematron?• eine Schema-Sprache für XML-Dokumente• ISO-Standard• basiert auf XPath, mit dessen ganzer Mächtigkeit• u. a. in XSLT implementiert und deshalb plattformunabhängig Stefan Krause • Editura GmbH & Co. KG, Berlin • http://www.editura.de
    15. 15. Hello World! example_01.xml <?xml version="1.0" encoding="UTF-8"?> <literatur> ! <buecher> ! ! <buch xml:id="b1"> ! ! ! <autor ref="p1">Mann, Thomas</autor> ! ! ! <titel>Der Zauberberg</titel> 01_Hello_World.sch ! ! ! <isbn>978-3-596-29433-6</isbn> ! ! ! <href>http://d-nb.info/942764498</href> ! ! </buch><?xml version="1.0" encoding="UTF-8"?> ! ! <buch xml:id="b2"><schema xmlns="http://purl.oclc.org/dsdl/schematron"> ! ! ! <autor ref="p2">Mann,Klaus</autor>! <pattern> ! ! ! <titel>Mephisto</titel>! ! <rule context="/"> ! ! ! <isbn>3 10 046705 1</isbn>! ! ! <report test="true()">Hello World!</report> ! ! ! <href>http://d nb.info/959653694</href>! ! </rule> ! ! </buch>! </pattern> ! ! <buch xml:id="b3"></schema> ! ! ! <autor ref="b1"></autor> ! ! ! <titel></titel> ! ! </buch> ! </buecher> ! <autoren> ! ! <person xml:id="p1"> ! ! ! <vorname>Thomas</vorname> ! ! ! <nachname>Mann</nachname> ! ! </person> ! ! <person xml:id="p2"> Stefan Krause • Editura GmbH & Co. KG, Berlin • http://www.editura.de
    16. 16. Hello World!Stefan Krause • Editura GmbH & Co. KG, Berlin • http://www.editura.de
    17. 17. Prüfung: report • gibt eine Meldung aus, • wenn die Bedingung in @test erfüllt ist<?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> • Inhalt von @test ist! </pattern></schema> ein XPath-Ausdruck. • DieMeldung kann frei formuliert werden. Stefan Krause • Editura GmbH & Co. KG, Berlin • http://www.editura.de
    18. 18. Kontext: rule • bestimmt in @context den Kontext für die enthaltenen Elemente<?xml version="1.0" encoding="UTF-8"?><schema xmlns="http://purl.oclc.org/dsdl/schematron"> • @context ist! <pattern>! ! <rule context="/"> üblicherweise ein Element, oder Attribut, z.B.! ! ! <report test="true()">Hello World!</report>! ! </rule>! </pattern></schema> context="buch" • vergleichbar zu xsl:template match="…" Stefan Krause • Editura GmbH & Co. KG, Berlin • http://www.editura.de
    19. 19. Gruppieren: pattern<?xml version="1.0" encoding="UTF-8"?><schema xmlns="http://purl.oclc.org/dsdl/schematron">!! <pattern> ! <rule context="/"> • gruppiert mehrere!! ! ! ! <report test="true()">Hello World!</report> </rule> rule-Elemente! </pattern></schema> Stefan Krause • Editura GmbH & Co. KG, Berlin • http://www.editura.de
    20. 20. 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> Stefan Krause • Editura GmbH & Co. KG, Berlin • http://www.editura.de
    21. 21. erste »echte« Prüfung example_01.xml <?xml version="1.0" encoding="UTF-8"?> <literatur> ! <buecher> ! ! <buch xml:id="b1"> ! ! ! <autor ref="p1">Mann, Thomas</autor> 02_Erste_Prüfung.sch ! ! ! <titel>Der Zauberberg</titel> ! ! ! <isbn>978-3-596-29433-7</isbn> ! ! ! <href>http://d-nb.info/942764498</href><?xml version="1.0" encoding="UTF-8"?> ! ! </buch><schema xmlns="http://purl.oclc.org/dsdl/schematron"> ! ! <buch xml:id="b2">! <pattern> ! ! ! <autor ref="p2">Mann,Klaus</autor>! ! <rule context="isbn"> ! ! ! <titel>Mephisto</titel> ! ! ! <isbn>3 10 046705 1</isbn>! ! ! <report test="not(contains(., -))">ISBNs ! ! ! <href>http://d nb.info/959653694</href>sollen mit Bindestrich geschrieben werden!</report> ! ! </buch>! ! </rule> ! ! <buch xml:id="b3">! </pattern> ! ! ! <autor ref="b1"></autor></schema> ! ! ! <titel></titel> ! ! </buch> ! </buecher> ! <autoren> ! ! <person xml:id="p1"> ! ! ! <vorname>Thomas</vorname> ! ! ! <nachname>Mann</nachname> ! ! </person> ! ! <person xml:id="p2"> Stefan Krause • Editura GmbH & Co. KG, Berlin • http://www.editura.de
    22. 22. erste »echte« Prüfung Stefan Krause • Editura GmbH & Co. KG, Berlin • http://www.editura.de
    23. 23. auch Prüfung: assert 02_Erste_Prüfung.sch<?xml version="1.0" encoding="UTF-8"?><schema xmlns="http://purl.oclc.org/dsdl/schematron">! <pattern>! ! <rule context="isbn">! ! ! <report test="not(contains(., -))">ISBNssollen mit Bindestrich geschrieben werden!</report>! ! </rule>! </pattern></schema> 02_Erste_Prüfung_mit_assert.sch<?xml version="1.0" encoding="UTF-8"?><schema xmlns="http://purl.oclc.org/dsdl/schematron">! <pattern>! ! <rule context="isbn">! ! ! <assert test="contains(., -)">ISBNs sollen mitBindestrich geschrieben werden!</assert>! ! </rule>! </pattern></schema> Stefan Krause • Editura GmbH & Co. KG, Berlin • http://www.editura.de
    24. 24. auch Prüfung: assert 02_Erste_Prüfung.sch<?xml version="1.0" encoding="UTF-8"?><schema xmlns="http://purl.oclc.org/dsdl/schematron">! <pattern> • not(…) ist umständlich! ! <rule context="isbn">! ! ! <report test="not(contains(., -))">ISBNssollen mit Bindestrich geschrieben werden!</report> • deshalb kann an Stelle!! ! </rule> </pattern> von report auch assert verwendet</schema> 02_Erste_Prüfung_mit_assert.sch<?xml version="1.0" encoding="UTF-8"?> werden<schema xmlns="http://purl.oclc.org/dsdl/schematron">!! <pattern> ! <rule context="isbn"> • gibt eine Meldung aus,! ! ! <assert test="contains(., -)">ISBNs sollen mitBindestrich geschrieben werden!</assert> wenn die Bedingung in!! ! </rule> </pattern></schema> @test nicht erfüllt ist Stefan Krause • Editura GmbH & Co. KG, Berlin • http://www.editura.de
    25. 25. mehrere Tests example_01.xml 02_mehrere_Tests.sch<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?><schema xmlns="http://purl.oclc.org/dsdl/schematron"> <literatur> ! <buecher>! ! ! <buch xml:id="b1">! <pattern> ! ! ! <autor ref="p1">Mann, Thomas</autor>! ! <rule context="isbn"> ! ! ! <titel>Der Zauberberg</titel>! ! ! <assert test="contains(., -)"> ! ! ! <isbn>978-3-596-29433-7</isbn>! ! ! ! ISBNs sollen mit Bindestrich ! ! ! <href>http://d-nb.info/942764498</href>! ! ! ! geschrieben werden!</assert> ! ! </buch>! ! ! <report test="string-length(.) != 17"> ! ! <buch xml:id="b2">! ! ! ! Es sollen ISBN-13 verwendet ! ! ! <autor ref="p2">Mann,Klaus</autor>! ! ! ! werden</report> ! ! ! <titel>Mephisto</titel> ! ! ! <isbn>3 10 046705 1</isbn>! ! </rule> ! ! ! <href>http://d nb.info/959653694</href>! </pattern> ! ! </buch> ! ! <buch xml:id="b3">! <pattern> ! ! ! <autor ref="b1"></autor>! ! <rule context="text()"> ! ! ! <titel></titel>! ! ! <report test="starts-with(., )"> ! ! </buch>! ! ! ! Text soll nicht mit Leerzeichen ! </buecher>! ! ! ! beginnen.</report> ! <autoren>! ! </rule> ! ! <person xml:id="p1"> ! ! ! <vorname>Thomas</vorname>! </pattern> ! ! ! <nachname>Mann</nachname> ! ! </person></schema> ! ! <person xml:id="p2"> Stefan Krause • Editura GmbH & Co. KG, Berlin • http://www.editura.de
    26. 26. mehrere TestsStefan Krause • Editura GmbH & Co. KG, Berlin • http://www.editura.de
    27. 27. Namespaces: ns example_02_Dingler_Bd-333.xml 04_namespace.sch <?xml version="1.0" encoding="UTF-8"?><?xml version="1.0" encoding="UTF-8"?> <tei:TEI xmlns:tei="http://www.tei-c.org/ns/1.0"<schema xmlns="http://purl.oclc.org/dsdl/schematron"> xml:lang="de-DE">! ! <tei:teiHeader>! <ns prefix="tei" uri="http://www.tei-c.org/ns/1.0"/> ! ! <tei:fileDesc>! ! ! ! <tei:titleStmt>! <pattern> ! ! ! ! <tei:title type="_main">Dingler-Online |! ! <rule context=" Das digitalisierte Polytechnische Journal</tei:title>! /tei:TEI/tei:teiHeader/tei:fileDesc/tei:titleStmt"> ! ! ! ! <tei:title type="_sub">Band 333,! ! ! <assert test="tei:title[@type = main]"> Jahrgang 1918</tei:title>! ! ! ! Es muss ein title-Element mit ! ! ! </tei:titleStmt>! ! ! ! @type="main" geben</assert> ! ! ! <tei:publicationStmt>! ! </rule> ! ! ! ! <tei:publisher>Humboldt-Universität! </pattern> ! ! ! ! </tei:publisher>! <pattern> ! ! ! ! <tei:pubPlace>Berlin</tei:pubPlace>! ! <rule context=" ! ! ! ! <tei:date when="2012"/>! /tei:TEI/tei:teiHeader/tei:fileDesc/tei:titleStmt"> ! ! ! </tei:publicationStmt>! ! ! <assert test="tei:title[@type = sub]"> ! ! ! <tei:seriesStmt>! ! ! ! Es muss ein title-Element mit ! ! ! ! <tei:title level="j">Dingler-Online | Das! ! ! ! @type="sub" geben</assert> digitalisierte Polytechnische Journal</tei:title>! ! </rule> ! ! ! ! <tei:respStmt>! </pattern> ! ! ! ! ! <tei:resp>Projektträger:</tei:resp></schema> ! ! ! ! ! <tei:name xml:id="HU">Humboldt- Stefan Krause • Editura GmbH & Co. KG, Berlin • http://www.editura.de
    28. 28. Namespaces: ns example_02_Dingler_Bd-333.xml 04_namespace.sch<?xml version="1.0" encoding="UTF-8"?><schema xmlns="http://purl.oclc.org/dsdl/schematron">!! <ns prefix="tei" uri="http://www.tei-c.org/ns/1.0"/>!! <pattern>! ! <rule context="! /tei:TEI/tei:teiHeader/tei:fileDesc/tei:titleStmt">! ! ! <assert test="tei:title[@type = main]">! ! ! ! Es muss ein title-Element mit! ! ! ! @type="main" geben</assert>! ! </rule>! </pattern>! <pattern>! ! <rule context="! /tei:TEI/tei:teiHeader/tei:fileDesc/tei:titleStmt">! ! ! <assert test="tei:title[@type = sub]">! ! ! ! Es muss ein title-Element mit! ! ! ! @type="sub" geben</assert>! ! </rule>! </pattern></schema> Stefan Krause • Editura GmbH & Co. KG, Berlin • http://www.editura.de
    29. 29. Namespaces: ns example_02_Dingler_Bd-333.xml 04_namespace.sch <?xml version="1.0" encoding="UTF-8"?><?xml version="1.0" encoding="UTF-8"?> <TEI xmlns="http://www.tei-c.org/ns/1.0" xml:lang="de-<schema xmlns="http://purl.oclc.org/dsdl/schematron"> DE">! ! <teiHeader>! <ns prefix="tei" uri="http://www.tei-c.org/ns/1.0"/> ! ! <fileDesc>! ! ! ! <titleStmt>! <pattern> ! ! ! ! <title type="_main">Dingler-Online | Das! ! <rule context=" digitalisierte Polytechnische Journal</title>! /tei:TEI/tei:teiHeader/tei:fileDesc/tei:titleStmt"> ! ! ! ! <title type="_sub">Band 333, Jahrgang! ! ! <assert test="tei:title[@type = main]"> 1918</title>! ! ! ! Es muss ein title-Element mit ! ! ! </titleStmt>! ! ! ! @type="main" geben</assert> ! ! ! <publicationStmt>! ! </rule> ! ! ! ! <publisher>Humboldt-Universität! </pattern> ! ! ! ! </publisher>! <pattern> ! ! ! ! <pubPlace>Berlin</pubPlace>! ! <rule context=" ! ! ! ! <date when="2012"/>! /tei:TEI/tei:teiHeader/tei:fileDesc/tei:titleStmt"> ! ! ! </publicationStmt>! ! ! <assert test="tei:title[@type = sub]"> ! ! ! <seriesStmt>! ! ! ! Es muss ein title-Element mit ! ! ! ! <title level="j">Dingler-Online | Das! ! ! ! @type="sub" geben</assert> digitalisierte Polytechnische Journal</title>! ! </rule> ! ! ! ! <respStmt>! </pattern> ! ! ! ! ! <resp>Projektträger:</resp></schema> ! ! ! ! ! <name xml:id="HU">Humboldt- Stefan Krause • Editura GmbH & Co. KG, Berlin • http://www.editura.de
    30. 30. Zwischenstand• Sechs Elemente – schema, pattern, rule, assert/report, ns – genügen, um Schematron-Prüfungen zu schreiben.• Die Mächtigkeit entsteht durch XPath.• So schwer ist das doch gar nicht! Stefan Krause • Editura GmbH & Co. KG, Berlin • http://www.editura.de
    31. 31. Tipp: Schema einbinden• zumeinfachen Validieren in OxygenXML kann das Schema in die XML-Datei eingebunden werden: • Dokument Schema Schema zuweisen… • Schema auswählen & bestätigen <?xml version="1.0" encoding="UTF-8"?> <?xml-model href="03_mehrere_Tests.sch" type="application/xml" schematypens="http://purl.oclc.org/dsdl/schematron"?> <literatur> ! <buecher> ! ! <buch xml:id="b1"> ! ! ! <autor ref="p1">Mann, Thomas</autor> Stefan Krause • Editura GmbH & Co. KG, Berlin • http://www.editura.de
    32. 32. Tipp: Schema einbinden Stefan Krause • Editura GmbH & Co. KG, Berlin • http://www.editura.de
    33. 33. Tipp: ein pattern, ein rule• Wenn man nicht ganz genau weiß, was man macht (Und wer weiß das schon?), gilt: • Je pattern-Element eine rule-Element! • Mehrere assert/report in einer rule sind OK. Stefan Krause • Editura GmbH & Co. KG, Berlin • http://www.editura.de
    34. 34. Tipp: Fehler-IDs vergeben• Esist gute Praxis, Meldungen mit einer ID zu versehen. • Prüfungs-Listen lassen sich leichter überblicken. • Meldungen sind eindeutig. • Die Quelle einer Meldung im Schematron ist eindeutig. • Externe Fehlerbeschreibungen sind eindeutig. Stefan Krause • Editura GmbH & Co. KG, Berlin • http://www.editura.de
    35. 35. Tipp: Fehler-IDs vergeben<?xml version="1.0" encoding="UTF-8"?><schema xmlns="http://purl.oclc.org/dsdl/schematron">!! <ns prefix="tei" uri="http://www.tei-c.org/ns/1.0"/>!! <pattern>! ! <rule context="/tei:TEI/tei:teiHeader/tei:fileDesc/tei:titleStmt">! ! ! <assert test="tei:title[@type = main]">[E001] Es muss ein title-Elementmit @type="main" geben</assert>! ! </rule>! </pattern>! <pattern>! ! <rule context="/tei:TEI/tei:teiHeader/tei:fileDesc/tei:titleStmt">! ! ! <assert test="tei:title[@type = sub]">[E002] Es muss ein title-Elementmit @type="sub" geben</assert>! ! </rule>! </pattern></schema> Stefan Krause • Editura GmbH & Co. KG, Berlin • http://www.editura.de
    36. 36. Tipp: Fehler vs. Warnung 04_namespace_mit_Tipps.sch example_02_Dingler_Bd-333.xml <?xml version="1.0" encoding="UTF-8"?> <schema xmlns="http://purl.oclc.org/dsdl/schematron"> ! <ns prefix="tei" uri="http://www.tei-c.org/ns/1.0"/> ! ! <pattern> ! ! <rule context="/tei:TEI/tei:teiHeader/tei:fileDesc/tei:titleStmt"> ! ! ! <assert test="tei:title[@type = main]" role="ERROR"> ! ! ! ! ! ! [E001] Es muss ein title-Element mit @type="main" geben</assert> ! ! </rule> ! </pattern> ! ! <pattern> ! ! <rule context="/tei:TEI/tei:teiHeader/tei:fileDesc/tei:titleStmt"> ! ! ! <assert test="tei:title[@type = sub]" role="WARNING"> ! ! ! ! ! ! [W001] Es sollte ein title-Element mit @type="sub" geben</assert> ! ! </rule> ! </pattern> </schema>• Mögliche Werte für @role in OxygenXML: fatal, error, warn/warning, info/information Stefan Krause • Editura GmbH & Co. KG, Berlin • http://www.editura.de
    37. 37. Tipp: Fehler vs. Warnung Stefan Krause • Editura GmbH & Co. KG, Berlin • http://www.editura.de
    38. 38. SCHEMATRON FÜRFORTGESCHRITTENE
    39. 39. XPath 2.0 05_XPath_2_usw.sch• XPath 2.0 macht das Leben vieeeel einfacher. <schema xmlns="http://purl.oclc.org/dsdl/schematron" queryBinding="xslt2">• dann funktionieren auch wichtige Funktionen wie matches(), tokenize() und Operatoren wie every … in … satisfies … Stefan Krause • Editura GmbH & Co. KG, Berlin • http://www.editura.de
    40. 40. Vergleich mit externen Referenzen I• ist ein XPath-Thema, nicht Schematron-spezifisch <pattern> ! <rule context="tei:sourceDesc/tei:biblStruct/tei:monogr/tei:idno[@type eq local]"> ! ! ! <assert test="doc(resolve-uri(referenz.xml, base-uri(.) ) )//band[idno/text() ! ! ! ! ! ! ! ! ! ! ! ! ! ! ! eq current()/text()]"> ! ! ! [E002] Band-ID nicht in externer Referenz gefunden ! ! </assert> ! </rule> </pattern> 05_XPath_2_usw.sch example_02_Dingler_Bd-333.xml• externe xml-Datei mit doc()• resolve-uri(), um den Pfad zu finden (Alternative: absolute URL)• current(), weil der Kontext während der Evaluierung des XPath mit doc() vom aktuellen Knoten wegbewegt wurde Stefan Krause • Editura GmbH & Co. KG, Berlin • http://www.editura.de
    41. 41. Vergleich mit externen Referenzen II• doc() funktioniert auch mit Web-Services• http://xisbn.worldcat.org/webservices/xid/isbn/ 978-3-596-29433-7?method=fixChecksum&format=xml liefert <rsp xmlns="http://worldcat.org/xid/isbn/" stat="ok"> ! <isbn>978-3-596-29433-6</isbn> </rsp>• Schematron: 06_WebService_nutzen.sch example_01.xml <pattern> ! <rule context="isbn[string-length(.) eq 17]"> ! ! <assert test=". eq doc( ! ! ! concat(http://xisbn.worldcat.org/webservices/xid/isbn/, ., ! ! ! ! ?method=fixChecksum&amp;format=xml) )/*/*:isbn"> ! ! ! [E025] ungültige ISBN</assert> ! </rule> </pattern> Stefan Krause • Editura GmbH & Co. KG, Berlin • http://www.editura.de
    42. 42. let + value-of<pattern> 07_let_value-of.sch example_01.xml! <rule context="isbn[string-length(.) eq 17]">! ! <let name="result"! ! ! value="doc(concat(http://xisbn.worldcat.org/webservices/xid/isbn/, .,! ! ! ?method=fixChecksum&amp;format=xml) )/*/*:isbn"/>! ! <assert test=". eq $result" role="ERROR">! ! ! [E025] ungültige ISBN, erwartet »<value-of select="$result"/>«! ! </assert>! </rule></pattern> • let definiert Variable • value-of gibt den • bessere Übersicht Wert eines XPath- • Wiederverwend- Ausdruckes aus barkeit • Variablenname analog zu XSLT Stefan Krause • Editura GmbH & Co. KG, Berlin • http://www.editura.de
    43. 43. PRAXISBEISPIELE
    44. 44. Attribute ausgefüllt? example_02_Dingler_Bd-333.xml<tei:text type="issue" n="15" xml:id="is333015">[…]<pattern> 08_Praxisbeispiele.sch! <rule context="tei:text">! ! <assert test="normalize-space(@xml:id)" role="ERROR">! ! ! ! ! ! ! ! [E001] @xml:id muss ausgefüllt werden</assert>! ! <assert test="normalize-space(@type)" role="ERROR">! ! ! ! ! ! ! ! [E002] @type muss ausgefüllt werden</assert>! </rule></pattern> Stefan Krause • Editura GmbH & Co. KG, Berlin • http://www.editura.de
    45. 45. Kindelement vorhanden? example_02_Dingler_Bd-333.xml<tei:text type="volume" xml:lang="german" n="333" xml:id="pj333"><tei:milestone type="additional-counting" subtype="age-group"! ! ! ! ! ! ! ! ed="Sechsundsiebzigster Jahrgang" unit="volume" n="333"/>[…] 08_Praxisbeispiele.sch<pattern>! ! <rule context="tei:text[@type eq volume ]">! ! ! <assert test="tei:milestone[! ! ! ! ! ! ! ! @type eq additional-counting and! ! ! ! ! ! ! ! @subtype eq age-group and! ! ! ! ! ! ! ! @unit eq volume ]" role="WARNING">! ! ! [W001] tei:milestone[@type eq additional-counting and! ! ! @subtype eq age-group and @unit eq volume ] fehlt</assert>! ! </rule></pattern>! Stefan Krause • Editura GmbH & Co. KG, Berlin • http://www.editura.de
    46. 46. Tipp: gefährlicher =-Operator example_02_Dingler_Bd-333.xml<tei:div type="misc_undef" xml:id="mi333is14_1">[…]<tei:div type="patent">[…]<pattern>! <rule context="tei:div[@type = (misc_undef, patent)]"> 08_Praxisbeispiele.sch! ! <assert test="normalize-space(@xml:id)" role="ERROR">! ! ! ! ! ! ! ! ! ! ! ! [E011] @xml:id muss ausgefüllt werden</assert>! </rule></pattern>! • Wenn man nicht ganz genau weiß, was man macht (Und wer weiß das schon?), gilt: Niemals den =-Operator verwenden, immer eq! • siehe auch letzte Folie Stefan Krause • Editura GmbH & Co. KG, Berlin • http://www.editura.de
    47. 47. Element genau einmal vorhanden?<pattern> 08_Praxisbeispiele.sch example_02_Dingler_Bd-333.xml! <rule context="tei:TEI">! ! <let name="volumes" value="//tei:text[@type eq volume ]"/>! ! <assert test="$volumes" role="ERROR">! ! ! ! ! ! ! ! ! ! ! [E021] tei:text[@type eq volume ] fehlt</assert>! ! <report test="$volumes[2]" role="ERROR">! ! ! ! ! ! ! ! ! [E022] mehr als ein tei:text[@type eq volume]</report>! ! !! !! ! <let name="titlePages" value="$volumes//tei:titlePage[@type eq volume ]"/>! ! <assert test="$titlePages" role="ERROR">! ! ! ! ! [E023] tei:text[@type eq volume ]//tei:titlePage[@type eq volume ]! ! ! ! ! fehlt</assert>! ! <report test="$titlePages[2]" role="ERROR">! ! ! ! ! [E024] mehr als ein! ! ! ! ! tei:text[@type eq volume ]//tei:titlePage[@type eq volume ]</report>! </rule></pattern> Stefan Krause • Editura GmbH & Co. KG, Berlin • http://www.editura.de
    48. 48. interne Referenzen vorhanden? example_02_Dingler_Bd-333.xml<tei:rendition xml:id="large" scheme="css">font-size: large;</rendition><tei:rendition xml:id="bold" scheme="css">font-weight: bold</rendition>[…]<tei:p rendition="#bold #large">[…]<pattern> 08_Praxisbeispiele.sch! <rule context="@*[starts-with(., #)]">! ! <let name="idrefs" value="for $i in tokenize(., [ ])[normalize-space(.)]! ! ! return translate($i, #, )"/>! ! <assert test="every $idref in $idrefs satisfies //@xml:id[. eq $idref]">! ! ! [E031] fehlende(s) //@xml:id für »<value-of select="."/>«</assert>! </rule></pattern> Stefan Krause • Editura GmbH & Co. KG, Berlin • http://www.editura.de
    49. 49. externe Referenzen vorhanden? <tei:pb n="interleaf" facs="32199908Z/00000004" xml:id="pj333_pbinterleaf_003"/><pattern> example_02_Dingler_Bd-333.xml! <rule context="@facs[normalize-space(.)]">! ! <let name="filename" 08_Praxisbeispiele.sch! ! ! value="concat(substring-after(., /), .png)"/>! ! <let name="listed_files"! ! ! value="doc(resolve-uri(files.xml, base-uri(.) ) )//Datei/Name[. eq $filename]"/>! ! <assert test="$listed_files" role="ERROR">! ! ! ! ! ! [E041] referenzierte Datei »<value-of select="$filename"/>«! ! ! ! ! ! nicht in Dateiliste verzeichnet</assert>! </rule></pattern>• mit durch externes Tool generiertem files.xml: <root> ! <Verzeichnis> files.xml ! ! <Name>32199908Z</Name> ! ! <Datei> ! ! ! <Name>00000001.png</Name> Stefan Krause • Editura GmbH & Co. KG, Berlin • http://www.editura.de
    50. 50. SCHEMATRON FÜR PROFIS
    51. 51. xsl:key und key()<schema xmlns="http://purl.oclc.org/dsdl/schematron" • Bei sehr vielen! xmlns:xsl="http://www.w3.org/1999/XSL/Transform"! queryBinding="xslt2"> Referenzen können Keys einen!! <ns prefix="tei" uri="http://www.tei-c.org/ns/1.0"/>!! <xsl:key name="xml-IDs" match="@xml:id" use="."/> Geschwindigkeits-!! <pattern> vorteil bringen.! ! <rule context="@*[starts-with(., #)]">!! ! ! ! ! <let name="idrefs" value=" ! for $i in tokenize(., [ ])[normalize-space(.)] • Schematron »borgt«!! ! ! ! ! ! ! <assert return translate($i, #, )"/> sich Keys von XSLT.! ! ! ! test="every $idref in $idrefs!! ! ! ! ! ! ! ! ! satisfies key(xml-IDs, $idref)" role="ERROR"> • Dazumuss der XSLT-!! ! ! ! ! ! ! ! ! [E031] fehlende(s) //@xml:id(s) für »<value-of select="."/>«</assert> Namespace in! ! </rule> Schematron bekannt gemacht werden.! </pattern> 09_keys.sch example_02_Dingler_Bd-333.xml</schema> Stefan Krause • Editura GmbH & Co. KG, Berlin • http://www.editura.de
    52. 52. xsl:key und key()<schema xmlns="http://purl.oclc.org/dsdl/schematron" • Bei sehr vielen! xmlns:xsl="http://www.w3.org/1999/XSL/Transform"! queryBinding="xslt2"> Referenzen können Keys einen!! <ns prefix="tei" uri="http://www.tei-c.org/ns/1.0"/>!! <xsl:key name="xml-IDs" match="@xml:id" use="."/> Geschwindigkeits-!! <pattern> vorteil bringen.! ! <rule context="@*[starts-with(., #)]">!! ! ! ! ! <let name="idrefs" value=" ! for $i in tokenize(., [ ])[normalize-space(.)] • Schematron »borgt«!! ! ! ! ! ! ! <assert return translate($i, #, )"/> sich Keys von XSLT.! ! ! ! test="every $idref in $idrefs!! ! ! ! ! ! ! ! ! satisfies key(xml-IDs, $idref)" role="ERROR"> • Dazumuss der XSLT-!! ! ! ! ! ! ! ! ! [E031] fehlende(s) //@xml:id(s) für »<value-of select="."/>«</assert> Namespace in! ! </rule> Schematron bekannt gemacht werden.! </pattern> 09_keys.sch example_02_Dingler_Bd-333.xml</schema> Stefan Krause • Editura GmbH & Co. KG, Berlin • http://www.editura.de
    53. 53. xsl:key und key()<schema xmlns="http://purl.oclc.org/dsdl/schematron" • Bei sehr vielen! xmlns:xsl="http://www.w3.org/1999/XSL/Transform"! queryBinding="xslt2"> Referenzen können Keys einen!! <ns prefix="tei" uri="http://www.tei-c.org/ns/1.0"/>!! <xsl:key name="xml-IDs" match="@xml:id" use="."/> Geschwindigkeits-!! <pattern> vorteil bringen.! ! <rule context="@*[starts-with(., #)]">!! ! ! ! ! <let name="idrefs" value=" ! for $i in tokenize(., [ ])[normalize-space(.)] • Schematron »borgt«!! ! ! ! ! ! ! <assert return translate($i, #, )"/> sich Keys von XSLT.! ! ! ! test="every $idref in $idrefs!! ! ! ! ! ! ! ! ! satisfies key(xml-IDs, $idref)" role="ERROR"> • Dazumuss der XSLT-!! ! ! ! ! ! ! ! ! [E031] fehlende(s) //@xml:id(s) für »<value-of select="."/>«</assert> Namespace in! ! </rule> Schematron bekannt gemacht werden.! </pattern> 09_keys.sch example_02_Dingler_Bd-333.xml</schema> Stefan Krause • Editura GmbH & Co. KG, Berlin • http://www.editura.de
    54. 54. xsl:key und key()<schema xmlns="http://purl.oclc.org/dsdl/schematron" • Bei sehr vielen! xmlns:xsl="http://www.w3.org/1999/XSL/Transform"! queryBinding="xslt2"> Referenzen können Keys einen!! <ns prefix="tei" uri="http://www.tei-c.org/ns/1.0"/>!! <xsl:key name="xml-IDs" match="@xml:id" use="."/> Geschwindigkeits-!! <pattern> vorteil bringen.! ! <rule context="@*[starts-with(., #)]">!! ! ! ! ! <let name="idrefs" value=" ! for $i in tokenize(., [ ])[normalize-space(.)] • Schematron »borgt«!! ! ! ! ! ! ! <assert return translate($i, #, )"/> sich Keys von XSLT.! ! ! ! test="every $idref in $idrefs!! ! ! ! ! ! ! ! ! satisfies key(xml-IDs, $idref)" role="ERROR"> • Dazumuss der XSLT-!! ! ! ! ! ! ! ! ! [E031] fehlende(s) //@xml:id(s) für »<value-of select="."/>«</assert> Namespace in! ! </rule> Schematron bekannt gemacht werden.! </pattern> 09_keys.sch example_02_Dingler_Bd-333.xml</schema> Stefan Krause • Editura GmbH & Co. KG, Berlin • http://www.editura.de
    55. 55. Funktions-Definitionen I• Benutzerdefinierte XPath-Funktionen ermöglichen: • die Wiederverwendung von Code, • die Aufteilung komplizierter Berechnungen, • damit mehr Übersicht und • bessere Wartbarkeit. Stefan Krause • Editura GmbH & Co. KG, Berlin • http://www.editura.de
    56. 56. Funktions-Definitionen II<schema xmlns="http://purl.oclc.org/dsdl/schematron"! xmlns:xsl="http://www.w3.org/1999/XSL/Transform"! queryBinding="xslt2">!! <ns prefix="my" uri="irgendeine_gueltige_URI"/>!! <xsl:function name="my:ids" as="xs:string*">! ! <xsl:param name="idref-string" as="xs:string?"/>! ! <xsl:sequence select="for $i in tokenize($idref-string, [ ])[normalize-space(.)]! ! ! ! ! ! ! ! ! ! ! ! ! ! return translate($i, #, )"/>! </xsl:function>!! <pattern>! ! <rule context="@*[starts-with(., #)]">! ! ! <let name="idrefs" value="my:ids(.)"/>! ! ! <assert test="every $idref in $idrefs satisfies //@xml:id[. eq $idref]">! ! ! ! ! [E031] fehlende(s) //@xml:id für »<value-of select="."/>«</assert>! ! </rule>! </pattern> 10_Funktionen_intern.sch example_02_Dingler_Bd-333.xml</schema> Stefan Krause • Editura GmbH & Co. KG, Berlin • http://www.editura.de
    57. 57. Funktions-Definitionen II<schema xmlns="http://purl.oclc.org/dsdl/schematron"! xmlns:xsl="http://www.w3.org/1999/XSL/Transform"! queryBinding="xslt2">!! <ns prefix="my" uri="irgendeine_gueltige_URI"/>!! <xsl:function name="my:ids" as="xs:string*">! ! <xsl:param name="idref-string" as="xs:string?"/>! ! <xsl:sequence select="for $i in tokenize($idref-string, [ ])[normalize-space(.)]! ! ! ! ! ! ! ! ! ! ! ! ! ! return translate($i, #, )"/>! </xsl:function>!! <pattern>! ! <rule context="@*[starts-with(., #)]">! ! ! <let name="idrefs" value="my:ids(.)"/>! ! ! <assert test="every $idref in $idrefs satisfies //@xml:id[. eq $idref]">! ! ! ! ! [E031] fehlende(s) //@xml:id für »<value-of select="."/>«</assert>! ! </rule>! </pattern> 10_Funktionen_intern.sch example_02_Dingler_Bd-333.xml</schema> Stefan Krause • Editura GmbH & Co. KG, Berlin • http://www.editura.de
    58. 58. Funktions-Definitionen II<schema xmlns="http://purl.oclc.org/dsdl/schematron"! xmlns:xsl="http://www.w3.org/1999/XSL/Transform"! queryBinding="xslt2">!! <ns prefix="my" uri="irgendeine_gueltige_URI"/>!! <xsl:function name="my:ids" as="xs:string*">! ! <xsl:param name="idref-string" as="xs:string?"/>! ! <xsl:sequence select="for $i in tokenize($idref-string, [ ])[normalize-space(.)]! ! ! ! ! ! ! ! ! ! ! ! ! ! return translate($i, #, )"/>! </xsl:function>!! <pattern>! ! <rule context="@*[starts-with(., #)]">! ! ! <let name="idrefs" value="my:ids(.)"/>! ! ! <assert test="every $idref in $idrefs satisfies //@xml:id[. eq $idref]">! ! ! ! ! [E031] fehlende(s) //@xml:id für »<value-of select="."/>«</assert>! ! </rule>! </pattern> 10_Funktionen_intern.sch example_02_Dingler_Bd-333.xml</schema> Stefan Krause • Editura GmbH & Co. KG, Berlin • http://www.editura.de
    59. 59. Funktions-Definitionen II<schema xmlns="http://purl.oclc.org/dsdl/schematron"! xmlns:xsl="http://www.w3.org/1999/XSL/Transform"! queryBinding="xslt2">!! <ns prefix="my" uri="irgendeine_gueltige_URI"/>!! <xsl:function name="my:ids" as="xs:string*">! ! <xsl:param name="idref-string" as="xs:string?"/>! ! <xsl:sequence select="for $i in tokenize($idref-string, [ ])[normalize-space(.)]! ! ! ! ! ! ! ! ! ! ! ! ! ! return translate($i, #, )"/>! </xsl:function>!! <pattern>! ! <rule context="@*[starts-with(., #)]">! ! ! <let name="idrefs" value="my:ids(.)"/>! ! ! <assert test="every $idref in $idrefs satisfies //@xml:id[. eq $idref]">! ! ! ! ! [E031] fehlende(s) //@xml:id für »<value-of select="."/>«</assert>! ! </rule>! </pattern> 10_Funktionen_intern.sch example_02_Dingler_Bd-333.xml</schema> Stefan Krause • Editura GmbH & Co. KG, Berlin • http://www.editura.de
    60. 60. Funktions-Definitionen II<schema xmlns="http://purl.oclc.org/dsdl/schematron"! xmlns:xsl="http://www.w3.org/1999/XSL/Transform"! queryBinding="xslt2">!! <ns prefix="my" uri="irgendeine_gueltige_URI"/>!! <xsl:function name="my:ids" as="xs:string*">! ! <xsl:param name="idref-string" as="xs:string?"/>! ! <xsl:sequence select="for $i in tokenize($idref-string, [ ])[normalize-space(.)]! ! ! ! ! ! ! ! ! ! ! ! ! ! return translate($i, #, )"/>! </xsl:function>!! <pattern>! ! <rule context="@*[starts-with(., #)]">! ! ! <let name="idrefs" value="my:ids(.)"/>! ! ! <assert test="every $idref in $idrefs satisfies //@xml:id[. eq $idref]">! ! ! ! ! [E031] fehlende(s) //@xml:id für »<value-of select="."/>«</assert>! ! </rule>! </pattern> 10_Funktionen_intern.sch example_02_Dingler_Bd-333.xml</schema> Stefan Krause • Editura GmbH & Co. KG, Berlin • http://www.editura.de
    61. 61. Funktions-Definitionen II<schema xmlns="http://purl.oclc.org/dsdl/schematron"! xmlns:xsl="http://www.w3.org/1999/XSL/Transform"! queryBinding="xslt2">!! <ns prefix="my" uri="irgendeine_gueltige_URI"/>!! <xsl:function name="my:ids" as="xs:string*">! ! <xsl:param name="idref-string" as="xs:string?"/>! ! <xsl:sequence select="for $i in tokenize($idref-string, [ ])[normalize-space(.)]! ! ! ! ! ! ! ! ! ! ! ! ! ! return translate($i, #, )"/>! </xsl:function>!! <pattern>! ! <rule context="@*[starts-with(., #)]">! ! ! <let name="idrefs" value="my:ids(.)"/>! ! ! <assert test="every $idref in $idrefs satisfies //@xml:id[. eq $idref]">! ! ! ! ! [E031] fehlende(s) //@xml:id für »<value-of select="."/>«</assert>! ! </rule>! </pattern> 10_Funktionen_intern.sch example_02_Dingler_Bd-333.xml</schema> Stefan Krause • Editura GmbH & Co. KG, Berlin • http://www.editura.de
    62. 62. Funktions-Definitionen II<schema xmlns="http://purl.oclc.org/dsdl/schematron"! xmlns:xsl="http://www.w3.org/1999/XSL/Transform"! queryBinding="xslt2">!! <ns prefix="my" uri="irgendeine_gueltige_URI"/>!! <xsl:function name="my:ids" as="xs:string*">! ! <xsl:param name="idref-string" as="xs:string?"/>! ! <xsl:sequence select="for $i in tokenize($idref-string, [ ])[normalize-space(.)]! ! ! ! ! ! ! ! ! ! ! ! ! ! return translate($i, #, )"/>! </xsl:function>!! <pattern>! ! <rule context="@*[starts-with(., #)]">! ! ! <let name="idrefs" value="my:ids(.)"/>! ! ! <assert test="every $idref in $idrefs satisfies //@xml:id[. eq $idref]">! ! ! ! ! [E031] fehlende(s) //@xml:id für »<value-of select="."/>«</assert>! ! </rule>! </pattern> 10_Funktionen_intern.sch example_02_Dingler_Bd-333.xml</schema> Stefan Krause • Editura GmbH & Co. KG, Berlin • http://www.editura.de
    63. 63. Funktions-Definitionen II<schema xmlns="http://purl.oclc.org/dsdl/schematron"! xmlns:xsl="http://www.w3.org/1999/XSL/Transform"! queryBinding="xslt2">!! <ns prefix="my" uri="irgendeine_gueltige_URI"/>!! <xsl:function name="my:ids" as="xs:string*">! ! <xsl:param name="idref-string" as="xs:string?"/>! ! <xsl:sequence select="for $i in tokenize($idref-string, [ ])[normalize-space(.)]! ! ! ! ! ! ! ! ! ! ! ! ! ! return translate($i, #, )"/>! </xsl:function>!! <pattern>! ! <rule context="@*[starts-with(., #)]">! ! ! <let name="idrefs" value="my:ids(.)"/>! ! ! <assert test="every $idref in $idrefs satisfies //@xml:id[. eq $idref]">! ! ! ! ! [E031] fehlende(s) //@xml:id für »<value-of select="."/>«</assert>! ! </rule>! </pattern> 10_Funktionen_intern.sch example_02_Dingler_Bd-333.xml</schema> Stefan Krause • Editura GmbH & Co. KG, Berlin • http://www.editura.de
    64. 64. Funktions-Definitionen IIIVoraussetzung: XSLT-Verarbeitung in Schematron muss freigeschaltet werden.Z. B. in OxygenXML: Optionen Einstellungen XML XML-ParserFremde Elemente erlauben (allow-foreign) Stefan Krause • Editura GmbH & Co. KG, Berlin • http://www.editura.de
    65. 65. externe Funktionen I• projektübergreifende Standardfunktionen • wiederverwendbarer Code, v. a. im Hinblick auf XSLT, mit dem die Daten verarbeitet werden sollen• fremde Funktionsbibliotheken• Auf externe XSLT-Dateien können XSLT-Prüf- werkzeuge angewendet werden (z. B. XSpec). Stefan Krause • Editura GmbH & Co. KG, Berlin • http://www.editura.de
    66. 66. externe Funktionen II 11_Funktionen_extern.sch my-functions.xsl<?xml version="1.0" encoding="UTF-8"?><schema xmlns="http://purl.oclc.org/dsdl/schematron"! xmlns:xsl="http://www.w3.org/1999/XSL/Transform" <?xml version="1.0" encoding="UTF-8"?>! queryBinding="xslt2"> <xsl:stylesheet! ! xmlns:xsl="http://www.w3.org/1999/XSL/Transform"! <xsl:include href="my-functions.xsl"/> ! xmlns:xs="http://www.w3.org/2001/XMLSchema"! ! xmlns:my="irgendeine_gueltige_URI"! <ns prefix="my" uri="irgendeine_gueltige_URI"/> ! exclude-result-prefixes="#all"! ! version="2.0">! <pattern> !! ! <rule context="@*[starts-with(., #)]"> ! <xsl:function name="my:ids" as="xs:string*">! ! ! <let name="idrefs" value="my:ids(.)"/> ! ! <xsl:param name="idref-string" as="xs:string?"/>! ! ! <assert ! ! <xsl:sequence! ! ! ! test="every $idref in $idrefs satisfies ! ! ! select="for $i in tokenize($idref-string, [ ])! ! ! ! /@xml:id[. eq $idref]" ! ! ! ! ! ! ! ! [normalize-space(.)]role="ERROR"> ! ! ! ! ! ! return translate($i, #, )"/>! ! ! ! [E031] fehlende(s) //@xml:id für ! </xsl:function>! ! ! ! ! »<value-of select="."/>«</ !assert> </xsl:stylesheet>! ! </rule>! </pattern></schema> Stefan Krause • Editura GmbH & Co. KG, Berlin • http://www.editura.de
    67. 67. externe Funktionen II 11_Funktionen_extern.sch my-functions.xsl<?xml version="1.0" encoding="UTF-8"?><schema xmlns="http://purl.oclc.org/dsdl/schematron"! xmlns:xsl="http://www.w3.org/1999/XSL/Transform" <?xml version="1.0" encoding="UTF-8"?>! queryBinding="xslt2"> <xsl:stylesheet! ! xmlns:xsl="http://www.w3.org/1999/XSL/Transform"! <xsl:include href="my-functions.xsl"/> ! xmlns:xs="http://www.w3.org/2001/XMLSchema"! ! xmlns:my="irgendeine_gueltige_URI"! <ns prefix="my" uri="irgendeine_gueltige_URI"/> ! exclude-result-prefixes="#all"! ! version="2.0">! <pattern> !! ! <rule context="@*[starts-with(., #)]"> ! <xsl:function name="my:ids" as="xs:string*">! ! ! <let name="idrefs" value="my:ids(.)"/> ! ! <xsl:param name="idref-string" as="xs:string?"/>! ! ! <assert ! ! <xsl:sequence! ! ! ! test="every $idref in $idrefs satisfies ! ! ! select="for $i in tokenize($idref-string, [ ])! ! ! ! /@xml:id[. eq $idref]" ! ! ! ! ! ! ! ! [normalize-space(.)]role="ERROR"> ! ! ! ! ! ! return translate($i, #, )"/>! ! ! ! [E031] fehlende(s) //@xml:id für ! </xsl:function>! ! ! ! ! »<value-of select="."/>«</ !assert> </xsl:stylesheet>! ! </rule>! </pattern></schema> Stefan Krause • Editura GmbH & Co. KG, Berlin • http://www.editura.de
    68. 68. externe Funktionen II 11_Funktionen_extern.sch my-functions.xsl<?xml version="1.0" encoding="UTF-8"?><schema xmlns="http://purl.oclc.org/dsdl/schematron"! xmlns:xsl="http://www.w3.org/1999/XSL/Transform" <?xml version="1.0" encoding="UTF-8"?>! queryBinding="xslt2"> <xsl:stylesheet! ! xmlns:xsl="http://www.w3.org/1999/XSL/Transform"! <xsl:include href="my-functions.xsl"/> ! xmlns:xs="http://www.w3.org/2001/XMLSchema"! ! xmlns:my="irgendeine_gueltige_URI"! <ns prefix="my" uri="irgendeine_gueltige_URI"/> ! exclude-result-prefixes="#all"! ! version="2.0">! <pattern> !! ! <rule context="@*[starts-with(., #)]"> ! <xsl:function name="my:ids" as="xs:string*">! ! ! <let name="idrefs" value="my:ids(.)"/> ! ! <xsl:param name="idref-string" as="xs:string?"/>! ! ! <assert ! ! <xsl:sequence! ! ! ! test="every $idref in $idrefs satisfies ! ! ! select="for $i in tokenize($idref-string, [ ])! ! ! ! /@xml:id[. eq $idref]" ! ! ! ! ! ! ! ! [normalize-space(.)]role="ERROR"> ! ! ! ! ! ! return translate($i, #, )"/>! ! ! ! [E031] fehlende(s) //@xml:id für ! </xsl:function>! ! ! ! ! »<value-of select="."/>«</ !assert> </xsl:stylesheet>! ! </rule>! </pattern></schema> Stefan Krause • Editura GmbH & Co. KG, Berlin • http://www.editura.de
    69. 69. externe Funktionen II 11_Funktionen_extern.sch my-functions.xsl<?xml version="1.0" encoding="UTF-8"?><schema xmlns="http://purl.oclc.org/dsdl/schematron"! xmlns:xsl="http://www.w3.org/1999/XSL/Transform" <?xml version="1.0" encoding="UTF-8"?>! queryBinding="xslt2"> <xsl:stylesheet! ! xmlns:xsl="http://www.w3.org/1999/XSL/Transform"! <xsl:include href="my-functions.xsl"/> ! xmlns:xs="http://www.w3.org/2001/XMLSchema"! ! xmlns:my="irgendeine_gueltige_URI"! <ns prefix="my" uri="irgendeine_gueltige_URI"/> ! exclude-result-prefixes="#all"! ! version="2.0">! <pattern> !! ! <rule context="@*[starts-with(., #)]"> ! <xsl:function name="my:ids" as="xs:string*">! ! ! <let name="idrefs" value="my:ids(.)"/> ! ! <xsl:param name="idref-string" as="xs:string?"/>! ! ! <assert ! ! <xsl:sequence! ! ! ! test="every $idref in $idrefs satisfies ! ! ! select="for $i in tokenize($idref-string, [ ])! ! ! ! /@xml:id[. eq $idref]" ! ! ! ! ! ! ! ! [normalize-space(.)]role="ERROR"> ! ! ! ! ! ! return translate($i, #, )"/>! ! ! ! [E031] fehlende(s) //@xml:id für ! </xsl:function>! ! ! ! ! »<value-of select="."/>«</ !assert> </xsl:stylesheet>! ! </rule>! </pattern></schema> Stefan Krause • Editura GmbH & Co. KG, Berlin • http://www.editura.de
    70. 70. Tipp: solved-Attribute I• Ein zusätzliches, optionales Attribut am Kontext-Element unterdrückt Schematron-Meldungen.• Das Attribut wird mit einem je assert/report definierten Token befüllt, wenn die Fehlermeldung unterdrückt werden soll, z.B. <TEI solved="MissingTitlePage">[…].• Damittauchen gelöste Fälle bei späteren Prüfungen nicht mehr auf. Stefan Krause • Editura GmbH & Co. KG, Berlin • http://www.editura.de
    71. 71. Tipp: solved-Attribute II<schema xmlns="http://purl.oclc.org/dsdl/schematron" 12_solved-attribut.sch! xmlns:xsl="http://www.w3.org/1999/XSL/Transform"! queryBinding="xslt2">! <ns prefix="my" uri="irgendeine_gueltige_URI"/>! <ns prefix="tei" uri="http://www.tei-c.org/ns/1.0"/>! <xsl:function name="my:solved" as="xs:boolean">! ! <xsl:param name="solved-string" as="xs:string?"/>! ! <xsl:param name="searched-token" as="xs:string"/>! ! <xsl:choose>! ! ! <xsl:when test="some $i in tokenize($solved-string, s) satisfies ($i eq $searched-token)">! ! ! ! <xsl:sequence select="true()"/>! ! ! </xsl:when>! ! ! <xsl:otherwise>! ! ! ! <xsl:sequence select="false()"/>! ! ! </xsl:otherwise>! ! </xsl:choose>! </xsl:function>! <pattern>! ! <rule context="tei:TEI">! ! ! <let name="volumes" value="//tei:text[@type eq volume ]"/>! ! ! <let name="titlePages" value="$volumes//tei:titlePage[@type eq volume ]"/>! ! ! <assert test="$titlePages or my:solved(@solved, MissingTitlePage)" role="WARNING">[W023]tei:text[@type eq volume ]//tei:titlePage[@type eq volume ] fehlt (Solved-Token: »MissingTitlePage«)</assert>! ! ! <report test="$titlePages[2] and not(my:solved(@solved, MoreThanOneTitlePage))"role="WARNING">[W024] mehr als ein tei:text[@type eq volume ]//tei:titlePage[@type eq volume ] (Solved-Token:»MoreThanOneTitlePage«)</report>! ! </rule>! </pattern></schema> Stefan Krause • Editura GmbH & Co. KG, Berlin • http://www.editura.de
    72. 72. Tipp: solved-Attribute II<schema xmlns="http://purl.oclc.org/dsdl/schematron" 12_solved-attribut.sch! xmlns:xsl="http://www.w3.org/1999/XSL/Transform"! queryBinding="xslt2">! <ns prefix="my" uri="irgendeine_gueltige_URI"/>! <ns prefix="tei" uri="http://www.tei-c.org/ns/1.0"/>! <xsl:function name="my:solved" as="xs:boolean">! ! <xsl:param name="solved-string" as="xs:string?"/>! ! <xsl:param name="searched-token" as="xs:string"/>! ! <xsl:choose>! ! ! <xsl:when test="some $i in tokenize($solved-string, s) satisfies ($i eq $searched-token)">! ! ! ! <xsl:sequence select="true()"/>! ! ! </xsl:when>! ! ! <xsl:otherwise>! ! ! ! <xsl:sequence select="false()"/>! ! ! </xsl:otherwise>! ! </xsl:choose>! </xsl:function>! <pattern>! ! <rule context="tei:TEI">! ! ! <let name="volumes" value="//tei:text[@type eq volume ]"/>! ! ! <let name="titlePages" value="$volumes//tei:titlePage[@type eq volume ]"/>! ! ! <assert test="$titlePages or my:solved(@solved, MissingTitlePage)" role="WARNING">[W023]tei:text[@type eq volume ]//tei:titlePage[@type eq volume ] fehlt (Solved-Token: »MissingTitlePage«)</assert>! ! ! <report test="$titlePages[2] and not(my:solved(@solved, MoreThanOneTitlePage))"role="WARNING">[W024] mehr als ein tei:text[@type eq volume ]//tei:titlePage[@type eq volume ] (Solved-Token:»MoreThanOneTitlePage«)</report>! ! </rule>! </pattern></schema> Stefan Krause • Editura GmbH & Co. KG, Berlin • http://www.editura.de
    73. 73. Tipp: solved-Attribute II<schema xmlns="http://purl.oclc.org/dsdl/schematron" 12_solved-attribut.sch! xmlns:xsl="http://www.w3.org/1999/XSL/Transform"! queryBinding="xslt2">! <ns prefix="my" uri="irgendeine_gueltige_URI"/>! <ns prefix="tei" uri="http://www.tei-c.org/ns/1.0"/>! <xsl:function name="my:solved" as="xs:boolean">! ! <xsl:param name="solved-string" as="xs:string?"/>! ! <xsl:param name="searched-token" as="xs:string"/>! ! <xsl:choose>! ! ! <xsl:when test="some $i in tokenize($solved-string, s) satisfies ($i eq $searched-token)">! ! ! ! <xsl:sequence select="true()"/>! ! ! </xsl:when>! ! ! <xsl:otherwise>! ! ! ! <xsl:sequence select="false()"/>! ! ! </xsl:otherwise>! ! </xsl:choose>! </xsl:function>! <pattern>! ! <rule context="tei:TEI">! ! ! <let name="volumes" value="//tei:text[@type eq volume ]"/>! ! ! <let name="titlePages" value="$volumes//tei:titlePage[@type eq volume ]"/>! ! ! <assert test="$titlePages or my:solved(@solved, MissingTitlePage)" role="WARNING">[W023]tei:text[@type eq volume ]//tei:titlePage[@type eq volume ] fehlt (Solved-Token: »MissingTitlePage«)</assert>! ! ! <report test="$titlePages[2] and not(my:solved(@solved, MoreThanOneTitlePage))"role="WARNING">[W024] mehr als ein tei:text[@type eq volume ]//tei:titlePage[@type eq volume ] (Solved-Token:»MoreThanOneTitlePage«)</report>! ! </rule>! </pattern></schema> Stefan Krause • Editura GmbH & Co. KG, Berlin • http://www.editura.de
    74. 74. Tipp: solved-Attribute II<schema xmlns="http://purl.oclc.org/dsdl/schematron" 12_solved-attribut.sch! xmlns:xsl="http://www.w3.org/1999/XSL/Transform"! queryBinding="xslt2">! <ns prefix="my" uri="irgendeine_gueltige_URI"/>! <ns prefix="tei" uri="http://www.tei-c.org/ns/1.0"/>! <xsl:function name="my:solved" as="xs:boolean">! ! <xsl:param name="solved-string" as="xs:string?"/>! ! <xsl:param name="searched-token" as="xs:string"/>! ! <xsl:choose>! ! ! <xsl:when test="some $i in tokenize($solved-string, s) satisfies ($i eq $searched-token)">! ! ! ! <xsl:sequence select="true()"/>! ! ! </xsl:when>! ! ! <xsl:otherwise>! ! ! ! <xsl:sequence select="false()"/>! ! ! </xsl:otherwise>! ! </xsl:choose>! </xsl:function>! <pattern>! ! <rule context="tei:TEI">! ! ! <let name="volumes" value="//tei:text[@type eq volume ]"/>! ! ! <let name="titlePages" value="$volumes//tei:titlePage[@type eq volume ]"/>! ! ! <assert test="$titlePages or my:solved(@solved, MissingTitlePage)" role="WARNING">[W023]tei:text[@type eq volume ]//tei:titlePage[@type eq volume ] fehlt (Solved-Token: »MissingTitlePage«)</assert>! ! ! <report test="$titlePages[2] and not(my:solved(@solved, MoreThanOneTitlePage))"role="WARNING">[W024] mehr als ein tei:text[@type eq volume ]//tei:titlePage[@type eq volume ] (Solved-Token:»MoreThanOneTitlePage«)</report>! ! </rule>! </pattern></schema> Stefan Krause • Editura GmbH & Co. KG, Berlin • http://www.editura.de
    75. 75. Tipp: solved-Attribute II<schema xmlns="http://purl.oclc.org/dsdl/schematron" 12_solved-attribut.sch! xmlns:xsl="http://www.w3.org/1999/XSL/Transform"! queryBinding="xslt2">! <ns prefix="my" uri="irgendeine_gueltige_URI"/>! <ns prefix="tei" uri="http://www.tei-c.org/ns/1.0"/>! <xsl:function name="my:solved" as="xs:boolean">! ! <xsl:param name="solved-string" as="xs:string?"/>! ! <xsl:param name="searched-token" as="xs:string"/>! ! <xsl:choose>! ! ! <xsl:when test="some $i in tokenize($solved-string, s) satisfies ($i eq $searched-token)">! ! ! ! <xsl:sequence select="true()"/>! ! ! </xsl:when>! ! ! <xsl:otherwise>! ! ! ! <xsl:sequence select="false()"/>! ! ! </xsl:otherwise>! ! </xsl:choose>! </xsl:function>! <pattern>! ! <rule context="tei:TEI">! ! ! <let name="volumes" value="//tei:text[@type eq volume ]"/>! ! ! <let name="titlePages" value="$volumes//tei:titlePage[@type eq volume ]"/>! ! ! <assert test="$titlePages or my:solved(@solved, MissingTitlePage)" role="WARNING">[W023]tei:text[@type eq volume ]//tei:titlePage[@type eq volume ] fehlt (Solved-Token: »MissingTitlePage«)</assert>! ! ! <report test="$titlePages[2] and not(my:solved(@solved, MoreThanOneTitlePage))"role="WARNING">[W024] mehr als ein tei:text[@type eq volume ]//tei:titlePage[@type eq volume ] (Solved-Token:»MoreThanOneTitlePage«)</report>! ! </rule>! </pattern></schema> Stefan Krause • Editura GmbH & Co. KG, Berlin • http://www.editura.de
    76. 76. Schematron-Code-Prüfung I• Überprüfung, ob Programmier-Regeln eingehalten werden • Regeln müssen aufgestellt werden, z. B. • jedes assert oder report muss ein @role haben muss einen der Werte fatal, • @role error, warn/warning, info/ information haben Stefan Krause • Editura GmbH & Co. KG, Berlin • http://www.editura.de
    77. 77. Schematron-Code-Prüfung II 13_Schematron_Test.sch<sch:schema xmlns:sch="http://purl.oclc.org/dsdl/schematron"! queryBinding="xslt2">! <sch:ns prefix="sch" uri="http://purl.oclc.org/dsdl/schematron"/>! <sch:pattern>! ! <sch:rule context="sch:assert|sch:report">! ! ! <sch:assert test="normalize-space(@role)" role="WARNING">! ! ! ! ! [W001] Jedes assert und report soll ein @role haben!</sch:assert>! ! </sch:rule>! </sch:pattern>! <sch:pattern>! ! <sch:rule context="sch:assert/@role|sch:report/@role">! ! ! <sch:assert test="! ! ! ! some $i in (fatal, error, warn, info) satisfies ($i eq lower-case(.) )"> [W002] @role muss einer der Werte »fatal«, »error«, »warn«, »info« sein!</sch:assert>! ! </sch:rule>! </sch:pattern></sch:schema> Stefan Krause • Editura GmbH & Co. KG, Berlin • http://www.editura.de
    78. 78. Heute nicht besprochen wurden• phase zum logischen Aufteilen von Prüfungen,• include zum Modularisieren,• diverse Möglichkeiten zur Formatierung,• abstrakte rules und pattern• u. a.,• aber diese Möglichkeiten von Schematron wird man vielleicht nicht so schnell brauchen. Stefan Krause • Editura GmbH & Co. KG, Berlin • http://www.editura.de
    79. 79. LITERATUR
    80. 80. Zum Weiterlesen• 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 Blogbeiträge unter http:// blog.expedimentum.com/kategorien/xml- validierung/schematron/ Stefan Krause • Editura GmbH & Co. KG, Berlin • http://www.editura.de
    81. 81. SCHEMATRON IN DER QUALITÄTSSICHERUNG Herzlichen Dank für Ihre Aufmerksamkeit! Stefan Krause Editura GmbH & Co. KG, Berlin http://www.editura.de
    82. 82. FRAGEN? PROJEKTE: ÜBUNGEN, LÖSUNGENAnmerkung: Die folgenden Folien beziehen sich auf Fragen, diewährend des Präsentation gestellt wurden, und waren deshalb imoriginalen Vortrag nicht enthalten.
    83. 83. Worte, die mit »u« beginnen Nicht_mit_u.sch example_02_Dingler_Bd-333.xml<schema! xmlns="http://purl.oclc.org/dsdl/schematron"! xmlns:xsl="http://www.w3.org/1999/XSL/Transform"! queryBinding="xslt2">!! <ns prefix="my" uri="irgendeine_gueltige_URI"/>!! <ns prefix="tei" uri="http://www.tei-c.org/ns/1.0"/>!! <xsl:include href="my-functions.xsl"/>!! <pattern>! ! <rule context="tei:text//text()">! ! ! <let name="gesuchter_wortanfang" value="u"/>! ! ! <assert test="every $i in tokenize(., ) satisfies not(starts-with($i, $gesuchter_wortanfang))">! ! ! ! Wörter dürfen nicht mit »<value-of select="$gesuchter_wortanfang"/>« beginnen. Kontext:! ! ! ! »<value-of select="my:render(., $gesuchter_wortanfang)"/>«</assert>! ! </rule>! </pattern></schema>• Das Darstellen einer Fundstelle als übersichtliche Wortgruppe ist relativ aufwendig und wurde daher in die externen XSLT-Funktionen ausgelagert. Stefan Krause • Editura GmbH & Co. KG, Berlin • http://www.editura.de
    84. 84. Warum sind = und != böse?<palette>! <braun>! ! <farbe>rot</farbe>! ! <farbe>grün</farbe>! </braun>! <orange>! ! <farbe>rot</farbe>! ! <farbe>gelb</farbe>! </orange></palette>• /palette/braun//text() = /palette/orange//text() evaluiert zu true()• /palette/braun//text() != /palette/orange//text() evaluiert zu true()• alternativ in Sequenz-Schreibweise der atomaren Werte: • (rot, grün) = (rot, gelb) evaluiert zu true() • (rot, grün) != (rot, gelb) evaluiert zu true() • Bonus (rot, rot) != (rot) evaluiert zu false()• Bei Verwendung von eq oder ne wird dagegen ein Fehler erzeugt.• Bei Mischung von ungetypten und (implizit) getypten Werten sowie in Verbindung mit Leersequenzen gibt es weitere Merkwürdigkeiten.• zum Hintergrund: http://www.w3.org/TR/xpath20/#id-comparisons Stefan Krause • Editura GmbH & Co. KG, Berlin • http://www.editura.de

    ×