« Übersicht: Schema

Ein eigener Datentyp#

../../_images/mosaik015-potsdam.jpg

Lernziel#

Neben den eingebauten, können Sie eigene Datentypen definieren. Wie, wird hier gezeigt. Dafür gibt es in einer DTD keine vergleichbare Deklarationsmöglichkeit.

Handlungsanweisungen#

Aufgaben:
  1. Erweitern Sie das Schema aus der vorherigen Station

  2. Die Werte für einen eigenen Datentyp können über Reguläre Ausdrücke sehr genau definiert werden.

Die DTD als Vorlage#

 1<?xml version="1.0" encoding="UTF-8"?>
 2<!ELEMENT adressdb (adresse+)>
 3<!ENTITY % sichtbarkeit "einsicht (privat|public|proteced) #REQUIRED">
 4<!ELEMENT adresse (anrede, name, strasse, postanschrift, email?, bild)>
 5<!ELEMENT anrede (#PCDATA)>
 6<!ELEMENT name (nachname, vorname)>
 7<!ELEMENT postanschrift (plz, wohnort)>
 8<!ELEMENT nachname (#PCDATA)>
 9<!ELEMENT vorname (#PCDATA)>
10<!ELEMENT plz (#PCDATA)>
11<!ELEMENT wohnort (#PCDATA)>
12<!ELEMENT strasse (#PCDATA) >
13<!ELEMENT email (#PCDATA)>
14<!ATTLIST strasse %sichtbarkeit;>
15<!ATTLIST postanschrift land
16          (Deutschland | Schweiz | Oesterreich) #REQUIRED %sichtbarkeit; >
17<!ATTLIST adresse nr CDATA #REQUIRED>
18<!ELEMENT bild EMPTY>
19<!ATTLIST bild bezeichnung CDATA #REQUIRED>
20<!ENTITY email_default "keine E-Mail angegeben" %sichtbarkeit; >

Datentyp PLZ#

Eine Postleitzahl besteht aus maximal 5 Ziffern. Diese Regel soll in einem eigenen Datentyp definiert werden (Siehe Zeilen 54, 82-86).

 1<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
 2  <xs:element name="adressdb">
 3    <xs:annotation>
 4      <xs:documentation>Meine Adressammlung</xs:documentation>
 5    </xs:annotation>
 6    <xs:complexType>
 7      <xs:sequence>
 8        <xs:element ref="adresse" minOccurs="1" maxOccurs="unbounded"/>
 9      </xs:sequence>
10      <xs:attribute ref="nr" use="required"/>
11    </xs:complexType>
12  </xs:element>
13  <xs:element name="adresse">
14    <xs:complexType>
15      <xs:sequence>
16        <xs:element ref="anrede" minOccurs="1"/>
17        <xs:element ref="name" minOccurs="1"/>
18        <xs:element ref="strasse" minOccurs="1"/>
19        <xs:element ref="postanschrift" minOccurs="1"/>
20        <xs:element ref="email" minOccurs="0"/>
21        <xs:element ref="bild" minOccurs="1"/>
22      </xs:sequence>
23    </xs:complexType>
24  </xs:element>
25  <xs:element name="anrede" type="xs:string"/>
26  <xs:element name="name">
27    <xs:complexType>
28      <xs:sequence>
29        <xs:element ref="nachname"/>
30        <xs:element ref="vorname"/>
31        <xs:element name="geburtstag" type="xs:date"/>
32      </xs:sequence>
33    </xs:complexType>
34  </xs:element>
35 <xs:element name="postanschrift">
36    <xs:complexType>
37        <xs:sequence>
38        <xs:element ref="plz"/>
39        <xs:element ref="wohnort"/>
40      </xs:sequence>
41      <xs:attribute name="land" use="required">
42        <xs:simpleType>
43          <xs:restriction base="xs:string">
44            <xs:enumeration value="Deutschland"/>
45            <xs:enumeration value="Schweiz"/>
46            <xs:enumeration value="Östereich"/>
47          </xs:restriction>
48        </xs:simpleType>
49      </xs:attribute>
50      <xs:attribute ref="einsicht" use="required"/>
51    </xs:complexType>
52  </xs:element>
53  <xs:element name="strasse">
54  <xs:element name="plz" type="plz-type"/>
55  <xs:element name="wohnort" type="xs:string"/>
56  <xs:element name="email" type="xs:string"/>
57    <xs:complexType>
58      <xs:attribute ref="einsicht"/>
59    </xs:complexType>
60  </xs:element>
61  <xs:element name="email" type="xs:string" default="Keine E-Mail angegeben"/>
62  <xs:element name="bild">
63    <xs:complexType>
64      <xs:attribute name="bildbezeichnung" use="required"/>
65    </xs:complexType>
66  </xs:element>
67  <xs:element name="nachname" type="xs:string"/>
68  <xs:element name="vorname" type="xs:string"/>
69  <xs:attribute name="einsicht">
70    <xs:simpleType>
71      <xs:restriction base="xs:string">
72        <xs:enumeration value="privat"/>
73        <xs:enumeration value="public"/>
74      </xs:restriction>
75    </xs:simpleType>
76  </xs:attribute>
77  <xs:attribute nr="nr">
78    <xs:simpleType>
79      <xs:restriction base="xs:positiveInteger"/>
80    </xs:simpleType>
81  </xs:attribute>
82  <xs:simpleType name="plz-type">
83    <xs:restriction base="xs:integer">
84      <xs:pattern value="[0-9]{5}"/>
85    </xs:restriction>
86  </xs:simpleType>
87</xs:schema>

Das fertige XML-Dokument#

<adressdb xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                xsi:noNamespaceSchemaLocation="artikel05.xsd">
   <adresse nr='1'>
    <anrede/>
    <name>
      <nachname/>
      <vorname/>
    </name>
    <strasse einsicht="privat"/>
    <postanschrift einsicht="privat" land="Deutschland">
      <plz>14548</plz>
      <wohnort/>
    </postanschrift>
    <email>Keine E-Mail angegeben</email>
    <bild bildbezeichnung="testbild.jpg"></bild>
  </adresse>
</adressdb>