Eindeutige Bausteine und allgemeine Muster


 ... [ Präsentation ] ... [ << DTDs ] ... [ Datentypen >> ] ...  




Übersicht: Eindeutige Bausteine und allgemeine Muster

  W3C Schema und Relax NG
  Eindeutige Bausteine eines W3C Schemas
  Allgemeine Muster von Relax NG
  Häufigkeitsbeschränkungen
  Bewertung



W3C Schema und Relax NG

W3C Schema
  • XML Schema Spezifikation wurde am 2. Mai 2001 W3C Recommendation
  • Beeinflußt von einer Vielzahl von Projekten
    • Document Content Description for XML (DCD)
    • Schema for Object-Oriented XML (SOX) von Commerce One
    • XML-Data-Reduced (XDR) von Microsoft
  • Aktuell werden Vorschläge und Änderungswünsche für eine Version 1.1 gesammelt
01) <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
02)   <xs:element name="book">
03)     <xs:complexType>
04)       <xs:sequence>
05)         <xs:element name="isbn" type="xs:string"/>
06)       </xs:sequence>
07)       <xs:attribute name="available" type="xs:string"/>
08)     </xs:complexType>
09)   </xs:element>
10) </xs:schema>



Relax NG
  • Regular Language for XML, New Generation
  • Entstand aus
    • RELAX Core (Regular Language Description for XML) von Murata Makoto:
      "eine einfache Schema Sprache die auf der Automaten Theorie basiert"

    • TRAX (Tree Regular Expressions for XML) von James Clark:
      "eine neue Sprache zum Validieren der Struktur von XML Dokumenten"

  • 2001 Zusammenschluss der beiden Ansätze unter dem Dach der OASIS (Organization for the Advancement of Structured Information Standards)
  • Ziel: Entwicklung einer leistungsfähigen Alternative zur W3C XML Schema Sprache
01) <grammar xmlns="http://relaxng.org/ns/structure/1.0">
02)   <start>
03)     <element name="book">
04)       <group>
05)         <element name="isbn"><text/>
06)         <attribute name="available"><text/>
07)       <group>
08)     </element>
09)   </start>
10) </grammar>





Eindeutige Bausteine eines W3C Schemas

Elemente, Attribute und Kombinatoren

01) <?xml version="1.0" encoding="UTF-8"?>
02) <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
03)   <!-- definition of simple type elements -->
04)   <xs:element name="isbn" type="xs:string"/>
05)   <!-- definition of attributes -->
06)   <xs:attribute name="available" type="xs:string"/>
07) 
08)   <!-- definition of groups -->
09)   <xs:group name="book-basic">
10)     <xs:sequence>
11)       <xs:element ref="isbn"/>
12)       <xs:element name="title" type="xs:string"/>
13)     </xs:sequence>
14)   </xs:group>
15) 
16)   <!-- main definition -->
17)   <xs:element name="book">
18)     <xs:complexType>
19)       <xs:sequence>
20)         <xs:group ref="book-basic"/>
21)         <xs:element name="character" type="xs:string"/>
22)       </xs:sequence>
23)       <xs:attribute name="id" type="xs:string"/>
24)       <xs:attribute ref="available"/>
25)     </xs:complexType>
26)   </xs:element>
27) </xs:schema>
  • XML konforme Syntax
  • Einfache Bausteine: <xs:element> und <xs:attribute>
  • Klare Trennung zwischen Elementen und Attributen
mögliche Gruppierung aus der W3C Schema Sicht
  • Gruppen als Container zur Wiederverwendung
  • compositors bestimmen das Verhalten der Gruppenelemente
    • Sequenz: xs:sequence
    • Auswahl: xs:choice
    • Beliebige Kombination: xs:all
01) <xs:group name="choiceGroup">
02)     <xs:choice>
03)       <xs:element name="isbn" type="xs:string"/>
04)       <xs:element name="title" type="xs:string"/>
05)     </xs:choice>
06) </xs:group>
07) <xs:group name="allGroup">
08)   <xs:all>
09)     <xs:element name="isbn" type="xs:string"/>
10)     <xs:element name="title" type="xs:string"/>
11)   </xs:all>
12) </xs:group>



Einschränkungen
  • <xs:all>
    • Nur auf oberster Ebene eines Inhaltsmodells erlaubt
    • Als Kinder nur einzelne Elemente möglich, keine weiteren Gruppen
  • Alle Gruppen: nur Elemente und keine Attribute erlaubt
  • Hierfür existieren eigene Attributgruppen
