Ableitung durch Auflistung

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

Ableitung durch Auflistung ist der Mechanismus, durch den ein Listen-Datentyp von einem atomaren Datentyp abgeleitet werden kann. Alle Einträge in der Liste müssen denselben Datentyp haben.

Listen-Datentypen

Listen-Datentypen sind Spezialfälle, bei denen eine Struktur innerhalb des Inhalts eines einzigen Attributs oder Elements definiert wird. Von dieser Praxis wird normalerweise abgeraten, weil Anwendungen mit Hilfe der aktuellen XML-APIs, mit XPath-Ausdrücken oder im Infoset keinen Zugriff auf die atomaren Werte haben. Diese Situation könnte sich zukünftig ändern, da diese Datentypen von XPath 2.0 adoptiert werden sollten, woraus sich wahrscheinlich irgendein Mechanismus ergeben wird, auf die Einträge innerhalb dieser Listen zuzugreifen.

Die ganze Einrichtung scheint überhaupt eingeführt worden zu sein, um die Kompatibilität mit den IDREFs der DTDs von SGML und XML zu gewährleisten. W3C XML Schema ist jedoch vorsichtig vorgegangen und erlaubt es nicht, das Listentrennzeichen festzulegen oder komplexe Listen von komplexem Basistyp oder aus unterschiedlich strukturierten Einträgen aufzubauen. Unter den Konstruktionen, die sich zwar in einigen XML-Vokabularen finden, die jedoch nicht durch XML Schema beschrieben werden können (außer durch die Verwendung regulärer Ausdrücke als teilweiser Ausweichlösung), gibt es kommagetrennte Wertelisten sowie Listen mit heterogenen Einträgen wie beispielsweise Werten mit Einheiten:

<commaSeparated>
1, 2, 25

</commaSeparated>

<valueWithUnit>
10 em
</valueWithUnit>

Whitespace-getrennte Listen und geteilte XML-Elemente oder Attribute werden bevorzugt:

<blankSeparated>
1 2 25
<blankSeparated>

<valueWithUnit unit="em">
10
</valueWithUnit>

<valueWithUnit>
10em
</valueWithUnit>

IDREFS, ENTITIES und NMTOKENS sind vordefinierte Listen-Datentypen, die mit dieser Methode von atomaren Typen abgeleitet worden sind.

Wie wir bei diesen drei Datentypen gesehen haben, müssen alle definierbaren Listen-Datentypen Whitespace-getrennt sein. Kein anderes Trennzeichen wird akzeptiert.

Wenn man diese Beschränkungen akzeptiert, ist es sehr einfach, eine Liste zu definieren. W3C XML Schema hat zwei Schreibweisen definiert. Beide verwenden das Element xs:list, das eine Definition durch Verweis auf bestehende Typen ermöglicht oder eine Typdefinition einbettet. Die beiden Schreibweisen können nicht vermischt werden.

Die Definition eines Listen-Datentyps durch Verweis auf einen existierenden Typ geschieht mit dem Attribut itemType:

<xs:simpleType name="integerList">
   <xs:list itemType="xs:integer"/>
</xs:simpleType>

Dieser Datentyp kann verwendet werden, um Attribute oder Elemente zu definieren, die eine Whitespace-getrennte Liste ganzer Zahlen wie beispielsweise »1 –25000 1000« akzeptieren.

Die Definition eines Listen-Datentyps kann auch durch Einbettung des Elements xs:simpleType erreicht werden:

<xs:simpleType name="myIntegerList">
   <xs:list>
      <xs:simpleType>
          <xs:restriction base="xs:integer">
             <xs:maxInclusive value="100"/>
          </xs:restriction>
      </xs:simpleType>
   </xs:list>
</xs:simpleType>

Dieser Datentyp kann verwendet werden, um Attribute oder Elemente zu definieren, die eine Whitespace-getrennte Liste ganzer Zahlen mit dem Höchstwert 100 akzeptieren, beispielsweise »1 –25000 100«.

Listen-Datentypen haben einen eigenen Werteraum, der durch einen Satz spezieller Facetten eingeschränkt werden kann, der allen diesen Typen gemeinsam ist.

Diese Facetten heißen xs:length, xs:maxLength, xs:minLength, xs:enumeration und xs:whitespace. Die Einheit, die zur Angabe der Länge eines Listentyps verwendet wird, ist stets die Anzahl der Elemente in der Liste.

Um diese Facetten auf einen benutzerdefinierten Listentyp anzuwenden, muß man zwei Schritte unternehmen. Zunächst muß der Listen-Datentyp definiert werden, danach ein Datentyp, der den Listen-Datentyp einschränkt. Der Grund dafür ist, daß jeder xs:simpleType (globale Definition) nur jeweils eine der drei existierenden Ableitungsmethoden akzeptiert.

Bei diesem Vorgang muß die Ableitung durch Einschränkung zuerst durchgeführt werden, da ein Listen-Datentyp die Facetten seines atomaren Typs verliert und nur noch die fünf eben genannten Facetten bietet, die eine für Listentypen maßgeschneiderte Bedeutung haben.

Definition atomarer Datentypen, die Whitespace erlauben

Es ist möglich, Listen atomarer Datentypen zu definieren, die Whitespace zulassen; hierzu gehört beispielsweise xs:string. In diesem Fall wird Whitespace immer als Trennzeichen angesehen.

Die Auswirkungen dieser Aussage sieht man, wenn man eine Facette anwendet, die die Länge eines solchen Datentyps einschränkt:

<xs:simpleType name="myStringList">
  <xs:list itemType="xs:string"/>
</xs:simpleType>
<xs:simpleType name="myRestrictedStringList">
  <xs:restriction base="myStringList">
    <xs:maxLength value="10"/>
  </xs:restriction>
</xs:simpleType>

Der Datentyp myRestrictedStringList ist eine Liste mit höchstens zehn Einträgen. Da diese Einträge durch Whitespace voneinander getrennt werden, ist myRestrictedStringList eine Liste von höchstens zehn Portionen von Strings, die ihrerseits keinen Whitespace enthalten (d.h. zehn »Wörter«).

Dieser Datentyp validiert daher einen Wert wie den folgenden:

<myRestrictedStringList>
  Dieser Wert hat weniger als zehn Wörter.
</myRestrictedStringList>

Er validiert hingegen nicht den folgenden:

<myRestrictedStringList>
  Dieser Wert hat mehr als zehn Wörter … auch wenn sie sich vielleicht über weniger als zehn "Strings" erstrecken.
</myRestrictedStringList>

Die Definition geschachtelter Listen von Listen ist durch die W3C XML Schema Recommendation verboten.

   

<< 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