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

Element- und Attributdefinitionen

Analog zu lokalen Typdefinitionen gibt es auch die lokalen Elementdefinitionen, wie sie bereits bei der Definition komplexer Typen verwendet wurden. Soll aber in einer solchen Definition ein global definiertes Element referenziert werden, so geschieht das durch ein ref-Attribut:

<xs:complexType>
<xs:sequence>
<xs:element name="Name" type="xs:string"/>
<xs:element name="Standort" type="xs:string"/>
<xs:element ref="Bett" minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
</xs:element>

Das Kindelement Bett wird durch Referenz auf das global definierte Element Bett definiert. Die Kindelemente Name und Standort sind lokale Elemente. Die Definition lokaler Elemente, die mit einer DTD nicht möglich ist, hat den Vorteil, dass Inhaltsmodelle gleichnamiger Elemente kontextabhängig sein können.

Analog können globale und lokale Attribute definiert und referenziert werden.

Elemente können einen komplexen oder einfachen Typ haben, Attribute hingegen nur einen einfachen Typ. Sowohl Elemente als auch Attribute können über die Attribute default und fixed mit Vorbelegungswerten oder festen Werten versehen werden.

In manchen Anwendungen ist der genaue Aufbau einiger Dokumentteile nicht relevant oder gegebenenfalls nicht a priori bekannt. Beispiel hierfür ist die Einbettung von XHTML in ein XML-Dokument. Die genaue Struktur des XHTML-Textes ist für die Schemadefinition irrelevant; interessant ist nur, dass es sich um XHTML handelt. XML Schema sieht für solche Zwecke mehrere Arten von Platzhaltern, so genannten wildcards, vor.

