Websiteentwicklung: XML: Namensraum

Wozu braucht man Namensräume? Bearbeiten

Namensräume sind eine Konstruktion in XML, mit der Überschneidungen von Bedeutungen von Elementen von verschiedenen Sprachen vermieden werden können. Der Namensraum definiert also letztlich die Bedeutung des Elementes. Durch eine eindeutige Zuordnung von Elementen zu Namensräumen ist es so folglich möglich, dass Entwickler von XML-Formaten unabhängig voneinander neue Formate spezifizieren. Es ist kein Problem, dass diese für verschiedene Bedeutungen dieselben Elementnamen verwenden, sofern sie für jedes Format jeweils einen anderen Namensraum verwenden.

Etwa hat das Element font in SVG eine andere Bedeutung als in XHTML. Das Element title kommt in verschiedenen Formaten meist mit ähnlicher Bedeutung vor, wo es aber auftreten kann, kann von Format zu Format sehr unterschiedlich sein. Auch Attributenamen wie title, class, lang, id, href, data sind relativ beliebt, können aber je nach Format leicht oder auch deutlich abweichende Bedeutungen haben. Naheliegend oder wahrscheinlich sind ebenfalls Mehrdeutigkeiten bei Namen von Elementen oder Attributen, die nur aus einem Buchstaben bestehen.

Ein Darstellungsprogramm muss nun bei einem Dokument wissen, dessen Inhalt aus verschiedenen Formaten zusammengemischt wurde, aus welchem Format das jeweilige Element oder Attribut kommt, um die richtige Bedeutung berücksichtigen zu können. Dazu dient die eindeutige Zuordnung zu einem Namensraum.
Das löst wiederum nicht das mögliche Problem, dass bei verschiedenen Versionen eines Formates die Elemente oder Attribute leicht unterschiedliche Bedeutungen haben können. Um die Version eines Formates zu kennzeichnen, sind besondere Mechanismen im jeweiligen Format zu definieren.

Typisch wird eine URI als Namensraum verwendet, damit die Zuordnung eindeutig ist. Zudem wird man bei der Einführung eines neuen Namensraumes im Falle einer URI immer eine solche wählen, über die man selbst die Kontrolle hat. Sofern sich alle an diese Konvention halten und man selbst in Erinnerung behält, welche Namensräume man bereits selbst per URI neu eingeführt hat, sind versehentliche Kollisionen ausgeschlossen, weil URIs eindeutig sind und auch die Verantwortlichkeit für eine spezfische URI. Andere eindeutige Zeichenketten sind aber nicht ausgeschlossen. Bei einer URI ist es meist üblich, dass man dort zumindest Angaben darüber findet, um was für ein Format es sich handelt.

Häufig auftauchende Formate und Namensräume:

  • SVG: http://www.w3.org/2000/svg
  • XLink: http://www.w3.org/1999/xlink
  • XHTML: http://www.w3.org/1999/xhtml
  • MathML: http://www.w3.org/1998/Math/MathML
  • RDF: http://www.w3.org/1999/02/22-rdf-syntax-ns#
  • Dublin Core, DCMI Elements: http://purl.org/dc/elements/1.1/
  • Dublin Core, DCMI Terms: http://purl.org/dc/terms/
  • XML Schema: http://www.w3.org/2001/XMLSchema#
  • XSLT: http://www.w3.org/1999/XSL/Transform

Praktische Verwendung und Notation Bearbeiten

Der Namensraum wird mit dem in XML selbst definierten Attribut xmlns angegeben. Damit wird entweder ein voreingestellter Namensraum definiert oder ein Präfix für einen Namensraum festgelegt:
Sei '*' eine Zeichenkette für einen Namensraum, so ist dieser für ein Element (und seinen Inhalt) voreingestellt, wenn beim Element als Attribut notiert wird: xmlns="*" oder xmlns='*', die Notation folgt also den üblichen Regeln für die Notation von Attributen.

Daneben kann mit dem Attribut auch ein Präfix nach Wahl des Autors definiert werden. Solch ein Präfix wird dann Element- und Attribut-Namen vorangestellt, die zum assoziierten Namensraum gehören:
Sei '*' eine Zeichenkette für einen Namensraum und 'bsp' ein frei gewähltes Präfix, welches mit diesem Namensraum assoziiert werden soll, so wird folgendes notiert: xmlns:bsp="*". Der Präfix ist dann für das Element verwendbar, bei welchem dies definiert wurde und bei dessen Nachfahren.

Ein typisches Beispiel, ein Dokument im Format SVG:

<?xml version="1.0"?>
<svg xmlns="http://www.w3.org/2000/svg"
     xmlns:xlink="http://www.w3.org/1999/xlink"
     xmlns:h="http://www.w3.org/1999/xhtml"
     version="1.1"
     xml:lang="de"
     viewBox="-50 0 700 200">
  <title>Beispiel: Verweis in SVG</title>
  <desc>
   <h:p>
    Dies Dokument dient nur als Beispiel, wie Namenräume verwendet werden.
    Die Verwendung von Namensraumangaben wird erläutert.
   </h:p>
   <h:p>
    SVG erlaubt es etwa in Element <h:em>desc</h:em> Elemente aus anderen
    Namensräumen zu verwenden, um die Beschreibung zu strukturieren.
   </h:p>
   <p xmlns="http://www.w3.org/1999/xhtml">
    Dies Beispiel enthält als Inhalt einen Verweis zu wikibooks.
    Der Verweis wird mit Attributen aus dem Namensraum von <em>XLink</em> realisiert, 
    wie von SVG vorgesehen.
   </p> 
  </desc>

  <a xlink:href="http://de.wikibooks.org/">
    <ellipse cx="300" cy="100" rx="300" ry="30" fill="#afa" stroke="blue" />
    <text x="300" y="110" font-size="20" 
         font-family="sans-serif"
         text-anchor="middle">Deutsche wikibooks</text>
  </a>
