« Start: DTD

Abkürzungen in DTD-Dateien#

../../_images/bobbycar.jpg

Lernziel#

Mit Abkürzungen kann man sich Tipparbeit sparen. Außerdem wird der Quelltext übersichtlicher. Wie man das in einer DTD macht, das lernen Sie hier. Im Unterschied zu den Textersetzungen im XML-Dokument, geht es hier um Ersetzungen in einer DTD, die dem Entwicker Tipparbeit erspart und Wiederholungen von identischen Konstrukten vermeidet

Handlungsanweisungen#

Aufgaben:
  1. Definieren Sie, ob die Daten Bandinformationen und Preis aus Ihrer CD-Datenbank öffentlich zugänglich sein sollen oder nicht. Benutzen Sie dafür Entities. Die Angabe soll optional sein. Ändern Sie zwei Datensätze und setzen Sie die Bandinformationen public.

  2. Erstellen Sie außerdem eine Entität für das Euro-Zeichen.

  3. Lagern Sie einen Teil der DTD in eine neue DTD aus. Laden Sie die neu erstellte DTD in die aktuelle DTD ein (siehe ganz unten in dieser Station).

Abkürzungen in einer DTD-Datei#

Wie in Texten wiederholen sich in einer DTD bestimmte Angaben immer wieder. Solche wiederkehrenden DTD-Konstrukte werden vor den ELEMENT-Angaben definiert und können dann beliebig oft in der DTD Verwendung finden. Diese Art der Abkürzung wird Parameter-Entity genannt und unterscheidet sich von einer Text-Entity durch das Prozentzeichen:

<!ENTITY % Name_der_Entity "Ein gültiges DTD-Konstrukt" >

Beispiel: Adressdaten könnten auch als öffentlich und privat deklariert werden. Wir definieren diese für die Postanschrift, die Strasse und die E-Mail-Adresse. Die Angaben wiederholen sich und sind damit Kandidaten für eine Abkürzung. (Zeilen: 1, 2, 10, 16, 18)

Hier die DTD:

 1<!--Die Entität muss oben definiert werden-->
 2<!ENTITY % sichtbarkeit "einsicht (privat|public) #REQUIRED">
 3<!ELEMENT adressensammlung (adresse)+>
 4<!ELEMENT adresse (anrede, name, strasse, postanschrift, email*)>
 5<!ELEMENT anrede (#PCDATA)>
 6<!ELEMENT name (nachname, vorname)>
 7<!ELEMENT postanschrift (plz, wohnort)>
 8<!ATTLIST postanschrift
 9  land (Deutschland | Schweiz | Oesterreich) #REQUIRED
10  %sichtbarkeit; >
11<!ELEMENT nachname (#PCDATA)>
12<!ELEMENT vorname (#PCDATA)>
13<!ELEMENT plz (#PCDATA)>
14<!ELEMENT wohnort (#PCDATA)>
15<!ELEMENT strasse (#PCDATA)>
16<!ATTLIST strasse  %sichtbarkeit; >
17<!ELEMENT email (#PCDATA)>
18<!ATTLIST email %sichtbarkeit; >

Und die Anwendung der Regeln im XML-Dokument (Zeilen: 10, 11, 15):

 1<?xml version="1.0" encoding="UTF-8"?>
 2<!DOCTYPE adresse SYSTEM "adresse.dtd">
 3<adressensammlung>
 4  <adresse>
 5    <anrede>Herr</anrede>
 6    <name>
 7      <nachname>Becker</nachname>
 8      <vorname>Heinz</vorname>
 9    </name>
10    <strasse einsicht="public">Schwabenstr. 19</strasse>
11    <postanschrift einsicht="public" land="Deutschland">
12      <plz>14488</plz>
13      <wohnort>Berlin</wohnort>
14    </postanschrift>
15    <email einsicht="privat">heinz@becker.de</email>
16  </adresse>
17</adressensammlung>
Erklärung:

Wir definieren eine Abkürzung mit der Bezeichnung sichtbarkeit. Wichtig hier ist das Prozentzeichen (%), das besagt, dass es sich bei dieser ENTITY-Definition um eine Parameter-Abkürzung handelt. Wir definieren dann die Attribut-Listen mit dem Inhalt von der ENTITY sichtbarkeit. Die Abkürzung wird mit %sichtbarkeit; an allen Stellen der DTD, die ein Attribut einsicht mit den Werten privat oder public erlauben soll, eingefügt.

Bemerkung

Manche Parser verlangen für Abkürzungen eine externe DTD. Günstig ist es also, die DTD als extern zu definieren.

DTDs aus verschiedenen Dateien zusammensetzen#

Ein Teil der DTD ist in der frag.dtd ausgelagert, da sie z.B. in verschiedenen DTDs verwendet wird. Mit %daten; wird der Inhalt von frag.dtd in die aktuelle DTD eingefügt (Zeilen: 4, 11).

 1<?xml version="1.0" encoding="UTF-8"?>
 2<!ENTITY % zugang "einsicht (privat|public) #REQUIRED">
 3<!ENTITY wo_default "kein wohnort angegeben" >
 4<!ENTITY % daten SYSTEM "frag.dtd">
 5
 6<!ELEMENT adressen (adresse+)>
 7<!ELEMENT adresse (name,str,plz,wohnort,abbildung?)>
 8<!ELEMENT name (vn,nn)>
 9<!ATTLIST name %zugang;>
10
11%daten;
12
13<!ATTLIST plz %zugang;>