Elemente können auch verschachtelt sein, und es sind Regeln möglich, wie oft und an welchen Stellen ein Element vorkommen kann. So kann in HTML etwa das Element
<!ELEMENT Name (Inhalt)>
Eine solche Elementtyp-Definition können Sie an irgendeiner Stelle innerhalb der DTD definieren - vor oder nach anderen Definitionen wie ( Attribute), ( Entities) oder ( Notationen).
Beispiel-DTD durchwahlnummer.dtd:
<!ELEMENT durchwahlnummer (#PCDATA)>
<?xml version="1.0" encoding="ISO-8859-1" ?> <!DOCTYPE durchwahlnummer SYSTEM "durchwahlnummer.dtd"> <durchwahlnummer>123456Erläuterung:
Der Elementtyp durchwahlnummer erlaubt Zeichendaten, eine Zeichenfolge wie 123456 ist also ein korrekter Inhalt.
Beachten Sie:
Das Element durchwahlnummer ist in diesem extrem einfachen Beispiel zugleich das Dokument-Element.#PCDATA bedeutet zwar so viel wie "beliebig viel Text", aber es bedeutet auch so viel wie "keine anderen, inneren Elemente". Eine Anwendung wie
ist nach der Definition des Elements durchwahlnummer also unzulässig. Für solche Fälle müssen Sie Elementtypen mit Elementinhalt oder Elementtypen mit gemischtem Inhalt definieren. 123456 Das P in PCDATA bedeutet, dass der Inhalt vom XML-Parser durchaus analysiert wird. Für die Praxis bedeutet dies, dass im Inhalt eines so definierten Elements die Regeln für Zeichen und Zeichensätze zu beachten sind.
In der Version 1.0 unterscheidet XML nicht zwischen verschiedenen Datentypen etwa für numerische oder alphanumerische Daten. Der Datentyp PCDATA entspricht dem Datentyp für alphanumerische Zeichenketten (Strings) in Programmiersprachen - Datentypen für Zahlen, Datumsformate oder dergleichen gibt es nicht. Dies wird von Entwicklern bereits als großer Nachteil empfunden, und künftige Versionen von XML werden vermutlich neben PCDATA mehrere Datentypen anbieten.
Elementtypen mit Elementinhalt definieren
Im Gegensatz zu einem Elementtyp mit Zeicheninhalt ist ein Elementtyp mit Elementinhalt ein solcher, der andere, innere Elementtypen enthält. Er darf jedoch selber keine Zeichendaten enthalten, sondern nur aus anderen Elementen bestehen.
Beispiel-DTD telefonnummer.dtd
<!ELEMENT telefonnummer (vorwahlnummer, durchwahlnummer)> <!ELEMENT vorwahlnummer (#PCDATA)> <!ELEMENT durchwahlnummer (#PCDATA)>Erläuterung:
Im Beispiel werden drei Elementtypen definiert. Die erste der drei Definitionen ist dabei ein Elementtyp mit Elementinhalt. Eine solche Definition hat den gleichen Aufbau wie die Definition eines Elementtyps mit Zeicheninhalt. Es gilt das Schema zur Definition von Elementtypen. Der Unterschied besteht darin, dass in den runden Klammern, in denen der Inhalt des Elementtyps definiert wird, die Namen anderer Elementtypen notiert werden, und zwar durch Kommata getrennt.Im obigen ersten Beispiel wird für den Elementtyp telefonnummer eine feste Elementfolge definiert, bestehend aus den Elementtypen vorwahlnummer und durchwahlnummer. Der Elementtyp telefonnummer darf also nach obiger Definition genau einmal die Elemente vorwahlnummer und durchwahlnummer enthalten, und zwar in dieser Reihenfolge.
Zugleich ist das Element telefonnummer im Beispiel das Dokument-Element, also das äußerste Element der Daten.
Beispiel einer gültigen Anwendung:
Anzeigebeispiel: So sieht's aus (XML-fähiger Browser zeigt z.B. die Datenstruktur an) <?xml version="1.0" encoding="ISO-8859-1" ?> <!DOCTYPE telefonnummer SYSTEM "telefonnummer.dtd"> <telefonnummer> <vorwahlnummer>069974791003Erläuterung:
Die Elementtypen telefonnummer, vorwahlnummer und durchwahlnummer sind so verschachtelt, wie es in der DTD definiert wurde. Die Elementtypen vorwahlnummer und durchwahlnummern enthalten nichts anderes als Zeichendaten und damit einen korrekten Inhalt.
Beliebig viele Wiederholungen eines Elementtyps definieren
Wenn Sie nichts anderes angeben, darf ein Elementtyp nur einmal vorkommen. Damit das Element eines Elementtyps mehrfach notiert werden kann, müssen Sie dies in der DTD kenntlich machen.
Beispiel-DTD kochrezept.dtd:
<!ELEMENT kochrezept (zutatenliste, anweisungsfolge)> <!ELEMENT zutatenliste (zutat)+> <!ELEMENT zutat (#PCDATA)> <!ELEMENT anweisungsfolge (anweisung)*> <!ELEMENT anweisung (#PCDATA)>Erläuterung:
Das Beispiel einer einfachen DTD für ein Kochrezept. Für alle Definitionen im Beispiel gilt das Schema zur Definition von Elementtypen. Definiert wird zunächst der Elementtyp kochrezept für das Dokument-Element. Dieser Elementtyp hat Elementinhalt. Der Inhalt besteht aus den beiden Elementtypen zutatenliste und anweisungsfolge. Diese beiden Elementtypen werden definiert. Beide bestehen wiederum aus Elementinhalt.Dabei kann zutatenliste einen oder mehrere Elementtypen zutat enthalten. Der Grund ist das Pluszeichen + in der Definition hinter der Angabe zum Inhalt. Durch das Pluszeichen geben Sie an, dass der Inhalt, im Beispiel der Elementtyp zutat, innerhalb von zutatenliste mindestens einmal vorkommen muss, ansonsten aber beliebig oft vorkommen kann. Für das Kochrezeptebeispiel ist ein solches Konstrukt durchaus sinnvoll, denn ein Rezept sollte wenigstens aus einer Zutat bestehen.
Der Elementtyp anweisungsfolge kann ebenfalls mehrere Elementtypen anweisung enthalten, kann jedoch auch leer bleiben. Der Grund ist in diesem Fall das Sternzeichen * in der Definition hinter der Angabe zum Inhalt. Durch das Sternzeichen geben Sie an, dass der Inhalt, im Beispiel der Elementtyp anweisung, innerhalb von anweisungsfolge kein mal, einmal oder beliebig viele male vorkommen kann. Für das Kochrezeptebeispiel bedeutet dies, dass es auch Kochrezepte mit Zutaten, aber ohne Anweisungen geben kann.
Beispiel einer gültigen Anwendung:
Anzeigebeispiel: So sieht's aus (XML-fähiger Browser zeigt z.B. die Datenstruktur an)
<?xml version="1.0" encoding="ISO-8859-1" ?> <!DOCTYPE kochrezept SYSTEM "kochrezept.dtd"> <kochrezept> <zutatenliste> <zutat>300 g Kartoffeln geschält2 lg Lauchstangen1 Zwiebel1 tb Butter600 ml WasserKartoffeln in kleine Würfel schneiden.Lauch putzen und in dünne Ringe schneiden.Zwiebel schälen, fein würfeln und in der Butter glasig dünsten.Kartoffeln, Lauch und Wasser hinzufügen und 18 bis 20 Minuten garen.Erläuterung:
Die Elementtypen sind so verschachtelt, wie es in der DTD definiert wurde. Die Elementtypen zutat und anweisung kommen innerhalb von zutatenliste bzw. anweisungsfolge mehrfach vor, was nach der Definition erlaubt ist. Innerhalb von zutat und anweisung kommt in allen Fällen nur Zeicheninhalt vor, so wie es für diese Elementtypen mit dem Schlüsselbezeichner #PCDATA definiert wurde.
Beachten Sie:
Wenn das Beispiel keine Elemente vom Typ anweisung enthalten würde, was ja nach der Definition mit dem Sternzeichen durchaus erlaubt wäre, so müssten Sie in einer gültigen Anwendung trotzdem notieren:<anweisungsfolge></anweisungsfolge>Der Grund ist, dass bei der Definition des Elementtyps kochrezept im obigen Beispiel festgelegt wurde, dass dieses Element aus den beiden Elementtypen zutatenliste und anweisungsfolge bestehen muss, und dass diese beiden Elementtypen vorkommen müssen, nämlich genau einmal.
Elemente mit gemischtem Inhalt definieren
Wenn Sie XML-Anwendungen definieren möchten, in denen Elemente nicht so starr gruppiert sein müssen, sondern in relativ freier Folge notiert werden können - so wie beispielsweise in HTML - dann müssen Sie Elemente mit gemischtem Inhalt definieren. In HTML ist ... so ein typisches Element. Innerhalb dieses Elements können Sie die meisten anderen HTML-Elemente in relativ freier Folge und unter Berücksichtigung einiger weniger Verschachtelungsregeln notieren. Für Anwendungen, die generell weniger in Richtung Datenbank und stattdessen mehr in Richtung Freitext gehen, benötigen Sie solche gemischten Inhalte.
Beispiel-DTD text.dtd:
<!ELEMENT text (#PCDATA | drohend | lachend | fragend | zynisch)*> <!ELEMENT drohend (#PCDATA)> <!ELEMENT lachend (#PCDATA | augenzwinkernd)*> <!ELEMENT fragend (#PCDATA)> <!ELEMENT augenzwinkernd (#PCDATA)> <!ELEMENT zynisch (#PCDATA)>
Erläuterung:
Das Beispiel stellt eine DTD für Text dar, in dem Emotionen als solche kenntlich gemacht werden. Für alle Definitionen im Beispiel gilt das Schema zur Definition von Elementtypen. Definiert wird ein Elementtyp namens text für das Dokument-Element mit gemischtem Inhalt. Gemischten Inhalt bestimmen Sie, indem Sie zum Inhalt des Elements, also innerhalb der Klammern, den Schlüsselbezeichner #PCDATA für Zeicheninhalt und außerdem eine Reihe erlaubter Elementtypen für weiteren Elementinhalt notieren. Die Einträge müssen mit dem Senkrechtstrich | für alternativ notierte Elementtypen getrennt werden. Außerdem muss der gesamte Inhalt am Ende wie im Beispiel das Sternzeichen * für beliebig viele Elemente erhalten. Dadurch darf jedes dieser Elemente beliebig oft in dem Bereich notiert werden kann, in dem es erlaubt ist. Gemischter Inhalt ist also eine Kombination aller hier zuvor behandelten Definitionsmöglichkeit! en.Im Beispiel werden die weiteren, bei text notierten Elementtypen ebenfalls definiert. Mit Ausnahme des Elementtyps lachend wird für alle Elementtypen nichts weiter als reiner Zeicheninhalt (#PCDATA) erlaubt. Der Elementtyp lachend entspricht dagegen wieder dem Muster für gemischten Inhalt. Neben reinem Zeicheninhalt wird in diesem Elementtyp noch der weitere Elementtyp augenzwinkernd zugelassen.
Beispiel einer gültigen Anwendung:
Anzeigebeispiel: So sieht's aus (XML-fähiger Browser zeigt z.B. die Datenstruktur an) <?xml version="1.0" encoding="ISO-8859-1" ?> <!DOCTYPE text SYSTEM "text.dtd"> <text> Manchmal sagt einem das Gewissen: <drohend>du musst mehr über Frauen und Männer nachdenken.</drohend> Dann fragt man sich zwar manchmal, <fragend>warum es darüber wohl so viel nachzudenken gibt,</fragend> aber manchmal folgt man auch brav und denkt nach. Sagt die Frau zum Mann: <lachend>Mann o Mann, <augenzwinkernd>du bist dein Geld wert!</augenzwinkernd></lachend> Antwortet der Mann:<zynisch>Ja, weil ich den Einkaufswagen schiebe und sich eine Mark darin befindet!</zynisch> Daraufhin die Frau: <lachend>Du hast es erfasst!</lachend> </text>Erläuterung:
Das Anwendungsbeispiel enthält das Dokument-Element.. und innerhalb davon typischen gemischten Inhalt. Es kommt normaler Text vor (Zeichendaten), aber auch weitere Elemente. Das lachend-Element kommt insgesamt zweimal vor. Genausogut könnte auch z.B. das drohend-Element zwei- oder mehrfach innerhalb eines text-Elements vorkommen. Dies ist aufgrund der Verwendung des Sternzeichens * bei der Definition aller inneren Elementtypen erlaubt. Das Element augenzwinkernd kommt wie laut DTD erlaubt innerhalb von lachend vor - außerhalb davon dürfte es jedoch nicht vorkommen.
Elemente mit beliebigem Inhalt definieren
Elemente mit beliebigem Inhalt sind eine Steigerungsform von Elementen mit gemischtem Inhalt. Es handelt sich dabei gewissermaßen um Joker- oder Wildcard-Elemente, deren Inhalt in keiner Weise festgelegt ist. Alle übrigen in der DTD definierten Elementtypen können in einem Element mit beliebigem Inhalt vorkommen.
Beispiel-DTD anytext.dtd:
<!ELEMENT anytext ANY> <!ELEMENT english (#PCDATA)> <!ELEMENT italiano (#PCDATA)>Erläuterung:
Für alle Definitionen im Beispiel gilt das Schema zur Definition von Elementtypen. Durch das Schlüsselwort ANY (großgeschrieben) anstelle der konkreten Definition eines Elementinhalts geben Sie an, dass dieses Element (im Beispiel das Dokument-Element) beliebigen Zeicheninhalt und Elementinhalt enthalten kann. Im Beispiel sind zwei andere Elementtypen definiert, die ebenfalls vorkommen dürfen.
Beispiel einer gültigen Anwendung:
Anzeigebeispiel: So sieht's aus (XML-fähiger Browser zeigt z.B. die Datenstruktur an) <?xml version="1.0" encoding="ISO-8859-1" ?> <!DOCTYPE anytext SYSTEM "anytext.dtd"> <anytext> Das ist etwas Text, der in Englisch lautet: <english>this is some text</english> und in italienisch: <italiano>ciò è un certo testo</italiano> </anytext>Erläuterung:
Im Beispiel wird das Dokument-Element... definiert. Darin können Zeichendaten und beliebige andere Elemente vorkommen, zu denen es in der DTD einen Elementtyp gibt. Das Beispiel zeigt eine einfache Mischung.
Leere Elemente ohne Inhalt definieren
Leere Elemente sind solche ohne Inhalt. Im klassischen HTML sind etwa
odersolche Elemente. Dort redet man auch von Standalone-Elementen. In der Philosophie von XML ist eigentlich für jedes Element ein Inhalt vorgesehen. Wenn Sie Elementtypen definieren wollen, die keinen Inhalt haben, müssen Sie dies gesondert angeben. Auch die Notation der Elemente in der Anwendung weist darauf hin, dass es sich um einen Sonderfall handelt.
Beispiel-DTD textzeilen.dtd:
<!ELEMENT textzeilen (#PCDATA | neuezeile)*> <!ELEMENT neuezeile EMPTY>Erläuterung:
Im Beispiel werden zwei Elementtypen definiert: ein Elementtyp textzeilen für das Dokument-Element mit gemischtem Inhalt, und ein Elementtyp neuezeile, der innerhalb des Elementtyps textzeilen beliebig vorkommen darf. Für beide Definitionen gilt das Schema zur Definition von Elementtypen.Der Elementtyp neuezeile ist dabei ein leerer Elementtyp. Kenntlich gemacht wird dies durch das Schlüsselwort EMPTY (zu deutsch: leer) an der Stelle, wo der Inhalt des Elementtyps definiert wird.
Beispiel einer gültigen Anwendung:
Anzeigebeispiel: So sieht's aus (XML-fähiger Browser zeigt z.B. die Datenstruktur an) <?xml version="1.0" encoding="ISO-8859-1" ?> <!DOCTYPE textzeilen SYSTEM "textzeilen.dtd"> <textzeilen> Das ist Text, aber wo beginnt dieErläuterung:
Im Beispiel wird das Element ohne Inhalt entsprechend der Regeln für leere Elemente notiert. Für eine Umsetzung der Bedeutung "neuezeile" kann natürlich erst eine Style-Sprache wie CSS oder XSL sorgen