</svg>

Mittels xmlns="http://www.w3.org/2000/svg" wird im Wurzelelement svg festgelegt, dass dieses zum Namensraum von SVG gehört, damit gehören auch alle Nachfahren des Wurzelelementes zu diesem Namensraum, sofern sie keine andere Namensraumangabe machen und der voreingestellte Namensraum nicht bei einem Elternelement gewechselt wird. Der voreingestellte Namensraum vererbt sich also jeweils auf die Nachfahren, die keine eigenen Angaben machen.

Zusätzlich wird beim Beispiel im Wurzelelement ein Präfix für den Namensraum von XLink festgelegt, dies passiert mit: xmlns:xlink="http://www.w3.org/1999/xlink". Das Präfix ist also wie üblich und von SVG vorgeschlagen 'xlink'. Ferner wird ein Präfix für den Namensraum von XHTML festgelegt: xmlns:h="http://www.w3.org/1999/xhtml"", also das Präfix 'h'.

Anwendung findet das Präfix 'h' dann in der Beschreibung im Element desc. Dort gibt es zwei Absätze und eine betonte Textstelle, welche dieses Präfix verwenden. Das Präfix wird dann bei den Markierungen jeweils den Namen vorangestellt, hier also 'h:p' und 'h:em'.

Beim dritten Absatz wird anders vorgegangen. Der voreingestellte Namensraum wird hier für das Element p explizit neu angegeben, daher ist kein Präfix notiert, auch nicht bei den Kindelementen.

Attribute ohne Präfix gehören zu keinem Namensraum. Ihre Bedeutung und Funktion wird durch das Element (und dessen Namensraum) bestimmt, in welchem sie notiert sind. Das Attribut xmlns selbst ist von XML definiert, hat in jedem XML-Format also dieselbe Bedeutung. Weil Attributnamen nicht mit 'xml' beginnen dürfen, kann es keine Konflikte oder abweichende Definitionen in speziellen XML-Formaten geben.

Braucht man Attribute aus einem anderen Namensraum, ist die Präfix-Notation zu verwenden, hier also die für XLink für den Verweis. Das zuvor definierte Präfix wird dem Atttibutnamen vorangestellt, hier also xlink:href.

Wird ein Präfix verwendet, ist dies den Elementnamen und Attributnamen also jeweils voranzustellen. Ein Element mit Präfix vererbt seinen Namensraum nicht auf seine Nachfahren, diese bleiben im voreingestellten Namensraum, sofern sie selbst keine Angabe oder kein Präfix haben. Der Autor selbst legt das Präfix fest. Es folgt bei der Definition nach einem Doppelpunkt auf das xmlns, mit der Wertzuweisung wird dem Präfix dann ein Namensraum zugewiesen, den dieses Präfix repräsentiert. Da XML selbst ein Präfix 'xml' festlegt, darf dieses nicht verwendet werden, entsprechend ist es bei der Namensproduktion ausgeschlossen, dass Elemente mit 'xml' beginnen dürfen. Der mit Präfix 'xml' fest verknüpfte Namensraum von XML beinhaltet die vordefinierten XML-Attribute.

Die Notation mit Präfix ist praktisch, wenn die Namensräume häufiger wechseln. Die Änderung des voreingestellten Namensraumes bei einem Element ist praktisch, wenn darin eine längere Passage aus diesem neuen Namensraum zu notieren ist. Denn in diesem Falle übernehmen die Nachfahren ohne eigene Namensraumangabe die zuvor voreingestellte Namensraumangabe.

Ist bei einem Nachfahren-Element kein Namensraum angegeben, so gehört es also zum voreingestellten Namensraum, sofern einer in einem Vorfahren voreingestellt wurde, sonst zu keinem Namensraum oder dem sogenannten Null-Namesraum. Elemente im Null-Namensraum haben keine definierte Bedeutung.

Typisch wird etwa bei Dokumenten, die nur ein Format verwenden, der Namensraum nur im Hauptelement angegeben, womit die Angabe dann für alle Nachfahren gilt, die keine eigenen Angaben zum Namensraum machen. Mit einer Namensraumangabe hat der gesamten Dokumentinhalt dann also eine definierte Bedeutung - vorausgesetzt, es gibt irgendwo eine Spezifikation, die die Bedeutung der Elemente des angegebenen Namensraumes festlegt. Auch ohne die Spezifikation sind Elemente in ihrem Namensraum aber immer noch von gleichnamigen Elementen in anderen Namensräumen unterscheidbar.

Bei Attributen ist die Lage formal etwas komplizierter, weil sie nicht direkt zu einem Namensraum gehören, wenn für sie mittels Präfix keiner angegeben ist. Allerdings werden die Attribute dann in dem Namensraum definiert und interpretiert, der zu dem Element gehört, in dem sie notiert sind. Es ist folglich inhaltlich sinnlos, Attribute bei einem Element ohne Präfix zu notieren, wenn die Verwendung dieser Attribute für das Element in seinem Namensraum nicht definiert ist. Es ist somit auch nicht möglich, etwa über den voreingestellten Namensraum solchen Attributen eine Bedeutung zu geben, wenn sie ohne Präfix im Namensraum des Elementes, bei dem sie notiert sind, keine definierte Bedeutung haben. Für die Definition und Bedeutung von Attributen ohne Namensraum-Präfix ist also immer das XML-Format zuständig, welches das Element definiert, bei welchem sie notiert sind und kein anderes Format.