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

Knotentypen

Ein beliebiger Knoten wird durch node() repräsentiert. Darüber hinaus gibt es die Möglichkeit, einen bestimmten Knotentyp zu fordern, wie zum Beispiel einen Textknoten oder einen Elementknoten. Der Typ kann noch spezifischer definiert werden: Bei Verarbeitungsanweisungen kann ein bestimmtes Ziel gefordert werden, bei Elementen und Attributen Name und/oder Typ, bei Dokumenten ein bestimmtes Wurzelelement. Die folgende Tabelle gibt eine Übersicht über die verschiedenen Möglichkeiten.

Knotentyp Bedeutung
node()beliebiger Knoten
document-node()ein Dokumentknoten
document-node(element(...))ein Dokumentknoten, wobei das Dokument als
Wurzelelement ein Element des angegebenen
Typs hat
text()ein Textknoten
comment() ein Kommentarknoten
processing-instruction()ein Verarbeitungsanweisungsknoten
processing-instruction(Ziel)
processing-instruction("Ziel")
ein Verarbeitungsanweisungsknoten
mit dem angegebenen Ziel
element()
element(*)
element(*,*)
ein beliebiger Elementknoten
element(Name)ein bestimmtes Element
element(Name, Typ) ein Element mit bestimmtem Namen und Typ
attribute()
attribute(*)
attribute(*,*)
ein beliebiges Attribut
attribute(Name)ein bestimmtes Attribut
attribute(Name, Typ)ein Attribut mit bestimmtem Namen und Typ

Tab. Liste unterschiedlicher Knotentypen

Die folgende Abbildung verdeutlicht den Zusammenhang der jeweiligen Angaben für Typen von Sequenzeinträgen. Von links nach rechts wird die Definition immer spezifischer.

 

Hierarchie von Sequenztypen

Abb. Hierarchie von Sequenztypen

Die Angabe eines Namens bei Elementen und Attributen muss im Zusammenhang mit den bei der Anfrageauswertung bekannten XML-Schemadefinitionen gesehen werden.

Werden für ein Element Name und Typ angegeben, so werden alle Elemente akzeptiert, die diesen Namen haben (oder in einer Ersetzungsgruppe sind, die zu diesem Elementnamen gehört) und die außerdem vom angegebenen Typ sind (oder deren Typ durch Erweiterung oder Einschränkung von diesem Typ abgeleitet wurde). Zu dem Sequenztyp

element(Angestellte, Angestellte_T)

passen zum Beispiel Arzt-Elemente gemäß dem Beispielschema. Es muss in diesem Fall allerdings keine Schemadefinition für den Elementnamen bekannt sein. Dies gilt auch dann, wenn für den Typ ein * angegeben ist. In diesem Fall ist der Typ des Elementes beliebig; zum Beispiel wird von dem Sequenztyp

element(Krankenwagenfahrer, *)

ein Element namens Krankenwagenfahrer akzeptiert, auch wenn ein solches Element im Schema nicht definiert ist. Auch für den Namen kann ein * angegeben sein, dann wird nur der Typ des Elementes berücksichtigt.

Ein Element mit leerem Inhalt und dem Attribut xsi:nil="true" wird nur akzeptiert, wenn dem Typnamen das Schlüsselwort nillable hinzugefügt wurde. Daher passt das Element

<Gehalt xsi:nil="true"/>

zu dem Sequenztyp

element(*, xs:integer nillable)

Wird für ein Element nur der Name angegeben, dann muss eine Schemadefinition für diesen Elementnamen bekannt sein. Ein Element wird akzeptiert, wenn es diesen Namen hat oder zu einer Ersetzungsgruppe zu diesem Namen gehört. Dann muss der Typ des Elementes auch dem Typ in der Schemadefinition entsprechen oder von diesem durch Erweiterung oder Einschränkung abgeleitet sein. Der Sequenztyp

element(Krankenwagenfahrer)

führt daher zu einem Fehler, weil in unserem Beispielschema ein solches Element nicht definiert ist. Der Sequenztyp

element(Angestellte)

akzeptiert hingegen auch ein Arzt-Element, weil dieses zu seiner Ersetzungsgruppe gehört.

In XML Schema gibt es die Möglichkeit, Elemente nicht global, sondern lokal zu definieren, d. h. nur im Kontext eines anderen Elementes oder eines komplexen Typs. Damit auch solche Elemente verwendet werden können, erlaubt XQuery die Angabe eines Kontextpfades. Dabei handelt es sich quasi um eine Navigationsanweisung von einer globalen Definition zu dem lokalen Element.

Damit ein Element akzeptiert wird, muss es in diesem Fall den angegebenen Namen haben und gegen den Typ validieren, der im Schema für das lokale Element gilt. Für das Patienten-Beispielschema kann folgender Sequenztyp benutzt werden, um ein Element anzusprechen, das den Namen Beginn hat und denselben Typ wie das lokal unter Operation definierte Element Beginn:

element(Operation/Beginn)

Ein Element, das zu diesem Sequenztyp passt, muss allerdings nicht Kind eines Elementes Operation sein, sondern nur der Struktur des für Beginn unterhalb von Operation erwarteten Typs entsprechen!

Falls die globale Definition, von der aus navigiert wird, eine Typdefinition und keine Elementdefinition ist, so wird der Typname in type() eingefasst, wie bei

element(type(Person_T)/E-Mail)

Für Attribute gelten die genannten Regeln analog.

 

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

<< zurückvor >>