Übungsserie 4: XML-Schemas 

Theoretische Grundlagen der Informatik, WS 02/03

Dozenten: J.-M. Piveteau, U.-M. Künzi

Aufgabe 1(XML-Schemas)

Speichern Sie den Inhalt des Beispiels eines Kontoauszugs in ein XML-Dokument (welche Informationen dürfen Sie weglassen, da sie besser durch ein Stylesheet angegeben werden sollten?).

Erstellen Sie für dieses XML-Dokument ein XML-Schema. Beachten Sie dabei folgende Punkte:

XML-Datei
<?xml version="1.0" encoding="UTF-8"?>
<Kontoauszug xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:noNamespaceSchemaLocation=
  "C:\HSR\Uebungen\Grundlagen\xml\Uebung4\Zahlung.xsd">
  <Kontonummer>230-23590.098-</Kontonummer>
    <Periode>
      <Anfangsdatum>01-10-2002</Anfangsdatum>
      <Enddatum>31-10-2002</Enddatum>
    </Periode>
  <Zahlung>
    <Waehrung>$</Waehrung>
    <Betrag>450.70</Betrag>
    <Datum>12-10-2002</Datum>
    <Referenznummer>456120987</Referenznummer>
    <Buchungstext>Zwei Übernachtungen</Buchungstext>
    <Empfaenger>Hotel Grand Luxe Paris</Empfaenger>
    <Spesen>0.00</Spesen>
    <Kontostand>10009.45</Kontostand>
  </Zahlung>
  <Zahlung>
    <Waehrung>$</Waehrung>
    <Betrag>237.00</Betrag>
    <Datum>15-10-2002</Datum>
    <Referenznummer>439000121</Referenznummer>
    <Buchungstext>Abendessen</Buchungstext>
    <Empfaenger>Restaurant Super Luxe Paris</Empfaenger>
    <Spesen>0.00</Spesen>
    <Kontostand>9772.45</Kontostand>
  </Zahlung>
  <Zahlung>
    <Waehrung>$</Waehrung>
    <Betrag>1893.00</Betrag>
    <Datum>22-10-2002</Datum>
    <Referenznummer>000012124</Referenznummer>
    <Buchungstext>Flugbillet Zürich-Paris</Buchungstext>
    <Empfaenger>Rappi-Travel-Agency</Empfaenger>
    <Spesen>0.00</Spesen>
    <Kontostand>7879.45</Kontostand>
  </Zahlung>
</Kontoauszug>
XSD-Datei
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
  elementFormDefault="qualified" attributeFormDefault="unqualified">
  <xs:element name="Kontoauszug">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="Kontonummer">
          <xs:simpleType>
            <xs:restriction base="xs:string">
              <xs:pattern value="\d\d\d\-\S*"/>
            </xs:restriction>
          </xs:simpleType>
        </xs:element>
        <xs:element name="Periode">
          <xs:complexType>
            <xs:sequence>
              <xs:element name="Anfangsdatum">
                <xs:simpleType>
                  <xs:restriction base="xs:string">
                    <xs:pattern value="\d\d\-\d\d\-\d\d\d\d"/>
                  </xs:restriction>
                </xs:simpleType>
              </xs:element>
              <xs:element name="Enddatum">
                <xs:simpleType>
                  <xs:restriction base="xs:string">
                    <xs:pattern value="\d\d\-\d\d\-\d\d\d\d"/>
                  </xs:restriction>
                </xs:simpleType>
              </xs:element>
            </xs:sequence>
          </xs:complexType>
        </xs:element>
        <xs:element name="Zahlung" maxOccurs="unbounded">
          <xs:complexType>
            <xs:sequence>
              <xs:element name="Waehrung">
                <xs:simpleType>
                  <xs:restriction base="xs:string">
                    <xs:pattern value="\p{Sc}"/>
                  </xs:restriction>
                </xs:simpleType>
              </xs:element>
              <xs:element name="Betrag">
                <xs:simpleType>
                  <xs:restriction base="xs:string">
                    <xs:pattern value="\d*\.\d\d"/>
                  </xs:restriction>
                </xs:simpleType>
              </xs:element>
              <xs:element name="Datum">
                <xs:simpleType>
                  <xs:restriction base="xs:string">
                    <xs:pattern value="\d\d\-\d\d\-\d\d\d\d"/>
                  </xs:restriction>
                </xs:simpleType>
              </xs:element>
              <xs:element name="Referenznummer">
                <xs:simpleType>
                  <xs:restriction base="xs:integer">
                    <xs:pattern value="\d\d\d\d\d\d\d\d\d"/>
                  </xs:restriction>
                </xs:simpleType>
              </xs:element>
              <xs:element name="Buchungstext" type="xs:string" minOccurs="0"/>
              <xs:element name="Empfaenger" type="xs:string"/>
              <xs:element name="Spesen">
                <xs:simpleType>
                  <xs:restriction base="xs:string">
                    <xs:pattern value="\d*.\d\d"/>
                  </xs:restriction>
                </xs:simpleType>
              </xs:element>
              <xs:element name="Kontostand">
                <xs:simpleType>
                  <xs:restriction base="xs:string">
                    <xs:pattern value="\d*\.\d\d"/>
                  </xs:restriction>
                </xs:simpleType>
              </xs:element>
            </xs:sequence>
          </xs:complexType>
        </xs:element>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
</xs:schema>

Vergleichen Sie Ihr Schema mit einem Schema, das vom XML-Spy auf der Basis des XML-Dokuments automatisch erzeugt wird.

Aufgabe 2 (Dokument mit gemischtem Inhalt, XML-Schemas mit Namensräumen)

