SlideShare ist ein Scribd-Unternehmen logo
1 von 84
SCHEMATRON IN DER
            QUALITÄTSSICHERUNG

Workshop »Digitale Editionen – Methoden und Technologien
                  für Fortgeschrittene«

                   10. Oktober 2012




                                                  Stefan Krause
                                 Editura GmbH & Co. KG, Berlin
                                          http://www.editura.de
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
ALLGEMEINES
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
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
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
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
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
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
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
SCHEMATRON FÜR
   ANFÄNGER
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
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
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
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
Hello World!




Stefan Krause • Editura GmbH & Co. KG, Berlin • http://www.editura.de
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
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
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
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
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
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 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>
                           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 mit
Bindestrich geschrieben werden!</assert>
!   !    </rule>
!   </pattern>
</schema>




                                   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 xmlns="http://purl.oclc.org/dsdl/schematron">
!    <pattern>
                                                                 • not(…)    ist umständlich
!    !   <rule context="isbn">
!    !   !    <report test="not(contains(., '-'))">ISBNs
sollen 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 mit
Bindestrich 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
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
mehrere Tests




Stefan Krause • Editura GmbH & Co. KG, Berlin • http://www.editura.de
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
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
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
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
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
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-Element eine rule-Element!
 • Mehrere   assert/report in einer rule
  sind OK.



              Stefan Krause • Editura GmbH & Co. KG, Berlin • http://www.editura.de
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
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-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']">[E002] Es muss ein title-Element
mit @type="sub" geben</assert>
!     !   </rule>
!     </pattern>
</schema>


                       Stefan Krause • Editura GmbH & Co. KG, Berlin • http://www.editura.de
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
Tipp: Fehler vs. Warnung




    Stefan Krause • Editura GmbH & Co. KG, Berlin • http://www.editura.de
SCHEMATRON FÜR
FORTGESCHRITTENE
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
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
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
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
PRAXISBEISPIELE
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
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
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
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
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
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
SCHEMATRON FÜR PROFIS
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
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
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
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
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
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
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
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
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
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
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
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
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
Funktions-Definitionen III




Voraussetzung: XSLT-Verarbeitung in Schematron muss freigeschaltet werden.
Z. B. in OxygenXML: Optionen Einstellungen XML XML-Parser
Fremde Elemente erlauben (allow-foreign)

                    Stefan Krause • Editura GmbH & Co. KG, Berlin • http://www.editura.de
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
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
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
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
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
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
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
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
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
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
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
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
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
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
LITERATUR
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
SCHEMATRON IN DER QUALITÄTSSICHERUNG

   Herzlichen Dank für Ihre Aufmerksamkeit!




                                            Stefan Krause
                           Editura GmbH & Co. KG, Berlin
                                    http://www.editura.de
FRAGEN?

         PROJEKTE:
     ÜBUNGEN, LÖSUNGEN

Anmerkung: Die folgenden Folien beziehen sich auf Fragen, die
während des Präsentation gestellt wurden, und waren deshalb im
originalen Vortrag nicht enthalten.
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
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

Weitere ähnliche Inhalte

Andere mochten auch

Presentacion Master LGP
Presentacion Master LGPPresentacion Master LGP
Presentacion Master LGPzeuszeus31
 
Jung in NRW 2014 - Ergebnispräsentation - cc-by2014 www.datajockey.eu
Jung in NRW 2014 - Ergebnispräsentation - cc-by2014 www.datajockey.euJung in NRW 2014 - Ergebnispräsentation - cc-by2014 www.datajockey.eu
Jung in NRW 2014 - Ergebnispräsentation - cc-by2014 www.datajockey.euSimon Schnetzer
 
Gut hinsehen und zuhören b zg a
Gut hinsehen und zuhören b zg aGut hinsehen und zuhören b zg a
Gut hinsehen und zuhören b zg aKlinikum Lippe GmbH
 
Metallica aprendiz digital
Metallica aprendiz digitalMetallica aprendiz digital
Metallica aprendiz digitalsddaniel
 
Ethernet Switching Easterhegg 2007
Ethernet Switching Easterhegg 2007Ethernet Switching Easterhegg 2007
Ethernet Switching Easterhegg 2007Falk Stern
 
