Die Syntax für Namensräume

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

Namensräume ermöglichen es, Elemente mit gleichem Namen eindeutig voneinander zu unterscheiden, indem die Elemente und Attribute URIs zugewiesen werden. Im Allgemeinen werden alle Elemente einer XML-Anwendung einem URI und alle Elemente und Attribute einer anderen XML-Anwendung einem anderen URI zugewiesen. Diese URIs werden Namensraum-Namen genannt. Die URIs teilen die Elemente und Attribute in disjunkte Mengen auf. Elemente mit demselben Namen, aber verschiedenen URIs sind unterschiedliche Typen. Elemente mit demselben Namen und auch demselben URI sind gleich. Meist gibt es eine Eins-zu-Eins-Abbildung zwischen Namensräumen und XML-Anwendungen, obwohl einige Anwendungen auch mehrere Namensräume benutzen, um verschiedene Teile der Anwendung zu unterscheiden. So verwendet beispielsweise XSL unterschiedliche Namensräume für XSL Transformations (XSLT) und XSL Formatting Objects (XSL-FO).

Qualifizierte Namen, Präfixe und lokale Teile

Da URI-Bezeichnungen häufig Zeichen wie /, % und ~ enthalten, die in XML-Namen nicht zulässig sind, werden in Element- und Attributnamen an deren Stelle kurze Präfixe wie rdf und xsl eingesetzt. Jedes Präfix ist mit einem URI verbunden. Namen mit Präfixen, die dem gleichen URI zugewiesen sind, befinden sich im gleichen Namensraum. Namen, deren Präfixe unterschiedlichen URIs zugewiesen sind, befinden sich in verschiedenen Namensräumen. Die präfix-behafteten Elemente und Attribute in Namensräumen tragen Namen, die genau einen Doppelpunkt enthalten:

rdf:description
xlink:type
xsl:template

Alles, was vor dem Doppelpunkt steht, wird Präfix genannt. Alles nach dem Doppelpunkt heißt lokaler Teil. Der komplette Name einschließlich des Doppelpunkts trägt die Bezeichnung qualifizierter Name, QName oder Raw Name. Das Präfix kennzeichnet den Namensraum, zu dem das Element oder Attribut gehört. Der lokale Teil kennzeichnet das genaue Element oder Attribut innerhalb des Namensraums.

In einem Dokument, das sowohl SVG- als auch MathML-set-Elemente enthält, könnte das eine ein svg:set-Element und das andere ein mathml:set-Element sein. Dann gäbe es keinerlei Verwechslung zwischen den Elementen. In einem XSLT-Stylesheet, das Dokumente in XSL-Formatierungsobjekte umwandelt, würde der XSLT-Prozessor Elemente mit dem Präfix xsl als XSLT-Anweisungen und Elemente mit dem Präfix fo als tatsächliche Ergebniselemente erkennen.

Präfixe können aus jedem Zeichen gebildet werden, das auch für XML-Namen zulässig ist, mit Ausnahme des Doppelpunkts. Das aus drei Buchstaben bestehende Präfix xml, das für die Standard-XML-Attribute xml:space, xml:lang und xml:base verwendet wird, ist grundsätzlich an den URI "http://www.w3.org/XML/1998/namespace" gebunden und muss nicht explizit deklariert werden. Andere Präfixe, die mit den drei Buchstaben xml (in jeder Kombination von Groß- und Kleinbuchstaben) beginnen, sind für die Benutzung durch XML und seine eigenen Spezifikationen reserviert. Ansonsten können Sie Ihre Präfixe ganz so nennen, wie es Ihnen am besten passt. Eine weitere Einschränkung in XML, die durch Namensräume entsteht, ist, dass der lokale Teil keinerlei Doppelpunkte enthalten darf! Doppelpunkte dienen in XML also ausschließlich dazu, in einem qualifizierten Namen das Namensraum-Präfix vom lokalen Teil zu trennen.

Präfixe an URIs binden

Jedes Präfix in einem qualifizierten Namen muss mit einem URI verknüpft werden. Zum Beispiel sind alle XSLT-Elemente mit dem URI "http://www.w3.org/1999/XSL/Transform" verknüpft. Anstelle dieses langen URIs wird das übliche Präfix xsl verwendet.

