Basis-URIs

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

Relative URL-Referenzen wie sark.jpg, ../pi1/sark.jpg und turing/pi1/sark.jpg müssen in Bezug auf einen absoluten Basis-URI aufgelöst werden, bevor sie abgerufen werden. Wenn relative URLs in XLinks, xml-stylesheet-Verarbeitungsanweisungen, System-Identifiern und an anderen Stellen in XML-Dokumenten gefunden werden, werden sie normalerweise in Beziehung auf die absolute Basis-URL des Dokuments oder Entitys aufgelöst, das sie enthält. Wenn Sie in einem Dokument unter der URL "http://www.turing.org.uk/turing/index.html" das Element <image xlink:type="simple" xlink:href="pi1/sark.jpg"/> finden, würden Sie erwarten, die Datei sark.jpg unter der URL "http://www.turing.org.uk/turing/p1/sark.jpg" zu finden. Das ist keine Überraschung. Auf ähnliche Weise funktionieren Links in HTML seit über einem Jahrzehnt.

Allerdings fügt XML der Prozedur ein paar Kanten hinzu. Erstens kann ein XML-Dokument aus mehreren Entities bestehen, die von unterschiedlichen URLs oder sogar unterschiedlichen Servern geladen werden. Wenn das der Fall ist, dann wird eine relative URL in Bezug auf die absolute Basis-URL des spezifischen Entitys aufgelöst, in dem sie erscheint, und nicht in Bezug auf die Basis-URL des vollständigen Dokuments.

Zweitens kann die Basis-URL innerhalb des Dokuments selbst mit xml:base-Attributen zurückgesetzt oder geändert werden. Ein solches Attribut kann auf dem XLink-Element selbst oder in einem beliebigen Vorfahrenelement in demselben Entity erscheinen. Beispielsweise zeigt dieser XLink auf ftp://ftp.knowtion.net/pub/mirrors/gutenberg/etext93/wizoz10.txt:

<novel xmlns:xlink="http://www.w3.org/1999/xlink" xml:base="ftp://ftp.knowtion.net/pub/mirrors/gutenberg/etext93/" xlink:type="simple" xlink:href="wizoz10.txt">
  <title>The Wonderful Wizard of Oz</title>
  <author>L. Frank Baum</author>
  <year>1900</year>
</novel>

Und ebenso dieser:

<novel xmlns:xlink="http://www.w3.org/1999/xlink" xml:base="ftp://ftp.knowtion.net/" xlink:type="simple" xlink:href="/pub/mirrors/gutenberg/etext93/wizoz10.txt">
  <title>The Wonderful Wizard of Oz</title>
  <author>L. Frank Baum</author>
  <year>1900</year>
</novel>

Und dieser auch:

<series xml:base="ftp://ftp.knowtion.net/">
  <title>Oz Books</title>
  <author>L. Frank Baum</author>
  <novel xmlns:xlink="http://www.w3.org/1999/xlink" xlink:type="simple" xlink:href="/pub/mirrors/gutenberg/etext93/">
    <title>The Wonderful Wizard of Oz</title>
    <year>1900</year>
  </novel>
  ...
</series>

Es wird jeweils auf die URL ftp://ftp.knowtion.net/pub/mirrors/gutenberg/etext93/wizoz10.txt verwiesen, egal woher das Dokument, das den XLink enthält, ursprünglich kam. Die Basis-URL wird aus dem am nächsten stehenden xml:base-Attribut in demselben Entity genommen. Dieses wird der Basis-URL des Entitys vorgezogen, das das Element enthält.

xml:base-Attribute können selbst relative URLs enthalten. In diesem Fall wird die Basis-URL gebildet, indem diese relative URL anhand einer Basis-URL aufgelöst wird, die weiter oben in der Hierarchie des Baums steht, und/oder anhand der Basis-URL des Entitys, das das Element enthält. Beispielsweise ist es bei der Auflösung der URLs in den xlink:href-Attributen dieses authors-Elements erforderlich, die URLs in drei separaten Vorfahrenelementen anzuwenden:

