ELEMENT Deklaration


... [ Seminar XML (DTD) ] ... [ Einleitung ] ... [ Fallbeispiel ] ...

ELEMENT: Elemente einer DTD


Grundsätzliches

Es gibt zwei grundsätzliche Unterscheidungen von Elementen: Elemente mit und Elemente ohne Inhalt (leere Elemente). Beispiele für beide Varianten kennen Sie sicherlich aus HTML.

<P>Dies ist ein Absatz in HTML. Er enthält Textzeichen als Inhalt, kann aber auch <EM>weitere Elemente</EM> aufnehmen.</P> <P>Im Gegensatz dazu ist ein IMG-Element leer. Es verwendet Attribute, um eine Grafikdatei zu laden. <IMG SRC="bild.gif"> Doch Vorsicht: In XML besitzen leere Elemente eine etwas andere Schreibweise. </P>

Einige Elemente (sowohl leere als auch nicht leere) besitzen noch Attribute. Im obigen HTML-Text ist SRC ein Beispiel für ein solches Attribut. Diese Attribute werden im nächsten Kapitel des Seminars näher erklärt werden. Zunächst zu den »gehaltvollen« Elementen: Sie werden durch einen Start-Tag eingeleitet. Dieser besteht aus dem Namen des Elements, eingeschlossen von spitzen Klammern. Dem Start-Tag folgt der Inhalt (content) des Elements. Woraus dieser bestehen darf, d.h. welche anderen Elemente oder ob Text darin vorkommen darf, wird in der DTD festgelegt. Elemente in Instanzen ohne DTD -- d.h. wohlgeformte, aber nicht gültige XML-Dokumente -- dürfen Zeichendaten, weitere Elemente, Kommentare usw. enthalten. Den Abschluß des Elements markiert der End-Tag. Es hat die Form </elementname>.

Damit die Wohlgeformtheit erhalten bleibt, sind einige Punkte zu beachten:



leeres Element

In HTML besitzt es die Form eines Start-Tags. Das ist in XML anders. Der Unterschied besteht darin, daß hinter dem Namen nicht die einfache spitze Klammer steht, sondern die Zeichenfolge />. Ein Element wie img in HTML besitzt in XML folgende Schreibweisen, die beide zulässig sind.

<img src="foto.jpg"/>
<img src="foto.jpg"></img>

Zeichenvorrat

Daß innerhalb von (nicht leeren) Elementen Zeichendaten (character data) stehen dürfen, ist nicht weiter überraschend. Wir haben dies schon bei den vorangegangenen Beispielen stillschweigend verwendet. Abgesehen davon, daß die DTD Elemente deklarieren kann, die ihrerseits nur andere Elemente, jedoch keine Zeichen enthalten dürfen, gibt es auch noch einige Worte zu den Zeichen zu verlieren.


Der von XML verwendete Zeichensatz ist ISO/IEC 10646. Vorausgesetzt, die eingesetzten Programme beherrschen diesen Zeichensatz, dann gibt es bezüglich der erlaubten Zeichen wohl keine Probleme mehr. Insbesondere die westlichen Sprachen sind abgedeckt, was für deutsche Texte heißt, sie können inklusive aller Sonderzeichen direkt eingegeben werden.


Sonderzeichen

Es ist zwar schön, daß man alle Zeichen verwenden kann, die man auf seiner Tastatur findet, aber es gibt noch »ein paar« Zeichen, die auf einer gewöhnlichen Tastatur nicht vorhanden sind. Diese können Sie in Form einer sogenannten Zeichenreferenz schreiben. Dahinter verbirgt sich einfach die Nummer (in dezimaler Notation) des Zeichens im Zeichensatz. Diese Nummer wird zwischen &# und ; eingeschlossen. Falls Sie die hexadezimale Notation von Zahlen vorziehen, so schließen Sie diese Zahl zwischen &#x und ; ein. Das folgende Beispiel zeigt drei verschiedene Wege, die französischen Anführungszeichen (mit deutscher Ausrichtung der Spitzen zum Wort hin) zu verwenden.

Er sagte: &#xbb;XML ist toll!&#xab;
Er sagte: &#187;XML ist toll!&#171;
Er sagte: »XML ist toll!«
Ein weiterer Grund, Zeichen nicht direkt einzugeben, kann darin bestehen, daß diese Zeichen in XML eine besondere Bedeutung besitzen. Dies betrifft die spitzen Klammern, das et-Zeichen (&), das Apostroph sowie die Anführungszeichen. Alle genannten Zeichen sind Teil des Markup und müssen kodiert werden. Neben der genannten Zeichenreferenz gibt es auch noch die Entity-Referenzen. Diese sind eine Art Abkürzungen für beliebige andere Texte. Entity-Referenzen besitzen einen Namen, der zwischen & und ; eingeschlossen wird. Die folgenden Zeilen zeigen die Entities, die immer verfügbar sind.

