Inklusionen

(Auszug aus "Schematron - Effiziente Business Rules für XML-Dokumente", Kapitel 7)

Das Element <include> dient zum Einbinden ausgelagerter Schematron-Elemente. Bei Schematron ist diese Konstruktion etwas gewöhnungsbedürftig, da sie vom üblichen Modell der Inklusion wie bei den Sprachen XSLT und XML Schema abweicht. Beim Inkludieren wird das <include>-Element durch das Wurzelelement der im href-Attribut angegebenen Datei ersetzt.

Da das Wurzelelement in die vorhandene Schematron-Datei eingesetzt wird, kann die externe Datei selbst nie eine ausführbare Schematron-Datei sein.

Namensraum

Bei einer ausgelagerten Datei handelt es sich zwar um kein ausführbares Schematron-Dokument, trotzdem müssen alle Elemente dem richtigen Namensraum zugeordnet werden. Entsprechend darf nicht vergessen werden, im Wurzelelement den Schematron-Namensraum zu definieren – entweder für ein Präfix oder als Standard-Namensraum.

<schema xmlns="http://purl.oclc.org/dsdl/schematron">
  <ns uri="http://www.schematron.info/arche" prefix="arc"/>
  <Pattern>
    <rule context="arc:tier">
      <report test="count(//arc:tier[arc:art=current()/arc:art]) &gt; 2">In der Arche gibt es mehr als zwei Tiere dieser Art.</report>
      <report test="count(parent::*/arc:tier[arc:art=current()/arc:art]) &lt; 2">In dieser Unterkunft gibt es weniger als zwei Tiere dieser Art.</report>
      <assert test="count(parent::*/arc:tier[arc:art=current()/arc:art][@geschlecht='männlich'])=1">Ein Paar muss immer (nur) aus einem Männchen und einem Weibchen bestehen.</assert>
    </rule>
  </pattern>
  <include href="arche(pattern).sch"/>   (1)
</schema>



(1) Das href-Attribut referenziert per URI auf eine externe Datei. Relative URIs referenzieren ausgehend vom Pfad der Schematron-Datei.

Inhalt der Datei arche(pattern).sch:

<pattern xmlns="http://purl.oclc.org/dsdl/schematron">   (1)
  <rule context="arc:zimmer">
    <report test="count(arc:tier) &gt; 6">Noah, bringst du zu viele Tiere in einem Zimmer unter, könnte sich das schlecht auf die Zimmergemeinschaft auswirken! Du solltest nicht mehr als 6 Tiere in einem Zimmer unterbringen.</report>
  </rule>
</pattern>

(1) Hier wird der Schematron-Namensraum "http://purl.oclc.org/dsdl/schematron" als Standard-Namensraum definiert und ist somit für alle Elemente ohne Präfix gültig.

Beim Inkludieren werden beide Dateien zusammengefügt. Das Zwischenergebnis entspricht folgendem Schematron-Schema:

<schema xmlns="http://purl.oclc.org/dsdl/schematron">
  <ns uri="http://www.schematron.info/arche" prefix="arc"/>
  <pattern>
    <rule context="arc:tier">
      <report test="count(//arc:tier[arc:art=current()/arc:art]) &gt; 2">In der Arche gibt es mehr als zwei Tiere dieser Art.</report>
      <report test="count(parent::*/arc:tier[arc:art=current()/arc:art]) &lt; 2">In dieser Unterkunft gibt es weniger als zwei Tiere dieser Art.</report>
      <assert test="count(parent::*/arc:tier[arc:art=current()/arc:art][@geschlecht='männlich'])=1">Ein Paar muss immer (nur) aus einem Männchen und einem Weibchen bestehen.</assert>
    </rule>
  </pattern>
  <pattern>
    <rule context="arc:zimmer">   (1)
      <report test="count(arc:tier) &gt; 6">Noah, bringst du zu viele Tiere in einem Zimmer unter, könnte sich das schlecht auf die Zimmergemeinschaft auswirken! Du solltest nicht mehr als 6 Tiere in einem Zimmer unterbringen.</report>
    </rule>
  </pattern>
</schema>

(1) Das <include>-Element wird durch das Pattern-Element ersetzt. Die Namensraumdefinition ist unnötig geworden.

Diese spezielle Inkludier-Methode erlaubt es nicht nur, Patterns zu importieren, sondern auch einzelne Tests oder Regeln, wie der folgende Code zeigt:

