Attribute, Entities und Komplexe Elementtyp-Deklaration
Inhaltsangabe:
Attributdeklaration
Grundsätzlich:
<! ATTLIST Element_Name
Attribut_Name Datentyp Vorgabewert
Attribut_Name Datentyp Vorgabewert
...
>
Datentypen:
-
- CDATA
Alle Zeichen sind erlaubt, außer: <, “ und &
* Kontrolle der Werte<! ATTLIST anrede bez (Firma|Frau|Herr) "Frau" titel CDATA #IMPLIED >
- ID
zur eindeutigen Identifikation eines Elementes:<! ATTLIST Dreieck identifier ID #REQUIRED S_A CDATA "12cm" S_B CDATA "10cm" S_C CDATA "8cm" >
- CDATA
Wenn anstelle eines Einzelwertes eine Liste von möglichen Werten angegeben werden soll, müssen die jeweiligen Pluralformen verwendet werden.
-
- IDREF / IDREFS
In Verbindung mit dem Attribut ID kann mit diesen Attributtypen eine Verbindung zwischen Elementen geschaffen werden. - ENTITY / ENTITIES
…siehe eigenen Sitzungspunkt… - NMTOKEN /NMTOKENS
Daten müssen mit einem Buchstaben oder einem Unterstrich beginnen und dürfen kein Leerzeichen oder Doppelpunkt enthalten. Ebenfalls untersagt sind Werte, die mit xml oder XML beginnen. - NOTATION
Notwendig zur Einbindung von „Nicht XML Daten“ in eine XML-Dokument.
Der Wert des Attributes ist der Name der einer Notation, die mit <!NOTATION> in der DTD deklariert wurde.
- IDREF / IDREFS
Vorgabewert:
<! ATTLIST Dreieck
S_A CDATA "12cm"
S_B CDATA "10cm"
S_C CDATA "8cm"
>
- #REQUIRED
<! ATTLIST Dreieck S_A CDATA #REQUIRED S_B CDATA #REQUIRED S_C CDATA #REQUIRED Farbe CDATA #REQUIRED >
- #IMPLIED
<! ATTLIST Dreieck S_A CDATA #REQUIRED S_B CDATA #REQUIRED S_C CDATA #REQUIRED Farbe CDATA #IMPLIED >
- #FIXED
<! ATTLIST Dreieck S_A CDATA #FIXED "10cm" S_B CDATA #REQUIRED S_C CDATA #REQUIRED Farbe CDATA #IMPLIED >
Entities
Parameter-Entities
Um das Schreiben komplexerer DTDs zu erleichtern, besteht die Möglichkeit zur Definition von Parameter Entities. Diese werden mit der <!ENTITY … > Definition ermöglicht. Entity Definitionen weisen einem Namen eine Zeichenkette als Wert zu.
Mit Parameter-Entities werden also benannte „Abkürzungen“ in der DTD definiert, die referenziert werden können, um mehrfach vorkommende Elementgruppen und Attributlisten jeweils nur einmal definieren zu müssen:
Deklaration allgemein
<!ENTITY % entity_name "(content model)|Ersetzungstext">
Referenzierung allgemein
<!ELEMENT element_name %entity_name;>
Beispiel
Deklaration:
<!ENTITY % katalogdaten"(kuenstler+, titel, untertitel?, jahr, id)">
<!ENTITY % id "id ID #REQUIRED">
Referenzierung:
<!ELEMENT skulptur %katalogdaten;>
<!ELEMENT bild %katalogdaten;>
<!ELEMENT foto %katalogdaten;>
<!ATTLIST kurs %id;>
<!ATTLIST referent %id;>
Weitere Entities
- externe Entities
- interne Entities
- externe Parameter-Entities
- nicht analysierte Entities = Notations
Beispiele:
Geschäftsbrief
DTD
<!-- DTD document brief.xml -->
<!ELEMENT brief (kontaktart*, anrede, absatz+, url,
schlussformel, unterschrift )>
<!ELEMENT kontaktart (sender, empfaenger, zusatz*)>
<!ENTITY % kontaktdaten "(name, addresse+, ort, plz, telefon*)">
<!ELEMENT sender %kontaktdaten;>
<!ELEMENT empfaenger %kontaktdaten;>
<!ELEMENT zusatz %kontaktdaten;>
<!ELEMENT name ( #PCDATA )>
<!ELEMENT addresse ( strasse, hausnummer )>
<!ELEMENT ort ( #PCDATA )>
<!ELEMENT plz ( #PCDATA )>
<!ELEMENT telefon ( #PCDATA )>
<!ELEMENT strasse ( #PCDATA )>
<!ELEMENT hausnummer ( #PCDATA ) >
<!ELEMENT anrede ( #PCDATA )>
<!ELEMENT schlussformel ( #PCDATA )>
<!ELEMENT absatz ( #PCDATA )>
<!ELEMENT url (#PCDATA)>
<!ELEMENT unterschrift ( #PCDATA )>
XML
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE brief SYSTEM "brief.dtd">
<brief>
<kontaktart>
<sender>
<name>SoundSo GMBH</name>
<addresse>
<strasse>Soundsostr.</strasse>
<hausnummer>1</hausnummer>
</addresse>
<ort>Soundsostadt</ort>
<plz>12345</plz>
<telefon>+499 711 48 68 69</telefon>
</sender>
<empfaenger>
<name>Sowieso</name>
<addresse>
<strasse>Sowiesostr.</strasse>
<hausnummer>2</hausnummer>
</addresse>
<ort>Sowiesostadt</ort>
<plz>54321</plz>
<telefon>0842 2457158</telefon>
</empfaenger>
<zusatz>
<name>ABC Amtsgericht</name>
<addresse>
<strasse>Musterstr.</strasse>
<hausnummer>1</hausnummer>
</addresse>
<ort>Musterstadt</ort>
<plz>9876</plz>
</zusatz>
</kontaktart>
<anrede>Sehr geehrter,</anrede>
<absatz>Wir freuen Ihnen mitteilen zu dürfen,
dass Sie ein Upgrade für Ihren Flug nach Timbuktu...
</absatz>
<absatz>(...)
</absatz>
<url>http://firstclasssowieso.de</url>
<schlussformel>Mit freundlichen Grüßen,</schlussformel>
<unterschrift>Sarah Soundso</unterschrift>
</brief>
Kunstsammlung
DTD
<!-- DTD document kunstsammlung.xml -->
<!ELEMENT kunstsammlung (name?, lokalisation, gemaelde*, video*, foto*, skulptur*)>
<!ELEMENT name (#PCDATA)>
<!ELEMENT lokalisation EMPTY>
<!ATTLIST lokalisation
url CDATA #IMPLIED
postal CDATA #IMPLIED>
<!ENTITY % info "(katalog, inhalt)">
<!ELEMENT gemaelde %info;>
<!ELEMENT video %info;>
<!ELEMENT foto %info;>
<!ELEMENT skulptur %info;>
<!ELEMENT katalog (titel, url, abstract*, kuenstler)>
<!ELEMENT titel (#PCDATA)>
<!ELEMENT url (#PCDATA)>
<!ELEMENT abstract (#PCDATA)>
<!ELEMENT kuenstler (#PCDATA) >
<!ELEMENT inhalt (person*, bauwerk*, andere*)>
<!ELEMENT person (bezeichnung+)>
<!ELEMENT bauwerk (bezeichnung+)>
<!ELEMENT andere (bezeichnung+)>
<!ELEMENT bezeichnung (#PCDATA)>
XML
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE kunstsammlung SYSTEM "kunstsammlung.dtd">
<kunstsammlung>
<name>Neue schöne Bilder</name>
<lokalisation url="http://www.bilder.de/"/>
<gemaelde>
<katalog>
<titel>Mona Lisa vor dem Eiffelturm</titel>
<url>http://www.woauchimmer.de</url>
<kuenstler>Leonarda da Vinci</kuenstler>
</katalog>
<inhalt>
<person>
<bezeichnung>Mona Lisa</bezeichnung>
</person>
<bauwerk>
<bezeichnung>Eiffelturm</bezeichnung>
</bauwerk>
</inhalt>
</gemaelde>
<gemaelde>
<katalog>
<titel>Ritter, Burgen, Adel</titel>
<url>http://www.beispielseite.de</url>
<kuenstler>Ai Wei Wei</kuenstler>
</katalog>
<inhalt>
<person>
<bezeichnung>byzantinische Kaiserin</bezeichnung>
</person>
<person>
<bezeichnung>Ritter des 13.Jhd</bezeichnung>
</person>
<person>
<bezeichnung>fränkischer Edelmann</bezeichnung>
</person>
<bauwerk>
<bezeichnung>Wasserburg</bezeichnung>
</bauwerk>
</inhalt>
</gemaelde>
<skulptur>
(...)
</skulptur>
<video>
(...)
</video>
</kunstsammlung>
Komplexe Elementtyp-Deklaration
Erweiterte Content Model- Deklaration
Um eine bewusste Auswahl zwischen zwei oder mehreren nichtterminalen Elementen in der Content Model- Deklaration zu geben, nutzt man den „logischen Oder Operator“ |. Dadurch kann jeweils nur ein nichtterminales Unterelement in dem übergeordneten Element enthalten sein. Der Inhalt eines Elements mit dem Content Model (A|B) muß demnach dem Content Model A oder dem Content Model B entsprechen:
DTD
<!ELEMENT kosten (warmiete | kaltmiete)>
XML
<kosten>
<warmiete>...</warmiete>
</kosten>
oder
<kosten>
<kaltmiete>...</kaltmiete>
</kosten>
Die Auswahl zwischen zwei oder mehreren Elementen innerhalb der Content Model- Deklaration kann zusätzlich durch Klammern umschlossen werden, sodass einzelne Model Groups entstehen, die eine jeweilige Ausprägung des Content Models definieren:
DTD
<!ELEMENT adresse (email | (strasse, plz, ort))>
XML
<adresse>
<email>...</email>
</adresse>
oder
<adresse>
<strasse>...</strasse>
<plz>...</plz>
<ort>...</ort>
</adresse>
Dadurch können weitaus komplexere Content Models erstellt werden:
DTD
<!ELEMENT e ((v|(x,y)|(p*,z)), (w|(x?,t)|(y?,u)), r)>
XML
<e>
<p>...</p>
<p>...</p>
<p>...</p>
<z>...</z>
<t>...</t>
<r>...</r>
</e>
Mixed Content
Bei Content Model- Deklarationen muss nicht immer strigent zwischen Nichtterminalen und Terminalsymbolen (wie PCDATA) entschieden werden. In der bisherigen Notation wurden beide immer getrennt behandelt.
Ausgangstext
3 cl Tequila
DTD
<!ELEMENT zutat (zutatsname , menge , einheit)>
<!ELEMENT zutatsname (#PCDATA)>
<!ELEMENT menge (#PCDATA)>
<!ELEMENT einheit (#PCDATA)>
XML
<zutat>
<zutatsname>Tequila</zutatsname>
<menge>3</menge>
<einheit>cl</einheit>
</zutat>
Um Redundanzen innerhalb der Strukturen vorzubeugen ist eine Vermischung beider Elemente durch den Mixed Content möglich. Der Mixed Content kann Terminalsymbole mit Nichtterminalen verknüpfen und somit beide Typen gleichzeitig innerhalb eines Elementes ermöglichen.
DTD
<!ELEMENT zutat (#PCDATA | menge | einheit)*>
<!ELEMENT menge (#PCDATA)>
<!ELEMENT einheit (#PCDATA)>
XML
<zutat>Tequila <menge>3</menge> <einheit>cl</einheit></zutat>
Das Terminal #PCDATA darf ausschließlich als erstes Symbol in einer Auswahl mit beliebig vielen weiteren Nichtterminalen verwendet werden. Dem Modell muß schließlich der Häufigkeitsoperator * hinzugefügt werden, um die wiederholte Einbindung von Elementen des aufgeführten Typs bzw. der Textdaten zu ermöglichen.
Namensräume und Kommentare
Namensräume
Das Konzept der Namensräume oder namespaces ist für XML genauso wichtig wie einfach. Es ist notwendig, um Konflikte in der Benennung von Elementen zu umgehen, die ungewollt und schnell auftreten können, da Elementnamen eindeutig sein müssen.
Zum Beispiel kann für eine Bildersammlung das Kind-Element <name> und für das einzelne Bild das Kind-Element <titel> gewählt, um in keinen Namenskonflikt durch die zweimalige Verwendung von Titel zu kommen, da ja sowohl die Sammlung wie auch das einzelne Bild einen Namen aufweist. Aber nur selten lässt sich das Problem auf diese Art elegant lösen.
Namenskonflikte entstehen vermehrt auch dann, wenn verschiedene XML-Anwendungen zusammengeführt werden. Gleichnamige Element können in unterschiedlichen Kontexten eine völlig andersartige Bedeutung haben:
Kontext HTML:
<body> Das ist meine Webseite </body>
Kontext HUMAN:
<body>
<height>182 cm</height>
<weight>85 kg</weight>
</body>
Um den Kontext für ein Element festzulegen, wird vor den Elementnamen ein kontextspezifisches Präfix und als Trennzeichen ein Doppelpunkt geschrieben und damit die Eindeutigkeit wieder hergestellt:
<web:body> Das ist meine Webseite </web:body>
und
<man:body>
<man:height>182 cm</man:height>
<man:weight>85 kg</man:weight>
</man:body>
Die Verwendung von derartigen Präfixen setzt voraus, dass zuvor ein Namesraum, also ein Kontext, festgelegt wurde. Diese Deklarationen sollten immer am Anfang der Instanz als Attribut namens xmlns zum Root-Element erfolgen und haben als Wertzuweisung eine beliebige URL:
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:man="http://www.hki.uni-koeln.de/human">
<head>
<titel> menschlicher Körper</title>
</head>
<body>
<man:body>
<man:height>182 cm</man:height>
<man:weight>85 kg</man:weight>
</man:body>
</body>
</html>
Kommentare
Kommentare sind Bereiche, die nicht interpretiert werden sollen. Diese werden wie folgt notiert:
<!-- Kommentar --> oder
<!-- <Elementname>Inhalt</Elementname> -->