Bmw bike r1200 gs_adventure_katalog
Bmw bike r1200 gs_adventure_katalogBmw bike r1200 gs_adventure_katalog
Bmw bike r1200 gs_adventure_katalogCowboy's Thoughts
 
Für Silbermünzen ab 2014 doch keine 19% Mehrwertsteuer dank Differenzbesteuerung
Für Silbermünzen ab 2014 doch keine 19% Mehrwertsteuer dank DifferenzbesteuerungFür Silbermünzen ab 2014 doch keine 19% Mehrwertsteuer dank Differenzbesteuerung
Für Silbermünzen ab 2014 doch keine 19% Mehrwertsteuer dank Differenzbesteuerunggoldsilbershopde
 
Principios en el estudio de los trastornos del (1)
Principios en el estudio de los trastornos del (1)Principios en el estudio de los trastornos del (1)
Principios en el estudio de los trastornos del (1)Santos_Gabriel48
 
Hotel Lindenhof Katalog 2014
Hotel Lindenhof  Katalog 2014Hotel Lindenhof  Katalog 2014
Hotel Lindenhof Katalog 2014Dolcevita Hotels
 
Leal_mijares_presentacion_final
Leal_mijares_presentacion_finalLeal_mijares_presentacion_final
Leal_mijares_presentacion_finaljesusmijares96
 
Panorama des reseaux sociaux
Panorama des reseaux sociauxPanorama des reseaux sociaux
Panorama des reseaux sociauxLaurine Jouve
 
Augmented Reality: Die nächste Dimension im Mobile Marketing, Webinale Edition
Augmented Reality: Die nächste Dimension im Mobile Marketing, Webinale EditionAugmented Reality: Die nächste Dimension im Mobile Marketing, Webinale Edition
Augmented Reality: Die nächste Dimension im Mobile Marketing, Webinale EditionBokowsky + Laymann GmbH
 
Projet1 boiteaoutilsdecheteries
Projet1 boiteaoutilsdecheteriesProjet1 boiteaoutilsdecheteries
Projet1 boiteaoutilsdecheteriesnorent
 
Creation et lancement d’un nouveau produit
Creation et lancement d’un nouveau produitCreation et lancement d’un nouveau produit
Creation et lancement d’un nouveau produitMichel GOUGOU
 
Senacip discours du ministre de l'unité nationale et de la citoyenneté
Senacip discours du ministre de l'unité nationale et de la citoyennetéSenacip discours du ministre de l'unité nationale et de la citoyenneté
Senacip discours du ministre de l'unité nationale et de la citoyennetéFatoumata Chérif
 
Vertragsmanagement am SharePoint mit ecspand
Vertragsmanagement am SharePoint mit ecspandVertragsmanagement am SharePoint mit ecspand
Vertragsmanagement am SharePoint mit ecspandChristian Kiesewetter
 
Présentation CPI 2016 Bibliothèque de semences : Bibliothèque publique de Wes...
Présentation CPI 2016 Bibliothèque de semences : Bibliothèque publique de Wes...Présentation CPI 2016 Bibliothèque de semences : Bibliothèque publique de Wes...
Présentation CPI 2016 Bibliothèque de semences : Bibliothèque publique de Wes...Valérie Rioux
 
Los idiotas - Lars Von Trier 1998
Los idiotas - Lars Von Trier 1998Los idiotas - Lars Von Trier 1998
Los idiotas - Lars Von Trier 1998Sergi Megiias
 

Andere mochten auch (20)

Presentacion Master LGP
Presentacion Master LGPPresentacion Master LGP
Presentacion Master LGP
 
Jung in NRW 2014 - Ergebnispräsentation - cc-by2014 www.datajockey.eu
Jung in NRW 2014 - Ergebnispräsentation - cc-by2014 www.datajockey.euJung in NRW 2014 - Ergebnispräsentation - cc-by2014 www.datajockey.eu
Jung in NRW 2014 - Ergebnispräsentation - cc-by2014 www.datajockey.eu
 
Gut hinsehen und zuhören b zg a
Gut hinsehen und zuhören b zg aGut hinsehen und zuhören b zg a
Gut hinsehen und zuhören b zg a
 