<authors xml:base="http://www.literature.org/authors/" xmlns:xlink="http://www.w3.org/1999/xlink">
  <author xml:base="baum-l-frank/">
    <name>L. Frank Baum</name>
    <novel  xml:base="the-wonderful-wizard-of-oz/">
      <title>The Wonderful Wizard of Oz</title>
      <year>1900</year>
      <chapter xlink:type="simple" xlink:href="introduction.html">Introduction</chapter>
      <chapter xlink:type="simple" xlink:href="chapter-01.html">The Cyclone</chapter>
      <chapter xlink:type="simple" xlink:href="chapter-02.html">The Council with the Munchkins</chapter>
      ...
    </novel>
  </author>
</authors>

Aber was ist, wenn das oberste Element selbst eine relative Basis-URL oder kein xml:base-Attribut hat? Dann wenden Sie die absolute Basis-URL des Entitys an, das das Wurzelelement enthält. Theoretisch sollte dieses immer eine absolute Basis-URL haben, die als letzte Stütze dient, um relative URLs aufzulösen. Schließlich muss das Entity ja irgendwoher kommen, oder? Unglücklicherweise gibt es einige verzwickte Fälle, in denen das nicht richtig ist. Insbesondere viele APIs verlieren die Basis-URLs oder erzeugen im Speicher Dokumente ohne Basis-URL. Deswegen ist eine vollständige Auflösung nicht immer möglich. Die entsprechenden Spezifikationen sind in Bezug auf das, was hier passiert, nicht ganz eindeutig. Aber eine mögliche Interpretation ist, einfach festzulegen, dass die Basis-URL der leere String ist. Die URI-Spezifikation definiert, dass das den URI des aktuellen Dokuments meint – was immer das auch sein mag. Aber in den üblichen Fällen, in denen ein Dokument aus einer echten Datei oder einer echten URL gelesen wird, sollte es immer möglich sein, für jedes Element eine absolute Basis-URL zu ermitteln.

Es gibt eine Sache, die wir schon mehrfach angemerkt haben. Aber sie ist es wert, dass man auf sie eingeht, weil sie nicht offensichtlich und ziemlich verzwickt ist. Die gesamte Auflösung von Basis-URIs erfolgt in der Reichweite eines einzelnen Entitys, nicht innerhalb der Reichweite eines vollständigen Dokuments. Wenn das Dokument aus mehreren Entities aufgebaut ist, dann ist es der Basis-URI des jeweiligen Entitys, der zählt, nicht der Basis-URI des Dokuments. Außerdem gelten xml:base-Attribute nur in dem Entitiy, aus dem sie kommen. Für andere Entities gelten sie nicht. Das heißt, wenn Entity A Entity B einschließt, werden keine xml:base-Attribute in Entity A angewandt, um relative URLs in Entity B aufzulösen. Wenn die Basis-URL mit xml:base-Attributen aus Entity B nicht vollständig aufgelöst werden kann, ist die letzte absolute URL die URL, von der Entity B geladen wurde. xml:base-Attriute in Vorfahrenelementen aus anderen Entities werden nicht in Betracht gezogen.

Obwohl wir auf dieser Seite die Anwendung von xml:base-Attributen auf xlink:href-Attribute in den Vordergrund gestellt haben, können sie auch in vielen anderen Umgebungen verwendet werden. Beispielsweise werden sie in XInclude und XHTML 2.0 verwendet. xml:base ist jedoch ein ziemlicher Nachzügler am XML-Tisch, deswegen ist es nicht allgemein anwendbar. Beispielsweise ziehen XHTML 1.0 und 1.1 xml:base-Attribute nicht in Betracht, wenn relative URLs in a- und img-Elementen aufgelöst werden. Stattdessen verwenden sie die traditionellen base-Elemente im head-Element des Dokuments.

  

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