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