fjh: XSD: Frage zu "restriction"

Beitrag lesen

Hallo item,

ich bin gerade dabei mich so ein bisschen in XML reinzufummeln. Mit DTDs und XDR bin ich erstmal durch und jetzt hängt es hier aber mächtig bei XSD.

Kein Wunder bei den zwei kryptischen Riesen-Spezifikationen...

Es geht darum, das ich einen komplexen Typ angelegt habe (damit ich überhaupt ein Attribut angeben kann). Das mache ich mit XML Spy (cooles Dingens, übrigens), das ich mir als Demo runtergeladen habe.

Und was machste wenn die Demo ausgelaufen ist ;-)

Wenn ich jetzt ein komplexes Element anlege, generiert mir XML Spy dieses hier:

<xs:element name="nachricht">
  xs:complexType
xs:simpleContent
<xs:extension base="xs:string"/>
</xs:simpleContent>
</xs:complexType>
</xs:element>

In der ausführlichsten Version sähe eine Attribut-Deklaration für Dein Element <nachricht> so aus:

<xs:element name="nachricht">
  xs:complexType
    xs:simpleContent
      <xs:restriction base="xs:anyType">
        <xs:attribute name="meinAttribut"
                      type="xs:string"/>
      </xs:extension>
    </xs:simpleContent>
  </xs:complexType>
</xs:element>

"xs:anyType" ist die Typangabe für den sog. ur-type, der keinerlei Einschränkungen enthält. Hier wird also ein komplexer Typ mit einfachem Inhalt (also ohne Element-Inhalt) gebildet, wobei das Element hier leer ist, aber ein Attribut haben kann.

Eine abgekürztere Version wäre:

<xs:element name="nachricht">
  xs:complexType
    xs:simpleContent
      <xs:attribute name="meinAttribut"
                    type="xs:string"/>
    </xs:simpleContent>
  </xs:complexType>
</xs:element>

Du siehst, eigentl. brauchst Du dich um den xs:extension und xs:restriction-Kram nicht wirklich zu kümmern, wenn du einfach nur ein Attribut deklarieren willst.

Mit xs:restriction und xs:extension leitest Du eigene Datentypen von schon bestehenden ab. Bei xs:restriction schränkst du den Datentyp ein, bei xs:extension erweiterst du ihn.

Z.B. könntest Du einen eigenen Datentyp vom eingebauten Datentyp String ableiten, der nur 5 Zeichen lang sein darf:
<xs:simpleType name="PLZ">
  <xs:restriction base="xs:string">
    <xs:length value="5"/>
  </xs:restriction>
</xs:simpleType>

Ebenso kannst Du aber auch einen Typ erweitern.

Z.B. könntest Du zunächst einen Typ namens Preis definieren, der eine Dezimalzahl mit zwei Nachkommastellen als Preis zuläßt.

<xs:simpleType name="Preis_Typ">
  <xs:restriction base="xs:decimal">
    <xs:fractionDigits value="2"/>
  </xs:restriction>
</xs:simpleType>

Nun willst du vielleicht diesen Typ erweitern zu einem Typ namens Internationaler Preis, der zusätzlich ein Attribut namens "währung" erhält. Dazu verwendest Du das xs:extension-Element. Das Attribut "base" gibt dabei den Namen des Typs an, der erweitert werden soll.

<xs:complexType name="InternationalerPreis">
  xs:simpleContent
    <xs:extension base="Preis_Typ">
      <xs:attribute name="währung"
                    type="xs:string"/>
    </xs:extension>
  </xs:simpleContent>
</xs:complexType>

Gruß
Franz