Zulassen beliebiger Elemente oder Attribute aus einem bestimmten Namensraum

(Auszug aus "XML Schema" von Eric van der Vlist)

Wie man beliebige Elemente oder Attribute aus anderen Namensräumen unterbringt, sehen wir anhand des Beispieles unserer Marketing-Erweiterung, des Namensraums "http://dyomedea.com/ns/library/mkt":

<?xml version="1.0"?>
<!-- Namensraum: http://dyomedea.com/ns/library -->
<library xmlns="http://dyomedea.com/ns/library" xmlns:mkt="http://dyomedea.com/ns/library/mkt">
   <book id="b3810518883">
      <title>
         Auf den Hund gekommen
      </title>
      <authors>
         <person id="CMS">
            <name>
               Charles M. Schulz
            </name>
         </person>
      </authors>
      <mkt:cover>
         Paperback
      </mkt:cover>
      <mkt:pages>
         128
      </mkt:pages>
   </book>
</library>

Um beliebige Elemente aus dem Namensraum "http://dyomedea.com/ns/library/mkt" nach dem Element author zuzulassen, verwenden wir ein xs:any-Element:

<xs:any namespace="http://dyomedea.com/ns/library/mkt" processContents="skip"minOccurs="0" maxOccurs="unbounded"/>

xs:anyAttribute sollte verwendet werden, um Attribute zuzulassen:

<xs:anyAttribute namespace="http://dyomedea.com/ns/library/mkt" processContents="skip"/>

Die beiden eben neu gezeigten Attribute sind namespace und processContents.

namespace gibt die Namensräume der Elemente bzw. Attribute an, die akzeptiert werden sollen. Der Wert sollte eine Liste von durch URIs identifizierten Namensräumen sein, wobei auch einige Wildcards zulässig sind. Die in der Liste erlaubten Wildcards sind ##local (ein nicht-qualifiziertes Element) und ##targetNamespace (der Ziel-Namensraum). Zwei Wildcards können auch statt der Liste verwendet werden: ##any (jeder Namensraum) und ##other (jeder Namensraum mit Ausnahme des Zielnamensraums).

Es kann nicht angegeben werden, daß die möglichen Namensräume alle nicht in dem Schema selbst definierten Namensräume sind oder auch alle Namensräume außer den in einer Liste angegebenen. Dies ist eine ernsthafte Einschränkung für Vokabulare mit mehreren Namensräumen, die einige der importierten Namensräume ausschließen, für undefinierte Namensräume jedoch offenbleiben möchten.

processContents legt das Verhalten des Validierers bezüglich der Elemente bzw. Attribute aus den angegebenen Namensräumen fest. Die möglichen Werte sind »skip« (für diese Elemente oder Attribute wird keine Validierung versucht), »strict« (für die eingebundenen Namensräume müssen Schemas vorliegen, und der Validierer wird die Elemente und Attribute gegen diese Schemas validieren) oder »lax« (Validierer werden ihr Bestes geben, um ein Schema für die eingebundenen Elemente und Attribute zu finden, und sie dann validieren, falls sie eines gefunden haben, oder anderenfalls die Validierung ohne Klage überspringen). Beispiel:

<?xml version="1.0"?>
<xs:schema targetNamespace="http://dyomedea.com/ns/library" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns="http://dyomedea.com/ns/library">
   <xs:element name="library">
      <xs:complexType>
         <xs:sequence>
            <xs:element ref="book"/>
         </xs:sequence>
         <xs:anyAttribute namespace="http://dyomedea.com/ns/library/mkt" processContents="skip"/>
      </xs:complexType>
   </xs:element>
   <xs:element name="book">
      <xs:complexType>
         <xs:sequence>
            <xs:element name="title" type="xs:string"/>
            <xs:element name="authors">
               <xs:complexType>
                  <xs:sequence>
                     <xs:element name="person">
                        <xs:complexType>
                           <xs:sequence>
                              <xs:element name="name" type="xs:string"/>
                           </xs:sequence>
                           <xs:attribute name="id" type="xs:string" use="required"/>
                        </xs:complexType>
                     </xs:element>
                  </xs:sequence>
               </xs:complexType>
            </xs:element>
            <xs:any namespace="http://dyomedea.com/ns/library/mkt" processContents="skip"minOccurs="0" maxOccurs="unbounded"/>
         </xs:sequence>
         <xs:attribute name="id" use="required">
            <xs:simpleType>
               <xs:restriction base="xs:hexBinary"/>
            </xs:simpleType>
         </xs:attribute>
      </xs:complexType>
   </xs:element>
</xs:schema>

Dieses Schema ist so offen gehalten, daß es beliebige Elemente aus einem einzelnen Namensraum akzeptiert. Es kann weiter geöffnet werden, so daß es beliebige Elemente aus beliebigen Namensräumen außer dem Ziel-Namensraum akzeptiert:

<xs:anyAttribute namespace="##other" processContents="skip"/>

Dieser Mechanismus ist flexibel genug (mit Ausnahme des bereits erwähnten Mangels an Unterstützung für undefinierte Namensräume), um für eine große Mehrheit von Anwendungen auszureichen, wir müssen jedoch noch anmerken, daß diese Wildcards als Partikeln betrachtet werden und keine globalen Elementdefinitionen ersetzen können. Die unglückliche Folge davon ist, daß Dokumentenelemente nicht durch Wildcards abgedeckt werden, weil ein Schema eine abgeschlossene Liste möglicher Dokumentenelemente zur Verfügung stellen muß.

   

<< zurück vor >>

 

 

 

Tipp der data2type-Redaktion:
Zum Thema XML Schema bieten wir auch folgende Schulungen zur Vertiefung und professionellen Fortbildung an:

Copyright © 2003 O'Reilly Verlag GmbH & Co. KG
Für Ihren privaten Gebrauch dürfen Sie die Online-Version ausdrucken.
Ansonsten unterliegt dieses Kapitel aus dem Buch "XML Schema" denselben Bestimmungen, wie die gebundene Ausgabe: Das Werk einschließlich aller seiner Teile ist urheberrechtlich geschützt. Alle Rechte vorbehalten einschließlich der Vervielfältigung, Übersetzung, Mikroverfilmung sowie Einspeicherung und Verarbeitung in elektronischen Systemen.

O’Reilly Verlag GmbH & Co. KG, Balthasarstraße 81, 50670 Köln, kommentar(at)oreilly.de