XML-Know How

Rekursive Beziehungen

Ein Stolperstein beim Modellieren eines Regelwerks mit grammatikorientierten Sprachen sind die so genannten Rekursionen. Gemeint sind Strukturen, die sich selbst enthalten können. Manchmal sind solche Konstruktionen erwünscht, wie bei ineinander geschachtelten Listen. Häufig entstehen sie aber auch ungewollt, zumeist über zentrale Elemente, wie beispielsweise <absatz>. So konkurrieren die Anforderungen, dass z. B. Fußnoten in Absätzen vorkommen dürfen und Absätze in Fußnoten, nicht jedoch Fußnoten in Fußnoten. In SGML war dies leicht über eine Exklusion in der DTD auszuschließen, in XML geht dies mit den Möglichkeiten einer DTD nicht.

Die Anforderung lautet:

„Fußnoten dürfen nicht in Fußnoten vorkommen.“

Richtig:

<absatz>Hier steht einhochwissenschaftlicher Ausdruck
    <fussnotetyp="stern">
        <absatz>Die Fussnoteerklärt diesen Ausdruck.</absatz>
    </fussnote>
</absatz>

Falsch:

<absatz>Hier steht einhochwissenschaftlicher Ausdruck
    <fussnotetyp="stern">
        <absatz>Die Fussnoteerklärt diesen Ausdruck.
           <fussnotetyp="stern">
              <absatz>Die zweite Fußnote erklärt die
                  ersteFußnote</absatz>
           </fussnote>
       </absatz>
    </fussnote>
</absatz>

Businessrule:

<sch:rule context="fussnote">
    <sch:assert test="ancestor::fussnote">
        Innerhalbvon Fußnoten sind keine
        weiterenFußnoten erlaubt.
    </sch:assert>
</sch:rule>

Mit dem Lokalisierungspfad werden alle Fußnoten des Dokuments adressiert. Der boolesche Ausdruck überprüft, ob die Regel erfüllt ist, dass keine Fußnote in einer anderen steht.

Mit derselben Vorgehensweise lassen sich z. B. auch unsinnig geschachtelte Auszeichnungen verbieten. Beispiele wären einander widersprechende (Tiefstellung innerhalb von Hochstellung) oder typographisch unzulässige (kursive Kapitälchen) Kombinationen.