ungültiges Schema
01) <xs:group name="book-basic">
02)   <xs:sequence>
03)     <xs:attribute ref="id" type="xs:string"/>
04)     <xs:element name="title" type="xs:string"/>
05)   </xs:sequence>
06) </xs:group>
07) 
08) <!-- ok -->
09) <xs:attributeGroup name="book-attributes">
10)   <xs:attribute name="id" type="xs:string"/>
11)   <xs:attribute name="available" type="xs:string"/>
12) </xs:attributeGroup>
13) </xs:schema>



Einfache und komplexe Typen
  • Strikte Trennung zwischen den Typen
  • Einfache Typen (xs:simpleType)
  • Komplexe Typen (xs:complexType) dürfen Elemente und Attribute enthalten
  • Sie bilden eigenständige Datentypen und sind nicht nur Container
01) <xs:complexType name="characterType">
02)   <xs:sequence>
03)     <xs:element ref="name"/>
04)     <xs:element ref="age"/>
05)   </xs:sequence>
06) </xs:complexType>
07) <xs:element name="book">
08)   <xs:element name="character" type="characterType"
09)       minOccurs="0"  maxOccurs="unbounded"/>
10) </xs:element>
11) 
12) 
13) <book>
14)   <character>
15)     <name>snoopy</name>
16)     <age>53</age>
17)   </character>
18) </book>



Einschränkungen

nicht darstellbare Gruppierung
  • Viele unterschiedliche Baustein (distinct components)
  • Nur teilweise kombinierbar
  • Reihenfolge von Elementen und Attributen ist signifikant
  • Attribute müssen am Ende der Definition stehen
01) <xs:element name="book-basic">
02)   <xs:comlexeType>
03)     <xs:sequence>
04)       <xs:element name="isbn" type="xs:string"/>
05)       <xs:attribute name="id" type="xs:string"/>
06)     </xs:sequence>
07)   </xs:comlexeType>
08) </xs:element>
09) <xs:element name="book-extend">
10)   <xs:comlexeType>
11)     <xs:sequence>
12)       <xs:element name="character" type="xs:string"/>
13)       <xs:attribute name="available" type="xs:string"/>
14)     </xs:sequence>
15)   </xs:comlexeType>
16) </xs:element>
17) 
18) <xs:element name="book">
19)   <xs:sequence>
20)     <xs:element ref="book-basic"/>
21)     <xs:element ref="book-extend"/>
22)   </xs:sequence>
23) </xs:element>





Allgemeine Muster von Relax NG

01) <grammar xmlns="http://relaxng.org/ns/structure/1.0">
02)   <define name="element-author">
03)     <element name="author"><text/>
04)   </define>
05)   <define name="element-character">
06)     <element name="character">
07)       <attribute name="id"/>
08)     </element>
09)   </define>
10) 
11)   <define name="book-basic">
12)     <ref name="element-isbn"/>
13)     <attribute name="id"><text/>
14)   </define>
15)   <define name="book-extended">
16)     <attribute name="available"/>
17)     <ref name="element-character"/>
18)   </define>
19) 
20)   <define name="element-book">
21)     <element name="book">
22)       <ref name="book-basic"/>
23)       <ref name="book-extended"/>
24)     </element>
25)   </define>
26) 
27)   <start><ref name="element-book"/>
28) </grammar>
  • Ähnliche Syntax wie bei einem W3C Schema
  • Elemente und Attribute werden aber identisch behandelt, ähnlich dem XPath Konzept
  • Alle Komponenten (Elemente, Datentypen, Kombinatoren, ...) werden über benannte Muster dargestellt
  • Blöcke können dadurch viel flexibler definiert werden (book-basic, book-extended)
  • Identisches Vefahren bei der Verarbeitung
  • Sehr gute Wiederverwendungsmöglichkeiten -> siehe Haskell XML Toolbox



Kombinatoren

01) <define name="choiceGroup">
02)   <choice>
03)     <element name="isbn"><text/>
04)     <element name="title"><text/>
05)   <choice>
06) </define>
07) <define name="interleaveGroup">
08)   <interleave>
09)     <element name="isbn"><text/>
10)     <element name="title"><text/>
11)   </interleave>
12) </define>
  • Sequenz: <group>-Muster, Angabe ist optional
  • Auswahl: <choice>
  • beliebige Kombination: <interleave>
    • W3C Schema Beschränkungen für <interleave> nicht vorhanden
    • <interleave> kann an beliebiger Position stehen
    • Art der Kinder ist nicht beschränkt
    • Elemente können sogar verschachtelt werden
01) <element xmlns="http://relaxng.org/ns/structure/1.0" name="museum">
02)   <interleave>
03)     <element name="individual"><empty/>
04)     <group>
05)       <element name="group-member1"><empty/>
06)       <element name="group-member2"><empty/>
07)     </group>
08)   </interleave>
09) </element>
1. Gültig   2. Gültig
<museum>
  <individual></individual>
  <group-member1></group-member1>
  <group-member2></group-member2>