Anmerkung: Sie können den URI im Namen nicht direkt verwenden. Vor allem die Schrägstriche (Slashes), die in den meisten URIs zu finden sind, sind in XML-Namen nicht zulässig. Allerdings erweist es sich manchmal als nützlich, anstelle eines bestimmten Präfixes den vollständigen Namen zu verwenden. Eine Konvention, die in vielen XML-Mailinglisten und XML-Dokumentationen angewendet wird, besteht darin, den URI in geschweifte Klammern einzuschließen und ihn dem Namen voranzustellen. Der qualifizierte Name xsl:template beispielsweise könnte auch als {http://www.w3.org/1999/XSL/Transform}template geschrieben werden.
Eine andere Möglichkeit besteht darin, den lokalen Namen nach einem Doppelkreuz (#) an den URI anzuhängen, sodass ein URI-Fragment-Bezeichner wie "http://www.w3.org/1999/XSL/Transform#template" entsteht. Allerdings dienen beide Formen nur der Bequemlichkeit bei der Kommunikation zwischen menschlichen Lesern, wenn zwar der URI interessant ist, das Präfix jedoch nicht. Weder ein XML-Parser noch ein XSLT-Prozessor akzeptiert oder versteht diese lange Form.

Präfixe werden an Namensraum-URIs gebunden, indem dem entsprechenden Element oder einem ihm übergeordneten Element ein xmlns:präfix-Attribut zugewiesen wird. (Das präfix muss durch das tatsächlich verwendete Präfix ersetzt werden, es dient hier nur als Platzhalter!) Zum Beispiel bindet das Attribut xmlns:rdf dieses rdf:RDF-Elements das Präfix rdf an den Namensraum-URI "http://www.w3.org/TR/REC-rdf-syntax#":

<rdf:RDF xmlns:rdf="http://www.w3.org/TR/REC-rdf-syntax#">
   <rdf:Description about="http://www.cafeconleche.org/examples/impressionists.xml">
      <title>Impressionistische Gemälde</title>
      <creator>Elliotte Rusty Harold</creator>
      <description>Eine Liste berühmter impressionistischer Gemälde, geordnet nach Maler und Erstellungsdatum</description>
      <date>2000-08-22</date>
   </rdf:Description>
</rdf:RDF>

Die Bindungen gelten innerhalb des Elements, in dem sie deklariert wurden, und innerhalb seines Inhalts. Das Attribut xmlns:rdf deklariert das Präfix rdf für das Element rdf:RDF sowie seine Nachfahren-Elemente. Ein RDF-Prozessor erkennt rdf:RDF und rdf:Description als RDF-Elemente, weil beide über Präfixe verfügen, die an einen bestimmten URI gebunden sind, der durch die RDF-Spezifikation bestimmt wurde. Die Elemente title, creator, description und date wird er nicht als RDF-Elemente ansehen, da sie keine Präfixe besitzen, die an den URI "http://www.w3.org/TR/REC-rdf-syntax#" gebunden sind.

Das Präfix kann im obersten Element deklariert werden, das das Präfix benutzt, oder in einem seiner Vorfahren. Das könnte das Wurzelelement des Dokuments oder ein Element auf einer niedrigeren Ebene sein. So könnten zum Beispiel die Dublin Core-Elemente dem Namensraum "http://purl.org/dc/" zugewiesen werden, indem das Element rdf:Description durch das Attribut xmlns:dc erweitert wird, wie im nächsten Beispiel demonstriert, da alle Dublin Core-Elemente in diesem Dokument innerhalb eines einzigen rdf:Description-Elements auftauchen. In anderen Dokumenten, die die Elemente stärker verteilen, ist es möglicherweise bequemer, die Namensraum-Deklaration im Wurzelelement vorzunehmen. Falls notwendig, kann ein einzelnes Element mehrere Namensraum-Deklarationen für unterschiedliche Präfixe aufnehmen.

<?xml version="1.0" encoding="ISO-8859-1" standalone="yes"?>
<catalog>
   <rdf:RDF xmlns:rdf="http://www.w3.org/TR/REC-rdf-syntax#">
      <rdf:Description xmlns:dc="http://purl.org/dc/" about="http://www.cafeconleche.org/examples/impressionists.xml">
         <dc:title>Impressionistische Gemälde</dc:title>
         <dc:creator>Elliotte Rusty Harold</dc:creator>
         <dc:description>Eine Liste berühmter impressionistischer Gemälde, geordnet nach Maler und Erstellungsdatum</dc:description>
         <dc:date>2000-08-22</dc:date>
      </rdf:Description>
   </rdf:RDF>   
   <painting>
      <title>Memory of the Garden at Etten</title>
      <artist>Vincent Van Gogh</artist>
      <date>November 1888</date>
      <description>Zwei Frauen schauen nach links. Eine dritte arbeitet in ihrem Garten.</description>
   </painting>
   <painting>
      <title>The Swing</title>
      <artist>Pierre-Auguste Renoir</artist>
      <date>1876</date>
      <description>Ein junges Mädchen auf einer Schaukel. Zwei Männer und ein kleines Kind schauen zu.</description>
   </painting>
   <!-- Viele weitere Gemälde... -->
</catalog>

Code-Beispiel: Ein Dokument, das sowohl RDF als auch Dublin Core enthält

Eine DTD für dieses Dokument kann verschiedene Inhaltsspezifizierungen für die Elemente dc:description und description enthalten. Ein Stylesheet kann dc:title und title unterschiedliche Styles zuweisen. Software, die den Katalog nach dem Datum sortiert, kann die date-Elemente beachten und die dc:date-Elemente ignorieren.

In diesem Beispiel befinden sich die Elemente ohne Präfixe (wie catalog, painting, description, artist und title) in keinem bestimmten Namensraum. Auch Attribute ohne Präfix (wie das Attribut about von rdf:Description im vorhergehenden Beispiel) liegen niemals in irgendeinem Namensraum. Das Attribut eines Elements im Namensraum "http://www.w3.org/TR/REC-rdf-syntax#" zu sein reicht nicht aus, um auch als Attribut des Namensraums "http://www.w3.org/TR/REC-rdf-syntax#" zu gelten. Ein Attribut kann nur dann zu einem Namensraum gehören, wenn es ein deklariertes Präfix besitzt, wie etwa rdf:about.

In XML 1.1 gibt es eine Ausnahme zu der Regel, dass Attribute ohne Präfixe niemals in einem Namensraum sind. In XML 1.1/Namespaces 1.1 wird definiert, dass das Attribut xmlns im Namensraum "http://www.w3.org/2000/xmlns/" liegt. In XML 1.0/Namespaces 1.0 liegt das Attribut xmlns in keinem Namensraum.

Es ist möglich, ein Präfix innerhalb eines Dokuments umzudefinieren, sodass das Präfix in einem Element auf einen Namensraum-URI verweist, in einem anderen Element jedoch auf einen anderen. In diesem Fall hat das am nächsten gelegene Vorfahren-Element, das das Präfix definiert, Vorrang. In den meisten Fällen ist es jedoch keine gute Idee, Präfixe umzudefinieren, da dies nur zu Verwirrung führt; Sie sollten also darauf verzichten.

Anmerkung: In XML 1.1 können Sie einen Namensraum auch »aufheben«, indem Sie ihn mit einem leeren Wert ("") definieren.

Namensraum-URIs

Viele XML-Anwendungen haben eigene Präfixe. Zum Beispiel benutzen SVG-Elemente oft das Präfix svg, und RDF-Elemente haben häufig das Präfix rdf. Diese Präfixe beruhen jedoch nur auf einfachen Konventionen und können bei Bedarf oder nach Lust und Laune geändert werden. Bevor ein Präfix benutzt werden kann, muss es an einen URI wie "http://www.w3.org/2000/svg" oder "http://www.w3.org/1999/02/22-rdf-syntax-ns#" gebunden werden. Es sind die URIs, nicht die Präfixe, die standardisiert sind. Das Präfix kann sich verändern, solange der URI gleich bleibt. Ein RDF-Prozessor sucht nach dem RDF-URI und nicht nach irgendeinem bestimmten Präfix. Solange niemand außerhalb der w3.org-Domain Namensraum-URIs in der w3.org-Domain benutzt und solange das W3C ein Auge darauf hat, was seine Leute für Namensräume benutzen, lassen sich alle Konflikte vermeiden.

Namensraum-URIs müssen nicht unbedingt auf ein wirkliches Dokument oder eine echte Seite zeigen. Sie müssen nicht einmal dem http-Schema folgen. Sie könnten sogar ein anderes Protokoll einsetzen, wie etwa mailto, bei dem URIs nicht einmal auf Dokumente verweisen. Falls Sie jedoch selbst einen Namensraum unter Benutzung eines http-URI definieren, wäre es keine schlechte Idee, unter dem Namensraum-URI die Dokumentation für die XML-Anwendung abzulegen. Das W3C wollte nicht länger ständig Berichte über falsche oder fehlende Links für die Namensraum-URIs in seinen Spezifikationen erhalten und hat deshalb unter seinen Namensraum-URIs einige einfache Seiten hinzugefügt. Aus formaleren Gründen können Sie einen RDDL-URI ablegen; das eröffnet auch die Perspektive auf automatische Auflösung und andere Kniffe. Diese Möglichkeit wird unter Resource Directory Description Language (RDDL) weiter behandelt. Sie müssen das jedoch nicht tun. Viele Namensraum-URIs führen zum bekannten Fehler 404 »Seite nicht gefunden«, wenn Sie sie tatsächlich in einem Webbrowser aufrufen. Namensraum-URIs sind rein formale Identifier. Es sind nicht die Adressen der Seite, und sie sollen auch nicht als Links angesehen und benutzt werden.

Parser vergleichen Namensraum-URIs zeichenweise. Wenn sich URIs voneinander unterscheiden – und sei es nur an einer einzigen normalerweise unwichtigen Stelle –, werden sie als unterschiedlich angesehen. Beispielsweise zeigen die folgenden URLs alle auf dieselbe Seite:

http://www.w3.org/1999/02/22-rdf-syntax-ns#
http://WWW.W3.ORG/1999/02/22-rdf-syntax-ns#
http://www.w3.org/1999/02/22-rdf-syntax-ns/
http://www.w3.org/1999/02/22-rdf-syntax-ns/index.rdf

Allerdings ist nur der erste der richtige Namensraum-Name für RDF. Diese vier URLs kennzeichnen vier verschiedene Namensräume.

Einen Default-Namensraum mit dem Attribut xmlns vorgeben

Oft wissen Sie, dass der gesamte Inhalt eines bestimmten Elements aus einer bestimmten XML-Anwendung stammen wird. Zum Beispiel werden Sie innerhalb eines SVG-Elements svg wahrscheinlich nur andere SVG-Elemente finden. Sie können anzeigen, dass ein Element ohne Präfix und alle seine Kindelemente ohne Präfix zu einem bestimmten Namensraum gehören. Dazu fügen Sie in das oberste Element das Attribut xmlns ohne Präfix ein, zum Beispiel:

<svg xmlns="http://www.w3.org/2000/svg" width="12cm" height="10cm">
   <ellipse rx="110" ry="130" />
   <rect x="4cm" y="1cm" width="3cm" height="6cm" />
</svg>

Obwohl keines der Elemente irgendein Präfix besitzt, gehören svg, ellipse und rect in den Namensraum "http://www.w3.org/2000/svg".

Bei den Attributen ist das eine andere Geschichte. Default-Namensräume gelten nur für Elemente, nicht jedoch für Attribute. In diesem Beispiel gehören daher die Attribute width, height, rx, ry, x und y nicht in einen Namensraum.

Sie können den Default-Namensraum innerhalb eines bestimmten Elements ändern, indem Sie das Element um das Attribut xmlns erweitern. Das folgende Beispiel ist ein XML-Dokument, das anfänglich für alle XHTML-Elemente den Default-Namensraum auf "http://www.w3.org/1999/xhtml" setzt. Diese Namensraum-Deklaration gilt im größten Teil des Dokuments. Das Element svg besitzt jedoch ein Attribut xmlns, das den Default-Namensraum für das Element selbst und seinen Inhalt auf "http://www.w3.org/2000/svg" zurücksetzt. Die XLink-Information ist jedoch in Attributen enthalten, sodass diese mittels explizit angegebener Präfixe in den XLink-Namensraum gesetzt werden müssen.

<?xml version="1.0"?>
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:xlink="http://www.w3.org/1999/xlink">
   <head><title>Drei Namensräume</title></head>
   <body>
      <h1 align="center">Eine Ellipse und ein Rechteck</h1>
      <svg xmlns="http://www.w3.org/2000/svg" width="12cm" height="10cm">
         <ellipse rx="110" ry="130" />
         <rect x="4cm" y="1cm" width="3cm" height="6cm" />
      </svg>
      <p xlink:type="simple" xlink:href="ellipses.html">Mehr über Ellipsen</p>
      <p xlink:type="simple" xlink:href="rectangles.html">Mehr über Rechtecke</p>
      <hr/>
      <p>Letzte Änderung am 13. Mai 2000</p>
   </body>
</html>

Der Default-Namensraum gilt nicht für Elemente oder Attribute mit Präfixen. Diese gehören weiterhin zu dem Namensraum, an den ihr Präfix gebunden ist. Ein Kindelement ohne Präfix eines Elements mit Präfix dagegen gehört wiederum zum Default-Namensraum.

  

<< 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