XML-Know How

Komplexe Beziehungen

Die bisherigen Beispiele waren alle relativ einfach umzusetzen. Zum Abschluss soll gezeigt werden, dass sich mit Schematron auch sehr viel komplexere Beziehungen abbilden lassen. Die Grenzen der Validierungssprache liegen lediglich in den Funktionen, die uns XPath zur Verfügung stellt, die jedoch einen beachtlichen Umfang haben.

Die Anforderung sei:

„Die Überschriften der ersten Hierarchieebene sollen mit Großbuchstaben nummeriert werden, die Überschriften zweiter Hierarchieebene dagegen mit arabischen Ziffern.“

Richtig:

<kapitel>
    <ueberschrift>
      <nummer>A</nummer>
      <text>Kapitelüberschrift</text>
    </ueberschrift>
    …
    <kapitel>
       <ueberschrift>
          <nummer>1</nummer>
          <text>Unterkapitelüberschrift</text>
       </ueberschrift>
       …
    </kapitel>
</kapitel>

Falsch:

<kapitel>
    <ueberschrift>
      <nummer>1</nummer>
      <text>Kapitelüberschrift</text>
    </ueberschrift>
    …
    <kapitel>
       <ueberschrift>
          <nummer>1a)</nummer>
          <text>Unterkapitelüberschrift</text>
       </ueberschrift>
       …
    </kapitel>
</kapitel>

Businessrules:

<sch:rule context="ueberschrift[count(ancestor::kapitel)=1]">
    <sch:assert test="nummer[translate
   (.,‘ABCDEFGHIJKLMNOPQRSTUVWXYZ‘,‘‘)= '']"
>
       Überschriften der ersten Hierarchie müssen mit
       Großbuchstaben nummeriert werden.
    </sch:assert>
</sch:rule>

<sch:rulecontext="ueberschrift[count(ancestor::kapitel)=2]">
    <sch:asserttest="nummer[translate
    (.,‘1234567890‘,‘‘)= '']">
       Überschriften der zweiten Hierarchie müssen mit
       arabischen Ziffern nummeriert werden.
    </sch:assert>
</sch:rule>

In diesem Fall werden zwei Regeln benötigt, um die Anforderung zu überprüfen. Über den Lokalisierungspfad erfolgt zunächst eine Unterscheidung in zwei Fälle. Auf Überschriften der ersten Hierarchie wird die erste Regel angewendet, auf Überschriften zweiter Hierarchie die zweite. Umgesetzt wird dies durch die XPath-Funktion count(), mit deren Hilfe ermittelt wird, ob eine Überschrift in einem Kapitel oder in einem Unterkapitel steht.

Im nächsten Schritt wird die Nummerierung der jeweiligen Überschrift genauer unter die Lupe genommen. Der boolesche Ausdruck verwendet dabei die Funktion translate(), um bestimmte Zeichen zu ersetzen. In der ersten Regel werden die Zeichen A bis Z ersetzt, und zwar durch nichts. Die zweite Regel verfährt analog, jedoch mit allen Ziffern von 0 bis 9. Wenn nach diesem Ersetzen-Prozess noch irgendwelche Zeichen vorhanden sind, dann muss es sich um einen Fehler handeln.

Diese komplexere Regel lässt erahnen, welches Potential in der Validierungssprache steckt. Jede logische Regel, die sich auf diese Weise abbilden lässt, führt zu einem Zeitgewinn für Lektorat und XML-Dienstleister. Gleichzeitig wird bei der Sicherstellung eines möglichst hochwertigen Datenbestandes ein immer höheres Niveau erreicht.