• +49-(0)721-402485-12
Ihre Experten für XML, XQuery und XML-Datenbanken

Verweise in XML

Wenn XML-Dokumente nicht rein textorientiert sind, besteht oft die Notwendigkeit, Beziehungen im XML-Dokument zu modellieren. In unserem Beispielszenario gibt es Beziehungen zwischen der Klinik und den Ärzten (Typ 1:N), zwischen Stationen und ihren leitenden Krankenpflegern (1:1), Beziehungen zwischen Patienten und ihren behandelnden Ärzten (Typ N:M) und viele weitere.

Verweise innerhalb eines XML-Dokumentes

Beziehungen zwischen Entitäten kann man in XML mit verschiedenen Mitteln modellieren Das natürlichste Mittel, das XML zu bieten hat, ist die Hierarchie. Jedes Mitglied des Personals einer Klinik ist als Nachkommenelement der Klinik modelliert, also der Klinik in der XML-Struktur hierarchisch untergeordnet. Die Modellierung mit Hierarchien ist jedoch begrenzt: Jedes Element kann nur bezüglich einer Beziehung in einer hierarchischen Abhängigkeit stehen. Da Pfleger sich bereits als Personal der Klinik in einer Hierarchiebeziehung befinden, kann die Tatsache, dass sie möglicherweise eine Station leiten, nicht als Hierarchie modelliert werden. Es handelt sich um eine Beziehung zwischen Elementen, die in demselben XML-Dokument enthalten sind. Hier kennt XML die Möglichkeit der Beziehungen über Attribute des Typs ID und IDREF. Die Pfleger-Elemente erhalten einen im Dokument eindeutigen Wert für ihr ID-Attribut (das hier den Namen ID trägt). Im Station-Element wird mit einem IDREF-Attribut (namens Leitung) auf diesen Wert verwiesen:

<Pfleger ID="Pfleger_01" Station="Notaufnahme">...</Pfleger>
<Station Leitung="Pfleger_01">
<Name>Notaufnahme</Name>
<Standort>vorort</Standort>
</Station>

In DTD oder XML Schema müssen die Typen der Attribute entsprechend definiert werden. Es ist allerdings nicht möglich, zu bestimmen, dass ein IDREF-Attribut ein Element eines bestimmten Typs referenzieren soll. Die XQuery-Funktion fn:id() (siehe XQuery-Kapitel Verfolgung von Referenzen) unterstützt die Navigation von einem IDREF-Attribut zum entsprechenden Element.

In XML Schema gibt es als weitere Möglichkeit die key/keyref-Beziehung, die eine rein wertebasierte, durch die Validierung garantierte Form des Verweises darstellt. Die Verfolgung eines solchen Verweises muss in XQuery als expliziter Verbund ("join") dargestellt werden (siehe XQuery-Kapitel Symmetrischer Verbund).

Diese Formen der Modellierung sind auf Beziehungen innerhalb eines XML-Dokumentes beschränkt. Für Beziehungen zwischen XML-Dokumenten muss man auf andere Mechanismen zurückgreifen. Für diesen Zweck bietet sich eine Modellierung basierend auf XLink an.

Verweise zwischen XML-Dokumenten

In seiner einfachen Form gleicht ein XLink dem aus HTML bekannten Verweiselement A:

<A HREF="Hochwaldklinik.html">Hochwaldklinik</A>

Auch ein einfacher XLink verweist aus einer Quelle auf ein Ziel. Allerdings ist bei XLink kein bestimmter Elementname (wie das A oder IMG bei HTML) vorgeschrieben. Vielmehr kann jedes Element die Rolle eines Verweises übernehmen. In der einfachen Form eines XLink wird das dadurch erreicht, dass dem Element Attribute aus dem XLink-Namensraum www.w3.org/1999/xlink hinzugefügt werden. Die wichtigsten Attribute für diese einfache Form sind:

  • type
    Dieses Attribut gibt den Typ des XLink-Verweises an und hat für die einfache Form den Wert simple.
  • href
    Mit href wird das Ziel des Verweises in Form einer URI angegeben.

  • role oder arcrole
    Sie geben die Semantik des Verweises an und haben als Wert eine URL, die auf eine Beschreibung dieser Semantik zeigt.
  • title
    Dieses Attribut benennt den Verweis in lesbarer Form. Sein Wert kann von einer Anwendung z. B. zur Darstellung des Verweises benutzt werden. Bei HTML wird hierfür der Inhalt des Elementes verwendet. Da XLink keine Elementnamen vorschreibt, und damit auch beliebige Elemente beliebigen Inhaltes die Rolle eines Verweises – neben ihrer sonstigen Funktion – mit übernehmen, ist ein solches Attribut sinnvoll.

Bis auf das type-Attribut sind diese Attribute optional, können also auch weggelassen werden. Der Aufwand im einzelnen Element lässt sich durch entsprechende Vorbelegung in XML Schema oder in der DTD reduzieren.

<!ATTLIST Verweis xmlns:xlink CDATA FIXED "http://www.w3.org/1999/xlink"
xlink:type (simple) FIXED "simple"
xlink:href CDATA REQUIRED
xlink:title CDATA IMPLIED>

Hier wurde der Wert für type festgeschrieben. Außerdem wurde die Namensraumdefinition diesem Element fest zugeordnet. Das ist sinnvoll, da DTDs – wie erwähnt – Namensräume nicht unterstützen und man zur besseren Erweiterbarkeit der DTD keine Annahmen darüber treffen sollte, welche Namensraumpräfixe im Kontext des Elementes definiert sind und wie diese definiert sind.

Dieses einfache Beispiel zeigt aber nur einen kleinen Teil der Möglichkeiten, die XLink bietet. Während hier ein Verweis in der Quelle selbst eingebettet ist und nur auf ein einziges Ziel zeigt, möchte man oft mehr als zwei Ressourcen verbinden oder einen Verweis nicht nur in einer Richtung etablieren. Diese Möglichkeit bietet der erweiterte XLink, auf den wir in diesem Buch aber nicht eingehen.

XLink stellt einen Mechanismus bereit, wie Verbindungen zwischen verschiedenen Ressourcen definiert werden können. Die Referenzierung erfolgt dabei, sofern es sich nicht um eine lokale Ressource handelt, über eine URI. Nun sollen oft nicht nur ganze XML-Dokumente, sondern bestimmte Stellen darin referenziert werden. In unserem Beispiel soll beispielsweise von einem Element Operation auf ein bestimmtes Arzt-Element im Klinik-Dokument verwiesen werden.

Hierzu kann auf XPointer zurückgegriffen werden. XPointer erlaubt die Adressierung von einzelnen Stellen in einem XML-Dokument (point) sowie in Bereichen (range) und Mengen solcher Stellen und Bereiche. Für unser Beispiel relevant ist die Adressierung über ID-Attribute des Zieldokumentes. An die URI des Zieldokumentes wird, durch
" # " getrennt, ein XPointer mit folgender Form angefügt:

xpointer(id("Arzt_01"))

Damit zeigt die URL Hochwaldklinik.xml#xpointer(id("Arzt_01")) auf das Element, das ein Attribut vom Typ ID mit dem Wert "Arzt_01" hat. Es gibt hier übrigens die äquivalente Kurzschreibweise Hochwaldklinik.xml#Arzt_01. Mit XPointer lassen sich auch Elemente desselben Dokumentes referenzieren. Dann kann der Dokumentanteil ganz wegfallen: #xpointer(id("Arzt_01"))

Quelle: "XQuery – Grundlagen und fortgeschrittene Methoden", dpunkt-Verlag, Heidelberg (2004)

<< zurückvor >>