XML-Know How

Entities auf DTD-Ebene (Parameter-Entities)

Auch auf der DTD-Ebene können Entities verwendet werden. Dabei werden in der DTD deklarierte Entities in derselben DTD eingesetzt. Diese Entities heißen Parameter Entities. Der Unterschied zu »normalen« Entities besteht formal darin, dass Parameter Entities von »%« und »;« eingeschlossen werden. In der Deklaration wird zwischen dem Deklarations-Aufruf !ENTITY und dem Entitynamen ein »%« eingefügt.

Weiterhin können Parameter Entities nur als Platzhalter für Zeichenfolgen oder Textdateien stehen. Das folgende Beispiel deklariert die Parameter Entity standard-attribute:

<!ENTITY % standard-attribute "
     bearbeiter NMTOKEN #REQUIRED
     id ID #REQUIRED
">

Diese Entity kann nun bei jeder Attributdeklaration verwendet werden, bei der die Standard-Attribute benötigt werden:

<!ATTLIST buch %standard-attribute;>
<!ATTLIST kapitel %standard-attribute;>
<!ATTLIST abschnitt %standard-attribute;>

Wenn man bedenkt, dass manche DTDs für eine Vielzahl von Elementen jeweils Dutzende identischer Attribute vorsehen, erleichtert die Verwendung von Parameter Entities die Pflege dieser DTDs enorm. Die standard-attribute mögen von vielen Elementen benötigt werden – müssen diese Attribute geändert werden, ist nur die Änderung einer Stelle, nämlich der Parameter Entity-Deklaration notwendig.

Da Parameter Entities auch für Textdateien stehen können, lassen sich DTDs ebenso auf viele Teildateien verteilen wie XML-Instanzen. Ein klassischer Anwendungsfall sind die Deklarationen von ISO-Entities, die hunderte Zuordnungen von ISO-Entities auf nummerische UNICODE Character References enthalten. Ein Verlag mag viele DTDs haben – diese Deklarationen werden für jede DTD die gleichen sein. Daher wird man die Deklarationen von ISO-Entities in separaten Dateien ablegen und von den DTDs über Parameter Entities auf diese ISO-Entity-Dateien verweisen.

Eine solche ISO-Entity-Datei sieht so aus:

...
<!ENTITY aacute "&#x00E1;">
<!ENTITY Aacute "&#x00C1;">

<!ENTITY acirc "&#x00E2;">
<!ENTITY Acirc "&#x00C2;">
<!ENTITY agrave "&#x00E0;">
...

Da das keine vollständige DTD ist, sondern eine einfache Textdatei mit Deklarationen, die Teil einer DTD sind, kann man die Datei z. B. entities.txt nennen (man findet für solche Dateien auch die Endung .ent für »Entities« oder .mod für »Modul«). In der eigentlichen DTD wird dann zuerst die Parameter Entity entities für die Datei entities.txt deklariert und sofort verwendet:

<!ENTITY % entities SYSTEM "entities.txt">
%entities;

Für die verarbeitende Software ist es nun, als stünde der Inhalt der Datei entities.txt genau an der Stelle, wo die Parameter Entity %entities; steht. So kann man die Deklarationen aus entities.txt in vielen DTDs nutzen, muss aber nur eine ISO-Entity-Datei pflegen.

Durch Schachtelungen von Parameter Entities für Dateien können sehr komplexe und entsprechend unübersichtliche DTDs entstehen: Eine Parameter Entity steht für eine Datei, in der Parameter Entities stehen, die wieder für andere Dateien stehen.

Während es in einer DTD gleichgültig ist, in welcher Reihenfolge Deklarationen für Elemente oder Attribute und Notationen stehen, muss eine Parameter Entity erst deklariert werden, bevor sie verwendet werden kann. Daher ist es wichtig, bei mehreren Dateien für eine DTD darauf zu achten, dass die Reihenfolge der Parameter Entities korrekt bleibt – ansonsten sind kaum noch nachvollziehbare Fehlermeldungen die Folge.