Der berechnete Elementkonstruktor
Beim direkten Elementkonstruktor können Elementinhalt und Attributwerte durch Ausdrücke berechnet werden; der Elementname jedoch ist konstant. Wenn auch der Name eines Elementes berechnet werden soll, muss ein berechneter Elementkonstruktor eingesetzt werden. Dabei folgt dem Schlüsselwort element der Name des Elementes, und zwar als konstanter QName oder als Ausdruck in einem Auswertungskontext, dessen Ergebnis wieder der Atomisierung unterworfen wird und dann einen der Typen xs:QName , xs:string oder xs:untypedAtomic haben muss. Darauf folgt der Elementinhalt in einem Auswertungskontext, wieder mit der Regel, dass Attributknoten am Anfang der sich ergebenden Sequenz stehen müssen. Analoges gilt für Namensraumknoten, die sogar noch vor den Attributknoten platziert werden müssen. Aus allen atomaren Werten im Elementinhalt werden Textknoten, wobei nebeneinander stehende Textknoten zusammengefasst werden. So wird beispielsweise aus
element Labortest {
attribute ID {"Labortest_040782"},
element Nummer {1},
<Name>Röntgen</Name>,
element Datum {"2002-05-10T10:30:00-05:00"},
<Testgegenstand>linker Oberschenkel</Testgegenstand>,
element Labor {
namespace xlink {"http://www.w3.org/1999/xlink"},
attribute
xlink:href {'Hochwaldklinik.xml#xpointer(id("Radiologie"))'}
}
}
folgendes Element:
<Labortest ID="Labortest_040782">
<Nummer>1</Nummer>
<Name>Röntgen</Name>
<Datum>2002-05-10T10:30:00-05:00</Datum>
<Testgegenstand>linker Oberschenkel</Testgegenstand>
<Labor xmlns:xlink="http://www.w3.org/1999/xlink"
xlink:href='Hochwaldklinik.xml#xpointer(id("Radiologie"))'/>
</Labortest>
Wie man sieht, können innerhalb des Elementkonstruktors wieder beide Arten von Elementkonstruktoren verwendet werden. Im Element Labor muss ein Namensraumknoten für das Präfix xlink erzeugt werden, wenn dieses nicht schon in der Umgebung definiert ist. Man sieht auch, dass der Typ, der innerhalb eines Elementkonstruktors verwendet wird, nicht entscheidend ist, solange er sich nach xs:string konvertieren lässt (im Element Nummer wird ein Integer-Literal verwendet, in Datum eine Zeichenkette, obwohl das Element den Typ xs:date hat). Die Syntax des berechneten Elementkonstruktors ist:
CompElemConstructor | ::= | element ( QName | { Expr } ) { Expr? } |
Gemeinsame Regeln für beide Konstruktorarten
Werden Namen mit einem Namensraumpräfix in einem Elementkonstruktor verwendet, dann muss das Präfix definiert sein, und zwar entweder im XQuery-Prolog oder im Element selbst.
Das entstehende Element wird unter Berücksichtigung des Validierungskontexts automatisch gegen die bekannten Schemadefinitionen validiert und bekommt damit gegebenenfalls einen Typ zugewiesen. Das impliziert auch, dass Attribute mit ihren Vorbelegungswerten zum Element hinzukommen können. Dieser Validierungsvorgang berücksichtigt ein eventuell angegebenes xsi:type-Attribut. So wird der Inhalt des folgenden Elementes gegen xs:integer validiert, auch wenn für das Element keine Definition bekannt ist:
<unbekannt xsi:type="xs:integer">42</unbekannt>
Quelle: "XQuery – Grundlagen und fortgeschrittene Methoden", dpunkt-Verlag, Heidelberg (2004)
<< zurück | vor >> |