Namensräume und DTDs

(Auszug aus "XML in a Nutshell" von Elliotte Rusty Harold & W. Scott Means)

Namensräume sind vollkommen unabhängig von DTDs und können sowohl in gültigen als auch in ungültigen Dokumenten angewendet werden. Ein Dokument kann über eine DTD verfügen, aber keine Namensräume einsetzen, oder Namensräume benutzen, aber keine DTD haben. Es kann sowohl Namensräume als auch DTDs benutzen oder weder Namensräume noch DTDs haben. Namensräume ändern in keiner Weise die Syntax einer DTD, noch ändern sie die Definition von Gültigkeit. Zum Beispiel muss die DTD eines gültigen Elements, das ein Element namens dc:title benutzt, eine ELEMENT-Deklaration enthalten, die den Inhalt von dc:title korrekt vorgibt:

 

<!ELEMENT dc:title (#PCDATA)>

Der Name des Elements im Dokument muss einschließlich des Präfixes genau zu dem Namen des Elements in der DTD passen. Die DTD kann das Präfix nicht weglassen und einfach ein Element title deklarieren. Gleiches gilt für Attribute mit Präfix. Falls beispielsweise ein Element, das im Dokument benutzt wird, die Attribute xlink:type und xlink:href besitzt, muss die DTD auch xlink:type und xlink:href deklarieren und kann sich nicht einfach auf type und href beschränken.

Wenn umgekehrt ein Element ein xmlns-Attribut verwendet, um den Default-Namensraum einzustellen und Elementen keine Präfixe zuweist, müssen die Namen der Elemente in der DTD ohne Präfixe deklariert werden. Der Validator weiß nichts von der Existenz der Namensräume und sie kümmert ihn auch nicht. Er sieht lediglich, dass einige Element- und Attributnamen offensichtlich Doppelpunkte enthalten, und soweit es ihn betrifft, sind solche Namen absolut gültig, solange sie deklariert wurden.

Parameter-Entity-Referenzen für Namensraum-Präfixe

Wenn DTDs Namen mit Präfixen deklarieren müssen, anstatt einfach die qualifizierten Namen oder eine Kombination aus lokalem Teil und Namensraum-URI zu verwenden, wird das Ändern des Präfixes in gültigen Dokumenten erschwert. Das Problem ist, dass das Ändern des Präfixes es erfordert, dass auch alle Deklarationen geändert werden müssen, die das Präfix in der DTD verwenden. Mit ein wenig Vorausdenken können Parameter-Entity-Referenzen jedoch die Arbeit ein wenig erleichtern.

Der Trick besteht darin, sowohl das Namensraum-Präfix als auch den Doppelpunkt, der das Präfix von dem lokalen Namen trennt, als Parameter-Entities zu definieren, so beispielsweise:

<!ENTITY % dc-prefix "dc">
<!ENTITY % dc-colon ":">

Definieren Sie als Nächstes die qualifizierten Namen als weitere Parameter-Entity-Referenzen:

<!ENTITY % dc-title       "%dc-prefix;%dc-colon;title">
<!ENTITY % dc-creator     "%dc-prefix;%dc-colon;creator">
<!ENTITY % dc-description "%dc-prefix;%dc-colon;description">
<!ENTITY % dc-date        "%dc-prefix;%dc-colon;date">

Achtung! Lassen Sie diesen Schritt auf keinen Fall aus, und versuchen Sie nicht, die Parameter-Entities dc-prefix und dc-colon direkt in ELEMENT- und ATTLIST-Deklarationen anzuwenden. Das würde in die Hose gehen, weil XML-Parser zusätzliche Leerzeichen um den Ersetzungstext eines Entity herum einfügen, wenn diese außerhalb des Ersetzungstextes eines anderen Entitys verwendet werden.

Benutzen Sie dann in allen Deklarationen die Entity-Referenzen für die qualifizierten Namen:

<!ELEMENT %dc-title; (#PCDATA)>
<!ELEMENT %dc-creator; (#PCDATA)>
<!ELEMENT %dc-description; (#PCDATA)>
<!ELEMENT %dc-date; (#PCDATA)>
<!ELEMENT rdf:Description ((%dc-title; | %dc-creator; | %dc-description; | %dc-date;)*)>

Jetzt ändert ein Dokument, das das Präfix verändern muss, einfach die Definitionen der Parameter-Entities. In manchen Fällen geschieht das durch direktes Bearbeiten der DTD. In anderen Fällen müssen dazu die Definitionen in der internen DTD-Teilmenge des Dokuments überschrieben werden. Um zum Beispiel das Präfix von dc auf dublin zu ändern, fügen Sie diese Entity-Definition irgendwo in die DTD vor der normalen Definition ein:

 

<!ENTITY % dc-prefix "dublin">

Falls Sie den Default-Namensraum anstelle der expliziten Präfixe verwenden wollen, definieren Sie die Entities dc-prefix und dc-colon als leeren String:

<!ENTITY % dc-prefix "">
<!ENTITY % dc-colon "">

  

<< zurück vor >>

 

 

 

Tipp der data2type-Redaktion:
Zum Thema XML bieten wir auch folgende Schulungen zur Vertiefung und professionellen Fortbildung an:

  


Copyright © 2005 O'Reilly Verlag GmbH & Co. KG
Für Ihren privaten Gebrauch dürfen Sie die Online-Version ausdrucken.
Ansonsten unterliegt dieses Kapitel aus dem Buch "XML in a Nutshell" denselben Bestimmungen, wie die gebundene Ausgabe: Das Werk einschließlich aller seiner Teile ist urheberrechtlich geschützt. Alle Rechte vorbehalten einschließlich der Vervielfältigung, Übersetzung, Mikroverfilmung sowie Einspeicherung und Verarbeitung in elektronischen Systemen.

O’Reilly Verlag GmbH & Co. KG, Balthasarstraße 81, 50670 Köln, kommentar(at)oreilly.de