Als Platzhalter für Elemente gibt es any, für Attribute anyAttribute. Die erlaubten Elemente bzw. Attribute können nach ihrem Namensraum eingeschränkt sein: Es kann gefordert werden, dass sie

  • einem Namensraum aus einer gegebenen Liste von Namensräumen angehören ("http://www.xquery-buch/namespaces/n1
    http://www.w3.org/1999/xhtml"
    oder
  • einem bestimmten Namensraum nicht angehören (namespace="not
    http://www.w3.org/1999/xhtml"
    ) oder
  • unqualifiziert sind (namespace="##local") oder
  • demselben Namensraum angehören müssen wie das Schema (namespace="##targetNamespace") oder
  • einem anderen Namensraum angehören als dem, für den das Schema definiert wurde (namespace="##other").

Außerdem kann definiert werden, ob eine Deklaration für die jeweiligen Elemente vorhanden sein muss (processContents="strict"), gemäß derer die Elemente gültig sein müssen, oder ob sie zu beachten ist, wenn vorhanden (processContents="lax"), oder ob sie zu ignorieren ist, selbst wenn sie vorhanden ist (processContents="skip").

Das folgende Element erlaubt unter Befund gemischten Inhalt mit beliebigen Elementen aus dem XHTML-Namensraum, ohne deren Gültigkeit zu prüfen:

<xs:element name="Diagnose">
<xs:complexType>
<xs:sequence>
<xs:element name="Datum" type="xs:dateTime"/>
<xs:element name="Befund">
<xs:complexType mixed="true">
<xs:sequence>
<xs:any namespace="http://www.w3.org/1999/xhtml"
processContents="skip"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="Arzt" type="ArztLink_T"/>
</xs:sequence>
</xs:complexType>
</xs:element>

Die Ableitung von Typen aus anderen Typen haben wir bereits kennen gelernt. Sie stellt zunächst nur ein Konzept zur Definition dar. Jedes Element und jedes Attribut hat einen Typ, der von einem anderen abgeleitet sein kann. Wenn ein Dokument gegen die Element- oder Attributdefinition validiert wird, müssen der Name des Elementes oder Attributes und sein Typ mit der Schemadefinition übereinstimmen. Hier spielt die Ableitungshierarchie zunächst keine Rolle. Es gibt jedoch eine Möglichkeit, der Validierung zu signalisieren, dass für ein Element nicht gegen den im Schema definierten, sondern gegen einen davon abgeleiteten Typ validiert werden soll: Im zu validierenden XML-Dokument kann dem Element ein Attribut xsi:type hinzugefügt werden (wobei xsi das Namensraumpräfix für den Namensraum http://www.w3.org/2001/XMLSchema-instance ist).

Der Wert dieses Attributs gibt den Typ an, gegen den tatsächlich validiert werden soll. Dieser muss von dem im Schema definierten Typ durch Einschränkung oder Erweiterung abgeleitet sein. So kann man also beispielsweise in einem XML-Dokument zusätzliche Attribute für ein Element erlauben. Bei der Schemadefinition kann man ein solches "Umbiegen" der Typdefinition verhindern, wenn man der Elementdefinition das Attribut block hinzufügt. Als Wert kann man eine Liste angeben. Enthält diese Liste das Wort restriction, so ist in XML-Dokumenten ein xsi:type-Attribut mit einem durch Einschränkung abgeleiteten Typ verboten, im Falle von extension entsprechend ein durch Erweiterung abgeleiteter Typ.

Mit xsi:type ist es jedoch nicht möglich, den im Schema vorgegebenen Elementnamen zu überschreiben. Man kann aber schon bei der Schemadefinition festlegen, dass ein Element die Rolle eines anderen Elementes (mit anderem Namen) übernehmen darf. Global definierte Elemente können einer so genannten Ersetzungsgruppe ("substitution group") angehören. Ein Element einer Ersetzungsgruppe ist der Ersetzungsgruppenkopf ("head of substitution group").

Die anderen Elemente der Ersetzungsgruppe signalisieren ihre Zugehörigkeit durch das Attribut substitutionGroup in der Elementdefinition, das als Wert den Namen des Ersetzungsgruppenkopfs hat. Dieser kann durchaus einem anderen Namensraum angehören. Allerdings muss der Typ des Elementes mit dem des Ersetzungsgruppenkopfs übereinstimmen oder von diesem durch Einschränkung oder Erweiterung abgeleitet sein. Die Schemavalidierung akzeptiert jedes Element der Ersetzungsgruppe anstelle des Ersetzungsgruppenkopfs. Dieses kann dadurch verhindert werden, dass das Attribut block in der Elementdefinition den Wert substitution enthält. Als Abkürzung für die Liste aus den Werten extension, restriction und substitution kann das Attribut block auch den Wert all enthalten.

Hier folgt ein Beispiel für eine Ersetzungsgruppe mit dem Ersetzungsgruppenkopf Angestellte. Dieser ist hier sogar als abstraktes Element definiert, was bedeutet, dass er selbst nicht vorkommen darf, sondern nur ein Element der Ersetzungsgruppe erlaubt ist. Die Typen der Mitglieder der Ersetzungsgruppe sind alle durch Erweiterung aus dem Typ Angestellte_T des Ersetzungsgruppenkopfs abgeleitet.

<xs:element name="Angestellte" type="Angestellte_T"
abstract="true"/>
<xs:element name="Arzt" type="Arzt_T"
substitutionGroup="Angestellte"/>
<xs:element name="Sekretärin" type="Sekretärin_T"
substitutionGroup="Angestellte"/>
<xs:element name="Techniker" type="Techniker_T"
substitutionGroup="Angestellte"/>
<xs:element name="Pfleger" type="Pfleger_T"
substitutionGroup="Angestellte"/>

Somit kann im Element angestelltes_Personal eine beliebige Folge von Arzt -, Sekretärin -, Techniker - und Pfleger-Elementen auftreten (siehe Abbildung "Strukturierung des angestellten Personals").

<xs:element name="angestelltes_Personal">
<xs:complexType>
<xs:sequence>
<xs:element ref="Angestellte" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
</xs:element>

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

<< zurückvor >>