&amp;  &  (et-Zeichen)
&lt;   <  (less than)
&gt;   >  (greater than)
&apos; '  (apostrophe)
&quot; "  (quotation mark)
Definitionen für eigene Entity-Referenzen kann man (auch bei Verwendung beliebiger DTDs) in der Dokumenttyp-Deklaration unterbringen und genauso verwenden wie die Vordefinierten.

Falls Sie Text eingeben möchten, der »wörtlich« übernommen werden soll, also ohne Ersetzung von Entity-Referenzen o.ä., so steht dafür der CDATA-Abschnitt (character data) zur Verfügung. Auf diesen TAG gehen wir im näheren erst zum Ende des Seminars ein.
Als Zeichendaten sind hier wirklich alle Zeichen, also auch spitze Klammern usw. erlaubt, abgesehen natürlich von der abschließenden Kombination ]]>.


Operatoren

Eine adresse1 besteht einfach aus der Folge vorname, nachname, strasse, ort. Das Komma zwischen den Elementen ist der sogenannte Sequenz-Operator.

<!ELEMENT adresse1 (vorname, nachname, strasse, ort)>

Die Variante adresse2 stellt eine optionale Anrede voran. Das Fragezeichen ist hier das wichtige Zeichen. Es bedeutet, daß die anrede fehlen darf.

<!ELEMENT adresse2 (anrede?, vorname, nachname, strasse, ort)>

Das letzte Adreßtyp-Beispiel, adresse3, kann sogar mit Firmen- und Privatadressen umgehen. Diese Flexibilität verdankt es dem Oder-Operator, der als senkrechter Strich geschrieben wird. In diesem Fall kann man zwischen einer Firma und einer Person wählen.

<!ELEMENT adresse3 ((firma | person) , strasse, ort)>

Die letzten zwei Beispiele sind alternative Formen eines Adreßbuchs. Bei der Variante mit dem Pluszeichen muß ein Adreßbuch mindestens eine Adresse enthalten.

<!ELEMENT adressbuch (adresse)+>

Der Stern in der zweiten Adreßbuch-Version bedeutet, daß beliebig viele Adressen aufeinander folgen dürfen. Im Unterschied zum Pluszeichen darf das Buch hier auch leer sein. »Beliebig viele« heißt also 0 oder 1 oder 2 oder ... Der senkrechte Strich ist also einem Listenoperator gleichbedeutend.

<!ELEMENT adressbuch (adresse)*>

Für komplexere Elementinhalte können die Operatoren kombiniert werden. So kombiniert etwa das Beispiel adresse3 den Sequenz- und den Oder-Operator. Um Verwechslungen zu vermeiden, müssen Klammern gesetzt werden. Die exakten Regeln sind etwas komplizierter.

Nach den bisherigen Ausführungen ist noch unklar, an welchen Stellen Text eingegeben werden darf. Selbstverständlich sollte im Element strasse auch wirklich ein Straßenname stehen. Die folgende Deklaration läßt dies zu, indem sie als Inhalt von strasse PCDATA (Parsed Character Data) einsetzt.

<!ELEMENT strasse (#PCDATA)>

In gleicher Weise können die anderen Elementtyp-Deklarationen geschrieben werden. Was in dem Adressen-Beispiel nicht sehr sinnvoll ist, ist sogenannter gemischter Inhalt (mixed content). Darunter versteht man Inhalt, der sowohl Text (PCDATA) als auch andere Elemente enthält. In der Deklaration muß dann PCDATA vor den weiteren Elementen stehen. Eine Anwendung ist zum Beispiel der Inhalt eines »Absatzes«. Er enthält Text, aber auch weitere Elemente. Wir zeigen dies mit dem aus HTML bekannten Element em (emphasize) zur Hervorhebung. Zuerst die Deklaration, dann die Anwendung:

<-- Deklaration -->
<!ELEMENT absatz (#PCDATA | em)* >
<!ELEMENT em     (#PCDATA)       >
<-- Anwendung   -->
<absatz>Ein Beispiel für eine <em>Hervorhebung</em>
in einem Absatz</absatz>
Zwei reservierte Namen für den Inhalt eines Elements sind ANY und EMPTY. ANY erlaubt gemischte Inhalte mit jedem beliebigen Element, das in der DTD deklariert ist. EMPTY deklariert ein leeres Element, wie etwa das img aus HTML, siehe hierzu den obigen Abschnitt.

<!ELEMENT alles-in-einem ANY>
<!ELEMENT hr EMPTY>


... [ Seminar XML (DTD) ] ... [ Einleitung ] ... [ Fallbeispiel ] ...