Upload
trinhmien
View
234
Download
0
Embed Size (px)
Citation preview
1. Einführung 2. DTD 3. XML Schema 4. XPath 5. XSLT 6. XSL-FO 7. XQuery 8. Web Services 9. XML und Datenbanken
Inhalt des Moduls:
Grundlagen
Einfache Modelle
Inhaltsmodelle
Datentypen
Schlüssel und Schlüsselverweise
Grundlagen Das W3C XML Schema stellt eine W3C-Weiterführung der DTD dar.
Das XML Schema sollte bei neuen Anwendungen verwendet werden, in denen auf seine Vorteile wie Datentypvalidierung/-erstellung sowie die sehr umfangreichen Möglichkeiten der Ableitung von einfachen und komplexen, d.h. aus mehreren Elementen zusammen gesetzten Datentypen, Wert gelegt wird.
Insbesondere die Datentypen stellen ein wichtigen Pfeiler von XML Schema dar und sind in einem eigenen Standard spezifiziert, da sie auch in anderen XML-Technologien Verwendung finden.
XML Schema ist eine XML-Datei und kann daher auch mit XML-Techniken erstellt, bearbeitet, abgefragt und in andere Formate umgewandelt werden.
Folgende Ressourcen sind beim W3C verfügbar:
Einstiegsseite des W3C: http://www.w3c.org/XML/Schema
Einführung: http://www.w3c.org/TR/xmlschema-0/
Strukturen: http://www.w3c.org/TR/xmlschema-1/
Datentypen: http://www.w3c.org/TR/xmlschema-2/
Grundlagen
A-D E-N O-Z
all annotation any anyAttribute appinfo attribute attributeGroup choice complexContent complexType documentation
element extension (simpleContent) extension (complexContent) field group import include key keyref list notation
redefine restriction (simpleType) restriction (simpleContent) restriction (complexContent) schema selector sequence simpleContent simpleType union unique
Einen Überblick über die Namen der Elemente, die teilweise auch bereits ihre Funktion verraten, findet sich in nachfolgender Tabelle. Sie bieten eine Vielzahl an Vorgaben und Syntaxvarianten bei der Erstellung von Datenmodellen.
Inhalt des Moduls:
Grundlagen
Einfache Modelle
Inhaltsmodelle
Datentypen
Schlüssel und Schlüsselverweise
Einfache Modelle: Basis-Angaben
Einfache Inhaltsmodelle bestehen zunächst nur aus einigen Angaben, die
in jedem Regeldokument vorhanden sein müssen.
Identität: Welche Elemente erscheinen im Dokument? Wie heißen sie, und
welche Inhaltsmodelle haben sie wiederum?
Beziehungen: Zu welchen anderen Elementen stehen sie durch ihre
Inhaltsmodelle, d.h. durch den Aufruf anderer Elemente als Inhalt, in
Beziehung?
Kardinalität: Wie oft treten die einzelnen Elemente alleine oder im Verbund
bzw. in Gruppierungen auf? Sind sie obligatorisch, unbegrenzt oder optional zu
verwenden?
Reihenfolge: In welcher Reihenfolge treten die Elemente in ihrer jeweiligen
Dokumentebene auf? In welche Reihenfolgebeziehung stehen sie zu anderen
Elementen?
Einfache Modelle: Beispiel <?xml version="1.0" encoding="ISO-8859-1"?> <Preisliste xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="212_01.xsd"> <Tarif Nr="1"> <Name>Frühstück</Name> <Gueltigkeit> <Datum> <Von>01.01.03</Von> <Bis>30.06.03</Bis> </Datum> <Uhrzeit> <Von>6</Von> <Bis>10</Bis> </Uhrzeit> </Gueltigkeit> <Preis>1</Preis> </Tarif> </Preisliste>
Einfache Modelle: Elemente Ein Element lässt sich mit dem Element element festlegen, wobei die Attributliste auf die für den Einsteiger
wesentlichen Elemente gekürzt wurde.
Der Name wird im name-Attribut angegeben, das einen gültigen XML-Namen ohen Namensraumpräfix erwartet.
Die Häufigkeit lässt sich – sofern das Element nicht genau einmal auftreten soll – über die beiden Attribute
minOccurs (minimales Auftreten) und maxOccurs (maximales Auftreten) festlegen, die jeweils eine nicht-negative
Ganzzahl, d.h. auch den Wert 0 erwarten. Jede beliebige Kombination ist möglich. Sofern ein Element beliebig oft
auftreten darf, ist der Standardwert unbounded zu verwenden.
Der Datentyp wird über die vordefinierten Namen der XML Schema-Datentypen oder über einen eigenen Namen
aus der Liste der selbst erstellten Datentypen (globale simpleType-Elemente für einfache und complexType-
Elemente für komplexe Strukturen mit Kind-Elementen und Attributen) im type-Attribut angegeben.
Eine Referenz auf ein so genanntes globales element-Element, das direktes Kind vom Wurzelement ist, wird im
ref-Attribut über seinen Namen eingerichtet.
Ob ein Element leer sein kann, wird über das Attribut nillable angegeben.
Der Inhalt eines Elements können innerhalb vom complexType-Kind andere Elemente, Attribute sein oder
Schlüssel- und Schlüsselverweiselemente sowie innerhalb vom simpleType-Kind genaue Datentypangaben,
welche das type-Attribut ersetzen.
Die Reihenfolgenbeziehung zu anderen Elementen wird nicht innerhalb des Elements
selbst angegeben, sondern ist abhängig von seinem direkten Elternelement.
Einfache Modelle: Elemente
<xs:element name="Datum"> <xs:complexType> <xs:sequence> <xs:element name="Von" type="xs:string"/> <xs:element name="Bis" type="xs:string"/> </xs:sequence> </xs:complexType> </xs:element>
<element maxOccurs = (nonNegativeInteger | unbounded) : 1 minOccurs = nonNegativeInteger : 1 name = NCName nillable = boolean : false ref = QName type = QName {any attributes with non-schema namespace . . .}> Content: (annotation?, ((simpleType | complexType)?, (unique | key | keyref)*)) </element>
Einfache Modelle: Elemente Attribute befinden sich innerhalb des complexType-Kindelements innerhalb des element-Elements, gehören also zum komplexen Inhalt eines Elements, stehen aber außerhalb der Reihenfolgenangabe wie z.B. dem sequence-Element.
Der Name wird im name-Attribut angegeben, das einen gültigen XML-Namen ohen Namensraumpräfix erwartet.
Der Datentyp wird über die vordefinierten Namen der XML Schema-Datentypen oder über einen eigenen Namen aus der Liste der selbst erstellten Datentypen (globale simpleType-Elemente für einfache Typen) im type-Attribut angegeben.
Eine Referenz auf ein so genanntes globales attribute-Element, das direktes Kind vom Wurzelement ist, wird im ref-Attribut über seinen Namen eingerichtet.
Der Standardwert wird im default-Attribut mit einer Zeichenkette angegeben.
Der feste Wert wird im fixed-Attribut mit einer Zeichenkette angegeben.
Die Attributverwendung wird mit vorgegeben Werten im use-Attribut angegeben: optional (optional, kann vorkommen oder fehlen), prohibited (verboten, darf nicht auftreten, was nur sinnvoll bei der so genannten Ableitung ist) und required (verpflichtend, muss auftreten).
Der Inhalt eines attribute-Elements ist sinnvollerweise nur ein simpleType-Element, welches das type-Attribut ersetzt und genauere Datentypangaben enthält.
Einfache Modelle: Attribute
<xs:element name="Tarif" maxOccurs="unbounded"> <xs:complexType> <xs:sequence> <xs:element name="Name" type="xs:string"/> <xs:element name="Gueltigkeit"> ... </xs:element> <xs:element name="Preis" type="xs:string"/> </xs:sequence> <xs:attribute name="Nr" type="xs:positiveInteger" use="required"/> </xs:complexType> </xs:element>
<attribute default = string fixed = string name = NCName ref = QName type = QName use = (optional | prohibited | required) : optional {any attributes with non-schema namespace . . .}> Content: (annotation?, simpleType?) </attribute>
Einfache Modelle:
Lokale und globale Strukturen
XML Schema unterscheidet zwischen globalen und lokalen Strukturen:
Einfache und komplexe Datentypen
Elemente und Attribute
können einzeln oder auch als Gruppe (Element group für Elemente und Element attributeGroup für Attribute) global auftreten.
Das bedeutet, dass sie als direkte Kinder vom schema-Element erscheinen und im ref-Attribut von Elementen und Attributen global oder lokal aufgerufen werden können.
Dadurch hat man die Möglichkeit, Auslagerung und Wiederverwendung einzurichten und die angegeben Eigenschaften mehrfach im Dokument zu verwenden.
Einfache Modelle:
Lokale und globale Strukturen <xs:schema
xmlns:xs="http://www.w3.org/2001/XMLSchema"> <!-- Globale Elemente --> <xs:element name="Von" type="xs:string"/> <xs:element name="Bis" type="xs:string"/> <!-- Wurzelelement --> <xs:element name="Preisliste"> <xs:complexType> ... ... </xs:complexType> </xs:element> </xs:schema>
<xs:element name="Datum"> <xs:complexType> <xs:sequence> <xs:element ref="Von"/> <xs:element ref="Bis"/> </xs:sequence> </xs:complexType> </xs:element> <xs:element name="Uhrzeit"> <xs:complexType> <xs:sequence> <xs:element ref="Von"/> <xs:element ref="Bis"/> </xs:sequence> </xs:complexType> </xs:element> </xs:sequence> </xs:complexType> </xs:element>
Inhalt des Moduls:
Grundlagen
Einfache Modelle
Inhaltsmodelle
Datentypen
Schlüssel und Schlüsselverweise
Inhaltsmodelle: Beispiel
<?xml version="1.0" encoding="ISO-8859-1"?> <Kundenliste xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="32_08.xsd"> <Kunde Typ="g"> <Name> <Firma>Fleckner + Söhne GmbH + Co. KG</Firma> <Branche>Fördergurte Gummi Kunststoffe</Branche> </Name> <Umsatz>703.43</Umsatz> </Kunde> <Kunde Typ="p"> <Name> <Nachname>Erdle</Nachname> <Vorname>Johann</Vorname> </Name> <Umsatz>229,45</Umsatz> </Kunde> </Kundenliste>
Inhaltsmodelle: Reihenfolge
Mit der Schema-Komponente sequence legt man für die innerhalb des von ihr aufgespannten Containers deklarierten Elemente eine Reihenfolgenbeziehung fest. Die einzelnen Elemente müssen genau in der Reihenfolge, in der sie innerhalb von sequence erscheinen, auch im Instanzdokument auftreten. Dabei sind jeweils die Häufigkeitsbeschränkungen in minOccurs und maxOccurs zu berücksichtigen, wobei solche Häufigkeitsbeschränkungen auch für das gesamte sequence-Element gelten.
<sequence maxOccurs = (nonNegativeInteger | unbounded) : 1 minOccurs = nonNegativeInteger : 1 {any attributes with non-schema namespace . . .}> Content: (annotation?, (element | group | choice | sequence | any)*) </sequence>
Inhaltsmodelle: Auswahl
Der choice-Container drückt aus, dass die direkten Kinder sich gegenseitig ausschließende Alternativen darstellen und daher nur eine von diesen Alternativen im XML-Dokument auftreten darf.
<choice maxOccurs = (nonNegativeInteger | unbounded) : 1 minOccurs = nonNegativeInteger : 1 {any attributes with non-schema namespace . . .}> Content: (annotation?, (element | group | choice | sequence | any)*) </choice>
Inhaltsmodelle: Freie Wahl
Der all-Container drückt aus, dass eine beliebige Reihenfolge der element-Kinder im XML-Dokument auftreten kann.
<all maxOccurs = 1 : 1 minOccurs = (0 | 1) : 1 {any attributes with non-schema namespace . . .}> Content: (annotation?, element*) </all>
Inhaltsmodelle: Ko-Abhängigkeiten
<?xml version="1.0" encoding="ISO-8859-1"?> <Kundenliste xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="32_08.xsd"> <Kunde Typ="g"> <Name> <Firma>Fleckner + Söhne GmbH + Co. KG</Firma> <Branche>Fördergurte Gummi Kunststoffe</Branche> </Name> <Umsatz>703.43</Umsatz> </Kunde> <Kunde Typ="p"> <Name> <Nachname>Erdle</Nachname> <Vorname>Johann</Vorname> </Name> <Umsatz>229,45</Umsatz> </Kunde> </Kundenliste>
Die so-genannte Ko-Abhängigkeit zwischen Attributwert und Elementen ist weder in XML Schema noch in der DTD abzubilden.
Inhalt des Moduls:
Grundlagen
Einfache Modelle
Inhaltsmodelle
Datentypen
Schlüssel und Schlüsselverweise
Datentypen: Typsystem
Das XML Schema zeichnet sich insbesondere durch die Integration einer überaus umfangreichen Datentypstruktur aus.
Mit ihr können für alle Programmiersprachen und Datenbanken Datentypangaben getroffen werden.
In Kombination mit eigenen Datentypen und weiteren Einschränkungen können genau die erforderlichen Angaben getroffen werden, die für den aktuellen Einsatz notwendig sind.
Die Datentypen sind in einem eigenen Standard beschrieben, da sie auch in anderen XML-Technologien vom W3C verwendet werden.
Datentypen: Typsystem
Zahlen Zeichenketten Zeit Logik
decimal float double hexBinary base64Binary
string anyURI QName NOTATION
duration dateTime time date gYearMonth gYear gMonthDay gDay gMonth
boolean
Zahlen Zeichenketten
integer nonPositiveInteger negativeInteger long int short byte
nonNegativeInteger unsignedLong unsignedInt unsignedShort unsignedByte positiveInteger
normalizedString token language NMTOKEN NMTOKENS Name NCName
ID IDREF IDREFS ENTITY ENTITIES
Übersicht der von den primitiven Datentypen abgeleiteten Datentypen
Übersicht über die primitiven Datentypen
Datentypen: Typsystem
Jahr Monat Tag Stunde Minute Sekunde
nY nM (*) nD (*) nH (*) nM (*) nS (*) (wahlweise auch Dezimalstellen für kleinere Unterteilungen)
Die Datums- und Zeittypen erfordern spezielle Formatierungen, die in Datenbanken teilweise nur mit Trigger oder eigenen CHECK-Bedingungen überprüft werden können. Sie sind daher für die DB-Entwicklung besonders interessant und nützlich.
Eine Dauer (duration) wird im Format PnYnMnDTnHnMnS, angegeben:
Datum und Uhrzeit (dateTime) werden in der Form CCYY-MM-DDThh:mm:ss mit dem Trennzeichnen T zwischen Tages- und Uhrzeitangabe angegeben:
Jahr Monat Tag Stunde Minute Sekunde
CCYY MM DD hh mm ss (wahlweise auch Dezimalstellen für kleinere Unterteilungen)
Datentypen: Typsystem
Analog zu diesen beiden Beispielen lauten die anderen Formate für den gregorianischen Kalender:
Zeit (time): hh:mm:ss.sss.
Datum (date): CCYY-MM-DD
Kombinationen und Felder wie Jahr/Monat (gYearMonth) CCYY-MM, Tag/Monat (gMonthDay) MM-DD, Jahr (gYear) CCYY, Monat (gMonth) MM und Tag (gDay) DD.
Datentypen:
Eigene einfache Datentypen
Sofern keine bereits vordefinierten Datentypen zum Einsatz kommen können, besteht die Möglichkeit, lokal weitere Einschränkungen zu treffen oder sogar global eigene benannte Datentypen zu erstellen.
Dabei kommen so genannte Fassetten zum Einsatz. Nicht jede Fassette ist für jeden Datentyp zulässig.
Sie geben typischerweise Längenbeschränkungen für Zeichen oder Grenzen für Zahlen sowie Dezimalaufteilungen an. Sollte dann komplexe Prüfungen notwendig werden, kann man sogar reguläre Ausdrücke verwenden.
Man unterscheidet zwischen grundlegenden und einschränkenden Fassetten, wobei die grundlegenden nicht beeinflusst werden können, sondern Datentypen allgemein charakterisieren. Die einschränkenden dagegen lassen sich über XML Schema-Elemente innerhalb vom simpleType-Element verwenden.
gleich
geordnet
beschränkt
Kardinalität
numerisch
length
minLength
maxLength
pattern
enumeration
whiteSpace
maxInclusive
maxExclusive
minInclusive
minExclusive
totalDigits
fractionDigits
Grundlegende Fassetten Einschränkende Fassetten
Fassetten
Datentypen:
Eigene einfache Datentypen
Datentypen: Komplexe Datentypen
Neben den einfachen Datentypen gibt es in XML Schema einen weiteren wesentlichen Pfeiler, der sowohl für einfache Auslagerung und Wiederverwendung nützlich ist als auch in erweiterten – oftmals als objektorientierten - Ableitungstechniken genutzt wird.
Dies betrifft die Möglichkeit, die complexType-Kinder von element-Elementen ebenfalls zu globalisieren und ihnen einen Namen zu geben, unter dem sie dann im type-Attribut genauso wie einfache Datentypen in einem element-Element aufgerufen werden können.
Diese Technik eröffnet Möglichkeiten, auch komplexe Strukturen mit verschachtelten Inhalten auszulagern und wieder zu verwenden als auch diese Strukturen abzuleiten, d.h. zu erweitern und zu verkleinern.
Datentypen: Komplexe Datentypen
<xs:schema …>
<!-- Globaler komplexer Typ -->
<xs:complexType name="SummeTyp">
<xs:sequence>
<xs:element name="Min" type="xs:decimal"/>
…
</xs:sequence>
</xs:complexType>
<!-- Wurzelelement -->
<xs:element name="Umsatzuebersicht">
…
<xs:element name="Summe" type="SummeTyp"/>
Datentypen: Komplexe Datentypen
Der nächste Schritt besteht in der Ableitung von globalen komplexen Strukturen, in dem
entweder weitere Einschränkungen durchgeführt werden (weniger Kind-Elemente
oder Attribute bzw. kleinerer Datenbereich) oder Erweiterungen stattfinden (Anhängen von Kindelementen oder Attributen).
Globale komplexe Typen eignen sich dazu, wieder verwendbare Komponenten in Form von benannten Bereichen als Kind-Elemente des schema-Elements zu erstellen, die später innerhalb der Definitionen anderer Elemente in ihrem type-Attribut aufgerufen werden.
Man überträgt dadurch die im globalen komplexen Typ definierten Eigenschaften in das gerade deklarierte Element und verzichtet dabei auf eine lokale Definition der jeweiligen Kind-Elemente.
Datentypen: Komplexe Datentypen
Ableitung durch Erweiterung:
Bei der Ableitung durch Erweiterung ergänzt man einen gegebenen globalen komplexen Typen um weitere Elemente oder Attribute.
Wichtig ist hier die Einschränkung, dass man also keine andere Reihenfolge wählen und nur weitere Elemente an die ohnehin schon bestehenden des globalen komplexen Typen anhängen kann.
Das gleiche Prinzip gilt auch für Attribute. Daher ist bei der Gestaltung des XML-Dokuments Vorsicht geboten, damit eine mögliche Ableitung und dadurch z.B. eine weitere Auslagerung von Komponenten oder eine Verkürzung von Quelltext überhaupt realisierbar wird.
Ableitung durch Einschränkung:
Die Ableitung durch Einschränkung fällt für globale komplexe Typen deutlich aus dem Rahmen der bisher vorgestellten Syntax und Konzeptionen.
Zwar lässt sich ein Basistyp definieren, aber man muss das gesamte Inhaltsmodell redefinieren.
Dabei verzichtet man dann einfach auf die nicht benötigten Elemente. Grundsätzlich kommt dies aber einer komplett neuen Definition gleich, wobei lediglich ein Bezug in Form einer syntaktisch deutlich verankerten Dokumentation oder Anmerkung auf die Existenz eines globalen komplexen Typs und damit einer ausgelagerten Komponente verweist.
<xs:complexType name="UmsatzTyp"> <xs:sequence> <xs:element ref="Umsatz"/> <xs:element ref="Anrufe"/> [ <xs:element ref="Kunden"/> ] </xs:sequence> </xs:complexType>Ableitung durch
ErweiterungAbleitung durch
Einschränkung
Globaler komplexer Typ
<xs:element name="Gesamt"> <xs:complexType> <xs:complexContent> <xs:extension base="UmsatzTyp"> <xs:sequence> <xs:element ref="Kunden"/> </xs:sequence> </xs:extension> </xs:complexContent> </xs:complexType></xs:element>
<xs:element name="ProKopf"> <xs:complexType> <xs:complexContent> <xs:restriction base="UmsatzTyp"> <xs:sequence> <xs:element ref="Umsatz"/> <xs:element ref="Anrufe"/> </xs:sequence> </xs:restriction> </xs:complexContent> </xs:complexType></xs:element>
Datentypen: Komplexe Datentypen
Inhalt des Moduls:
Grundlagen
Einfache Modelle
Inhaltsmodelle
Datentypen
Schlüssel und Schlüsselverweise
Schlüssel und Schlüsselverweise
Die Identitätsbeschränkungs-Komponenten dienen mit den
Elementen key, selector, field, keyref sowie unique dazu, eine
Verbindung zwischen einem qualifizierten Namen und einer
Schlüsselangabe herzustellen bzw. eine Referenz auf einen solchen
Schlüssel festzulegen.
Man setzt dabei XPath-Ausdrücke für die Bestimmung von
Lokalisierungspfaden zu den identitätsbeschränkten Selektoren und
ihren untergeordneten Feldern.
Als Syntax für den Schlüsselbezug, also die Referenz auf einen
gültigen Schlüssel, verwendet man dabei den qualifizierten Namen
des Schlüssels innerhalb des keyref-Elements für einen oder den
Namen des keyrefs-Elements für mehrere Schlüssel.
Schlüssel und Schlüsselverweise
In XML Schema gibt es zwei verschiedene Elemente zur Auswahl, mit denen Schlüssel und ein Element, mit dem Verweise angegeben werden können.
Definition eines eindeutigen Schlüssels mit Hilfe der Schema-Komponente unique, wobei die Existenz des Feldes (Attribut oder Element) nicht kontrolliert wird.
<unique
name = NCName
{any attributes with non-schema namespace . . .}>
Content: (annotation?, (selector, field+))
</unique
Definition eines eindeutigen Schlüssels und Kontrolle auf Existenz der als Schlüsselbestandteile angegebenen Feldes (Attribut oder Element) mit Hilfe der Schema-Komponente key.
<key
name = NCName
{any attributes with non-schema namespace . . .}>
Content: (annotation?, (selector, field+))
</key>
Schlüssel und Schlüsselverweise
Für die Definition von Verweisen wird nur ein Element benötigt.
Definition eines Schlüsselverweises mit Hilfe der Schema-Komponente keyref unter Angabe des Schlüsselnamens und des Feldes (Attribut oder Element), welches den referenzierenden Wert enthält.
<keyref
name = NCName
refer = QName
{any attributes with non-schema namespace . . .}>
Content: (annotation?, (selector, field+))
</keyref>
Schlüssel und Schlüsselverweise
1. Jede Rechnungsnummer im Nr-Attribut ist innerhalb von Rechnungen einzigartig.
2. Jede Kundennummer im Nr-Attribut ist innerhalb von Rechnung einzigartig.
3. Jede Postennummer im Nr-Attribut ist innerhalb von Rechnung einzigartig.
4. Jede Tarifnummer im Nr-Attribut ist innerhalb von Rechnung einzigartig.
1
2
3
4
Schlüssel und Schlüsselverweise 1. Jede Rechnungsnummer im Nr-Attribut ist innerhalb von Rechnungen einzigartig.
2. Jede Rechnung ist selbst einzigartig (Spieglein-an-der-Wand-Regel).
3. Jede Posten-RefNr bezieht sich auf ihre eigene Rechnungsnummer.
1 2
3