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.
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ück | vor >> |