Schreiben Sie ein XML-Schema für das unterstehende Dokument. Beachten sie dabei, dass es für jedes Buch zwei "Reviews" gibt: Stellen Sie sicher, dass sie in beliebiger Reihenfolge auftreten können.

 

<?xml version="1.0"?>

 

<booklist>

 

<book isbn="1-3456-0876-6">

<autor born="1929">Milan Kundera</autor>

<titel>Das Leben ist anderswo

<footnote>Originaltitel: Zivot je jinde</footnote>

<footnote>Aus dem Tschechischen von Franz Künzel</footnote>

</titel>

 

<personal_review>Kundera beehrrscht die Kunst, zu verhöhen, ohne zu verzerren. Jedes Detail, jede Psychologische Motivation in seinem Buch ist wahr und präzis.

<personal_reviewer>Gabriel Laub</personal_reviewer>

</personal_review>

 

<newspaper_review>In der Form eines realistischen Romans schafft Kundera trotz sprachlichen Geschmeidigkeit und Anmut ungemein scharfe Satire

<newspaper>Berner Tagblatt</newspaper>

</newspaper_review>

 

</book>

 

<!-- Weitere Bücher -->

 

</booklist>

Ergänzen Sie das XML-Dokument durch eine Meta-Information mit der RDF-Aufzeichnungsprache (Diese Metainformation muss mindestens den Autor, eine Kurzbeschreibung des Dokuments und das Datum der letzten Aktualisierung beinhalten) . Passen Sie Ihr XML-Schema entsprechend an.

XML-Datei
<?xml version="1.0" encoding="UTF-8"?>
<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"     
  xmlns:dc="http://purl.org/dc/elements/1.1/">
  <booklist xmlns="http://www.w3.org/2001/XMLSchema"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.w3.org/2001/XMLSchema
    C:\HSR\Uebungen\Grundlagen\xml\Uebung4\Booklist.xsd">
    <!-- <booklist> -->
    <book isbn="1-3456-0876-6">
      <autor born="1929">Milan Kundera</autor>
      <titel>Das Leben ist anderswo
        <footnote>Originaltitel: Zivot je jinde</footnote>
        <footnote>Aus dem Tschechischen von Franz Künzel</footnote>
      </titel>
      <personal_review>Kundera beehrrscht die Kunst, zu verhöhen, ohne zu
        verzerren. Jedes Detail, jede Psychologische Motivation in seinem Buch ist
        wahr und präzis.
          <personal_reviewer>Gabriel Laub</personal_reviewer>
      </personal_review>
      <newspaper_review>In der Form eines realistischen Romans schafft Kundera
         trotz sprachlichen Geschmeidigkeit und Anmut ungemein scharfe Satire
        <newspaper>Berner Tagblatt</newspaper>
      </newspaper_review>
    </book>
    <!-- Weitere Bücher -->
  </booklist>
  <rdf:Description about="">
    <dc:creator>Liebi</dc:creator>
    <dc:description>Dieses Dokument beschreibt verschiedene
       Bücher</dc:description>
    <dc:date>08.11.2002</dc:date>
  </rdf:Description>
</rdf:RDF>
 
XSD-Datei
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema targetNamespace="http://www.w3.org/2001/XMLSchema"
  xmlns:xs="http://www.w3.org/2001/XMLSchema"
  xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
  xmlns:dc="http://purl.org/dc/elements/1.1/" elementFormDefault="qualified"
  attributeFormDefault="unqualified">
  <xs:element name="autor">
    <xs:complexType>
      <xs:simpleContent>
        <xs:extension base="xs:string">
          <xs:attribute name="born" type="xs:short" use="required"/>
        </xs:extension>
      </xs:simpleContent>
    </xs:complexType>
  </xs:element>
  <xs:element name="book">
    <xs:complexType mixed="true">
      <xs:sequence>
        <xs:element ref="xs:autor"/>
        <xs:element ref="xs:titel"/>
        <xs:element ref="xs:personal_review"/>
        <xs:element ref="xs:newspaper_review"/>
      </xs:sequence>
      <xs:attribute name="isbn" type="xs:string" use="required"/>
    </xs:complexType>
  </xs:element>
  <xs:element name="booklist">
    <xs:complexType>
      <xs:sequence>
        <xs:element ref="xs:book"/>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
  <xs:element name="footnote" type="xs:string"/>
  <xs:element name="newspaper" type="xs:string"/>
  <xs:element name="newspaper_review">
    <xs:complexType mixed="true">
      <xs:choice minOccurs="0" maxOccurs="unbounded">
        <xs:element ref="xs:newspaper"/>
      </xs:choice>
    </xs:complexType>
  </xs:element>
  <xs:element name="personal_review">
    <xs:complexType mixed="true">
      <xs:choice minOccurs="0" maxOccurs="unbounded">
        <xs:element ref="xs:personal_reviewer"/>
      </xs:choice>
    </xs:complexType>
  </xs:element>
  <xs:element name="personal_reviewer" type="xs:string"/>
  <xs:element name="titel">
    <xs:complexType mixed="true">
      <xs:choice minOccurs="0" maxOccurs="unbounded">
        <xs:element ref="xs:footnote"/>
      </xs:choice>
    </xs:complexType>
  </xs:element>
</xs:schema>

 

Aufgabe 3 (Annotionen)

Die Elemente <xs:annotation>, <xs:documentation> und <xs:appinfo> erlauben Metainformationen in XML-Schemas zu speichern. Lesen Sie die Beschreibung dieser Elemente (z.B. im Buch E. Harold, S. Means, XML in a Nutshell, 2nd Edition, Chapter 16 und 21)