<schema xmlns="http://purl.oclc.org/dsdl/schematron">
  <ns uri="http://www.schematron.info/arche" prefix="arc"/>
  <pattern>
    <rule context="arc:tier">
      <report test="count(//arc:tier[arc:art=current()/arc:art]) &gt; 2">In der Arche gibt es mehr als zwei Tiere dieser Art.</report>
      <report test="count(parent::*/arc:tier[arc:art=current()/arc:art]) &lt; 2">In dieser Unterkunft gibt es weniger als zwei Tiere dieser Art.</report>
      <assert test="count(parent::*/arc:tier[arc:art=current()/arc:art][@geschlecht='männlich'])=1">Ein Paar muss immer (nur) aus einem Männchen und einem Weibchen bestehen.</assert>
    </rule>
  </pattern>
  <pattern>
    <include href="arche(rule).sch"/>   (1)
  </pattern>
</schema>

(1) Da hier eine Regel inkludiert wird, muss diese auch an der richtigen Stelle im Schematron-Dokument eingefügt werden. Das include-Element ist daher einem Pattern untergliedert.

Inhalt der Datei arche(rule).sch:

<rule context="arc:zimmer" xmlns="http://purl.oclc.org/dsdl/schematron">   (1)
  <report test="count(arc:tier) &gt; 6">Noah, bringst du zu viele Tiere in einem Zimmer unter, könnte sich das schlecht auf die Zimmergemeinschaft auswirken! Du solltest nicht mehr als 6 Tiere in einem Zimmer unterbringen.</report>
</rule>

(1) Das Wurzelelement der externen Datei ist ein rule-Element. Der Namensraum muss hier definiert werden. Aber auch das context-Attribut darf nicht fehlen.

Nach dem Inkludieren ist zu erkennen, dass sich die Funktionalität zum vorherigen Beispiel nicht verändert hat:

<schema xmlns="http://purl.oclc.org/dsdl/schematron">
  <ns uri="http://www.schematron.info/arche" prefix="arc"/>
  <pattern>
    <rule context="arc:tier">
      <report test="count(//arc:tier[arc:art=current()/arc:art]) &gt; 2">In der Arche gibt es mehr als zwei Tiere dieser Art.</report>
      <report test="count(parent::*/arc:tier[arc:art=current()/arc:art]) &lt; 2">In dieser Unterkunft gibt es weniger als zwei Tiere dieser Art.</report>
      <assert test="count(parent::*/arc:tier[arc:art=current()/arc:art][@geschlecht='männlich'])=1">Ein Paar muss immer (nur) aus einem Männchen und einem Weibchen bestehen.</assert>
    </rule>
  </pattern>
  <pattern>
    <rule context="arc:zimmer">   (1)
      <report test="count(arc:tier) &gt; 6">Noah, bringst du zu viele Tiere in einem Zimmer unter, könnte sich das schlecht auf die Zimmergemeinschaft auswirken! Du solltest nicht mehr als 6 Tiere in einem Zimmer unterbringen.</report>
    </rule>
  </pattern>
</schema>

(1) Der einzige Unterschied besteht darin, dass dieses Mal die Regel anstatt des Patterns inkludiert wurde.

Warum diese Inkludier-Methode?

Im Gegensatz zu XML Schema und XSLT kann bei Schematron auf verschiedenen Ebenen inkludiert werden. Das <include>-Element kann auch innerhalb von Regeln einzelne Tests importieren. Nachteil dabei ist jedoch, dass immer nur ein <pattern>-, <rule>-, <assert>- oder <report>-Element inkludiert werden kann, da es sich bei der inkludierten Datei um ein wohlgeformtes XML-Dokument handeln muss.

   

<< zurück vor >>

 

 

 

Tipp der data2type-Redaktion:
Zum Thema Schematron bieten wir auch folgende Schulungen zur Vertiefung und professionellen Fortbildung an:

Copyright © dpunkt.verlag GmbH 2011
Für Ihren privaten Gebrauch dürfen Sie die Online-Version ausdrucken. Ansonsten unterliegt dieses Kapitel aus dem Buch "Schematron - Effiziente Business Rules für XML-Dokumente" denselben Bestimmungen, wie die gebundene Ausgabe: Das Werk einschließlich aller seiner Teile ist urheberrechtlich geschützt. Alle Rechte vorbehalten einschließlich der Vervielfältigung, Übersetzung, Mikroverfilmung sowie Einspeicherung und Verarbeitung in elektronischen Systemen.

dpunkt.verlag GmbH, Ringstraße 19B, 69115 Heidelberg, fon 06221-14830, fax 06221-148399, hallo(at)dpunkt.de