Metallica aprendiz digital
Metallica aprendiz digitalMetallica aprendiz digital
Metallica aprendiz digital
 
Ethernet Switching Easterhegg 2007
Ethernet Switching Easterhegg 2007Ethernet Switching Easterhegg 2007
Ethernet Switching Easterhegg 2007
 
Bmw bike r1200 gs_adventure_katalog
Bmw bike r1200 gs_adventure_katalogBmw bike r1200 gs_adventure_katalog
Bmw bike r1200 gs_adventure_katalog
 
Für Silbermünzen ab 2014 doch keine 19% Mehrwertsteuer dank Differenzbesteuerung
Für Silbermünzen ab 2014 doch keine 19% Mehrwertsteuer dank DifferenzbesteuerungFür Silbermünzen ab 2014 doch keine 19% Mehrwertsteuer dank Differenzbesteuerung
Für Silbermünzen ab 2014 doch keine 19% Mehrwertsteuer dank Differenzbesteuerung
 
Principios en el estudio de los trastornos del (1)
Principios en el estudio de los trastornos del (1)Principios en el estudio de los trastornos del (1)
Principios en el estudio de los trastornos del (1)
 
Hotel Lindenhof Katalog 2014
Hotel Lindenhof  Katalog 2014Hotel Lindenhof  Katalog 2014
Hotel Lindenhof Katalog 2014
 
R3p0t3
R3p0t3R3p0t3
R3p0t3
 
Leal_mijares_presentacion_final
Leal_mijares_presentacion_finalLeal_mijares_presentacion_final
Leal_mijares_presentacion_final
 
Panorama des reseaux sociaux
Panorama des reseaux sociauxPanorama des reseaux sociaux
Panorama des reseaux sociaux
 
Biônica
BiônicaBiônica
Biônica
 
Augmented Reality: Die nächste Dimension im Mobile Marketing, Webinale Edition
Augmented Reality: Die nächste Dimension im Mobile Marketing, Webinale EditionAugmented Reality: Die nächste Dimension im Mobile Marketing, Webinale Edition
Augmented Reality: Die nächste Dimension im Mobile Marketing, Webinale Edition
 
Projet1 boiteaoutilsdecheteries
Projet1 boiteaoutilsdecheteriesProjet1 boiteaoutilsdecheteries
Projet1 boiteaoutilsdecheteries
 
Creation et lancement d’un nouveau produit
Creation et lancement d’un nouveau produitCreation et lancement d’un nouveau produit
Creation et lancement d’un nouveau produit
 
Senacip discours du ministre de l'unité nationale et de la citoyenneté
Senacip discours du ministre de l'unité nationale et de la citoyennetéSenacip discours du ministre de l'unité nationale et de la citoyenneté
Senacip discours du ministre de l'unité nationale et de la citoyenneté
 
Vertragsmanagement am SharePoint mit ecspand
Vertragsmanagement am SharePoint mit ecspandVertragsmanagement am SharePoint mit ecspand
Vertragsmanagement am SharePoint mit ecspand
 
Présentation CPI 2016 Bibliothèque de semences : Bibliothèque publique de Wes...
Présentation CPI 2016 Bibliothèque de semences : Bibliothèque publique de Wes...Présentation CPI 2016 Bibliothèque de semences : Bibliothèque publique de Wes...
Présentation CPI 2016 Bibliothèque de semences : Bibliothèque publique de Wes...
 
Los idiotas - Lars Von Trier 1998
Los idiotas - Lars Von Trier 1998Los idiotas - Lars Von Trier 1998
Los idiotas - Lars Von Trier 1998
 

Ähnlich wie Schematron in der Qualitätssicherung

Digitalisierung als Dienstleistung
Digitalisierung als DienstleistungDigitalisierung als Dienstleistung
Digitalisierung als DienstleistungStefan Krause
 
Eigene Themes from Scratch
Eigene Themes from ScratchEigene Themes from Scratch
Eigene Themes from ScratchStefan Fröhlich
 
openHAB @ Chaos BBQ Dortmund
openHAB @ Chaos BBQ DortmundopenHAB @ Chaos BBQ Dortmund
openHAB @ Chaos BBQ Dortmundteichsta
 
