« Übersicht: Schema

Attribute mit Datentyp

../../_images/mosaik014-potsdam.jpg

Lernziel

Ein Attribut soll mit einem eingebauten Datentyp verknüpft werden.

Handlungsanweisungen

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

  2. Ein Attribut kann alle einfachen und komplexen Datentypen zugewiesen bekommen. Lassen Sie, für die laufende Nummer einer Adresse, nur positive Ganzzahlen zu.

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

Eingaben für Attribute validieren

Ein Attribut zur Pflicht machen, ist in einer DTD kein Problem. Den Datentyp genau zu definieren, funktioniert nur in einem Schema.

Ein weiteres Beispiel für einen einfachen Datentyp ist das Geburtsdatum, welches in der Beispiel-DTD nicht vorhanden ist.

Die Nummer darf nur positive Zahlen enthalten

Zeilen 10, 31, 74-78

 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
<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: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:attribute ref="nr" use="required"/>
    </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: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 name="nr">
    <xs:simpleType>
      <xs:restriction base="xs:positiveInteger"/>
    </xs:simpleType>
  </xs:attribute>
</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/>
      <wohnort/>
    </postanschrift>
    <email>Keine E-Mail angegeben</email>
    <bild bildbezeichnung="testbild.jpg"></bild>
  </adresse>
</adressdb>