</museum>
 
<museum>
  <group-member1></group-member1>
  <group-member2></group-member2>
  <individual></individual>
</museum>
3. Gültig   4. Nicht Gültig
<museum>
  <group-member1></group-member1>
  <individual></individual>
  <group-member2></group-member2>
</museum>
 
<museum>
  <group-member2></group-member2>
  <individual></individual>
  <group-member1></group-member1>
</museum>





Häufigkeitsbeschränkungen

  • Häufigkeiten von Elementen in einer DTD nur über: +, *, ?
  • Entsprechen den Operatoren aus regulären Ausrücken
1) <!ELEMENT Buch (ISBN?, Titel, Author+, Character*)>
2)    <!ELEMENT ISBN (#PCDATA)>
3)    <!ELEMENT Titel (#PCDATA)>
4)    <!ELEMENT Author (#PCDATA)>
5)    <!ELEMENT Character (#PCDATA)>



W3C Schema
  • W3C Schema bietet bessere Möglichkeiten
  • Exakte Einteilung über die Attribute minOccurs und maxOccurs
  • unbounded -> unbegrenzt
  • Standardfall ist minOccurs=1 und maxOccurs=1
1) <xs:complexType name="book">
2)   <xs:sequence>
3)     <xs:element name="character" type="xs:string"
4)                 minOccurs="0"  maxOccurs="unbounded"/>
5)     <xs:element name="person" type="xs:string"
6)                 minOccurs="5"  maxOccurs="30"/>
7)   </xs:sequence>
8) </xs:complexType>
  • Beispiel kann mit einer DTD nur schwierig dargestellt werden
1) <!ELEMENT book
2)     (character*,
3)      person, person, person, person, person, person?,person?,person?,
4)      person?,person?,person?,person?,person?,person?,person?,person?,
5)      person?,person?,person?,person?,person?,person?,person?,person?,
6)      person?,person?,person?,person?,person?,person?) >



Relax NG
  • Besizt eine geringer Ausdruckskraft als die W3C Schema Sprache
  • Nur Einschränkungsmöglichkeiten einer DTD stehen zur Verfügung
  • +, *, ? werden über entsprechende Muster dargestellt

01) <define name="book-basic">
02)   <optional>
03)     <ref name="element-isbn"/>
04)   </optional>
05)   <ref name="element-title"/>
06)   <oneOrMore>
07)     <ref name="element-author"/>
08)   </oneOrMore>
09)   <zeroOrMore>
10)    <ref name="element-character"/>
11)   </zeroOrMore>
12) </define>
  • Identischer Aufwand wie bei einer DTD
  • Aufwand kann aber bei intelligenter Wiederverwendung von Mustern verkleinert werden
01) <element name="book">
02)   <ref name="fivePersons"/>
03)   <ref name="upto25Persons"/>
04) </element>
05) 
06) <define name="fivePersons">
07)   <element name="person"><empty/>
08)   <element name="person"><empty/>
09)   <element name="person"><empty/>
10)   <element name="person"><empty/>
11)   <element name="person"><empty/>
12) </define>
13) 
14) <define name="maybePerson">
15)   <optional><element name="person"><empty/>
16) </define>
17) 
18) <define name="upto25Persons">
19)   <optional><ref name="fivePersons"/>
20)   <optional><ref name="fivePersons"/>
21)   <optional><ref name="fivePersons"/>
22)   <optional><ref name="fivePersons"/>
23)   <ref name="maybePerson"/>
24)   <ref name="maybePerson"/>
25)   <ref name="maybePerson"/>
26)   <ref name="maybePerson"/>
27)   <ref name="maybePerson"/>
28) </define>





Bewertung

  • Relax NG bietet flexiblere Beschreibungsmöglichkeiten
  • Geringerer Lernaufwand durch identische Verarbeitungstechniken
  • Weniger Beschränkungen
  • Konzentration auf das symantische Design des Schemas
  • Größere Ausdruckskraft -> nicht jedes Schema läßt sich in ein W3C Schema transformieren
  • Kardinalitätskonzept von W3C Schema deutlich besser
  • Relax NG Entwickler sind sich dem Problem bewusst
    • Wenige Anwendungen nutzen exaktere Eingrenzungen
    • Deutlicher Geschwindigkeitsvorteil ohne weitere Beschränkungen
  • Dem gegenüber stehen viele Verbesserungsvorschläge in Newsgroups und Mailinglisten
<element name="bar" xmlns="http://relaxng.org/ns/structure/2.0>
  <cardinality min="5" max="30">
    <element name="foo"></element>
  </cardinality>
</element>






 ... [ Präsentation ] ... [ << DTDs ] ... [ Datentypen >> ] ... [ nach oben ] ...