Türme bauen mit Schildbürgern (Webtech Edition)
Türme bauen mit Schildbürgern (Webtech Edition)Türme bauen mit Schildbürgern (Webtech Edition)
Türme bauen mit Schildbürgern (Webtech Edition)Nicolai Schwarz
 
openHAB @ KNX Stammtisch NRW
openHAB @ KNX Stammtisch NRWopenHAB @ KNX Stammtisch NRW
openHAB @ KNX Stammtisch NRWteichsta
 
Einführung XHTML CSS JS // IT 07-10
Einführung XHTML CSS JS // IT 07-10Einführung XHTML CSS JS // IT 07-10
Einführung XHTML CSS JS // IT 07-10Noël Bossart
 
Sitzung 3
Sitzung 3Sitzung 3
Sitzung 3scuy
 
Docbook: Textverarbeitung mit XML
Docbook: Textverarbeitung mit XMLDocbook: Textverarbeitung mit XML
Docbook: Textverarbeitung mit XMLPeter Eisentraut
 
Schulung Logos 8 Bibelsoftware - 1. Teil Basis
Schulung Logos 8 Bibelsoftware - 1. Teil BasisSchulung Logos 8 Bibelsoftware - 1. Teil Basis
Schulung Logos 8 Bibelsoftware - 1. Teil BasisHans Rudolf Tremp
 
Goobi Präsentation Darmstadt 2009
Goobi Präsentation Darmstadt 2009Goobi Präsentation Darmstadt 2009
Goobi Präsentation Darmstadt 2009Ralf Stockmann
 
Blank Template - less is more #jd13ch
Blank Template - less is more #jd13chBlank Template - less is more #jd13ch
Blank Template - less is more #jd13chAlexander Schmidt
 

Ähnlich wie Schematron in der Qualitätssicherung (15)

Digitalisierung als Dienstleistung
Digitalisierung als DienstleistungDigitalisierung als Dienstleistung
Digitalisierung als Dienstleistung
 
XHTML
XHTMLXHTML
XHTML
 
xmlinclude
xmlincludexmlinclude
xmlinclude
 
Eigene Themes from Scratch
Eigene Themes from ScratchEigene Themes from Scratch
Eigene Themes from Scratch
 
openHAB @ Chaos BBQ Dortmund
openHAB @ Chaos BBQ DortmundopenHAB @ Chaos BBQ Dortmund
openHAB @ Chaos BBQ Dortmund
 
Türme bauen mit Schildbürgern (Webtech Edition)
Türme bauen mit Schildbürgern (Webtech Edition)Türme bauen mit Schildbürgern (Webtech Edition)
Türme bauen mit Schildbürgern (Webtech Edition)
 
openHAB @ KNX Stammtisch NRW
openHAB @ KNX Stammtisch NRWopenHAB @ KNX Stammtisch NRW
openHAB @ KNX Stammtisch NRW
 
Einführung XHTML CSS JS // IT 07-10
Einführung XHTML CSS JS // IT 07-10Einführung XHTML CSS JS // IT 07-10
Einführung XHTML CSS JS // IT 07-10
 
Baustein 07 grundlagen-html-css-php
Baustein 07 grundlagen-html-css-phpBaustein 07 grundlagen-html-css-php
Baustein 07 grundlagen-html-css-php
 
Archeoinf Prototyp
Archeoinf PrototypArcheoinf Prototyp
Archeoinf Prototyp
 
Sitzung 3
Sitzung 3Sitzung 3
Sitzung 3
 
Docbook: Textverarbeitung mit XML
Docbook: Textverarbeitung mit XMLDocbook: Textverarbeitung mit XML
Docbook: Textverarbeitung mit XML
 
Schulung Logos 8 Bibelsoftware - 1. Teil Basis
Schulung Logos 8 Bibelsoftware - 1. Teil BasisSchulung Logos 8 Bibelsoftware - 1. Teil Basis
Schulung Logos 8 Bibelsoftware - 1. Teil Basis
 
Goobi Präsentation Darmstadt 2009
Goobi Präsentation Darmstadt 2009Goobi Präsentation Darmstadt 2009
Goobi Präsentation Darmstadt 2009
 
Blank Template - less is more #jd13ch
Blank Template - less is more #jd13chBlank Template - less is more #jd13ch
Blank Template - less is more #jd13ch
 

Schematron in der Qualitätssicherung

  • 1. SCHEMATRON IN DER QUALITÄTSSICHERUNG Workshop »Digitale Editionen – Methoden und Technologien für Fortgeschrittene« 10. Oktober 2012 Stefan Krause Editura GmbH & Co. KG, Berlin http://www.editura.de
  • 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
  • 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. 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. 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. 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. 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. 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. 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. SCHEMATRON FÜR ANFÄNGER
  • 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. 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. 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. 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. Hello World! Stefan Krause • Editura GmbH & Co. KG, Berlin • http://www.editura.de
  • 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. 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. 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. 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. 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. erste »echte« Prüfung Stefan Krause • Editura GmbH & Co. KG, Berlin • http://www.editura.de
  • 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(., '-'))">ISBNs sollen 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 mit Bindestrich geschrieben werden!</assert> ! ! </rule> ! </pattern> </schema> Stefan Krause • Editura GmbH & Co. KG, Berlin • http://www.editura.de
  • 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(., '-'))">ISBNs sollen 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 mit Bindestrich 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. 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. mehrere Tests Stefan Krause • Editura GmbH & Co. KG, Berlin • http://www.editura.de
  • 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. 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. 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. 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. 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. Tipp: Schema einbinden Stefan Krause • Editura GmbH & Co. KG, Berlin • http://www.editura.de
  • 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. 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. 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-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']">[E002] Es muss ein title-Element mit @type="sub" geben</assert> ! ! </rule> ! </pattern> </schema> Stefan Krause • Editura GmbH & Co. KG, Berlin • http://www.editura.de
  • 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. Tipp: Fehler vs. Warnung Stefan Krause • Editura GmbH & Co. KG, Berlin • http://www.editura.de
  • 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. 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. 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. 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
  • 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. 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. 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. 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. 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. 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
  • 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. Funktions-Definitionen III Voraussetzung: XSLT-Verarbeitung in Schematron muss freigeschaltet werden. Z. B. in OxygenXML: Optionen Einstellungen XML XML-Parser Fremde Elemente erlauben (allow-foreign) Stefan Krause • Editura GmbH & Co. KG, Berlin • http://www.editura.de
  • 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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
  • 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. SCHEMATRON IN DER QUALITÄTSSICHERUNG Herzlichen Dank für Ihre Aufmerksamkeit! Stefan Krause Editura GmbH & Co. KG, Berlin http://www.editura.de
  • 82. FRAGEN? PROJEKTE: ÜBUNGEN, LÖSUNGEN Anmerkung: Die folgenden Folien beziehen sich auf Fragen, die während des Präsentation gestellt wurden, und waren deshalb im originalen Vortrag nicht enthalten.
  • 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. 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

Hinweis der Redaktion

  1. \n
  2. \n
  3. \n
  4. \n
  5. \n
  6. \n
  7. \n
  8. \n
  9. \n
  10. \n
  11. \n
  12. \n
  13. \n
  14. \n
  15. \n
  16. \n
  17. \n
  18. \n
  19. \n
  20. \n
  21. \n
  22. \n
  23. \n
  24. \n
  25. \n
  26. \n
  27. \n
  28. \n
  29. \n
  30. \n
  31. \n
  32. \n
  33. \n
  34. \n
  35. \n
  36. \n
  37. \n
  38. \n
  39. \n
  40. \n
  41. \n
  42. \n
  43. \n
  44. \n
  45. \n
  46. \n
  47. \n
  48. \n
  49. \n
  50. \n
  51. \n
  52. \n
  53. \n
  54. \n
  55. \n
  56. \n
  57. \n
  58. \n
  59. \n
  60. \n
  61. \n
  62. \n
  63. \n
  64. \n
  65. \n
  66. \n
  67. \n
  68. \n
  69. \n
  70. \n
  71. \n
  72. \n
  73. \n
  74. \n
  75. \n
  76. \n