Eindeutige Bausteine und allgemeine Muster


 ... [ Ausarbeitung: Schema Sprachen ] ... [ << 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
Die XML Schema Spezifikation wurde vom W3C am 2. Mai 2001 mit dem Status "Recommendation" versehen und somit nach einem zweijährigen Entwicklungsprozess verabschiedet. Sie wurde als Weiterentwicklung der DTDs vom W3C konzipiert und durch eine große Anzahl verschiedener Projekte und Ideen beeinflusst. Hierzu zählen beispielsweise die Document Content Description for XML (DCD), das Schema for Object-Oriented XML (SOX) der Firma Commerce One oder XML-Data-Reduced (XDR) von Microsoft.

Aktuell werden vom W3C Vorschläge und Änderungswünsche für eine Schema Version 1.1 gesammelt.


Relax NG
Relax NG (Regular Language for XML, New Generation) entstand aus den beiden Projekten RELAX Core und TREX.
RELAX Core (Regular Language Description for XML) wurde bis dahin von Murata Makoto entwickelt und ist "eine einfache Schema Sprache, die auf der Automaten Theorie basiert". Parallel zu RELAX Core erstellte James Clark mit TRAX (Tree Regular Expressions for XML) "eine neue Sprache zum Validieren der Struktur von XML-Dokumenten".
Diese beiden Aussagen der Entwickler drücken die wichtigsten Eigenschaften von Relax NG aus, ein solides mathematisches Fundament einerseits und das Ziel, die Struktur von XML-Dokumenten zu validieren, andererseits.
Der Zusammenschluss der Ansätze erfolgte 2001 unter dem Dach der OASIS (Organization for the Advancement of Structured Information Standards) mit dem Ziel, eine leistungsfähige Alternative zur W3C Schema Sprache zu entwickeln.
Relax NG wurde seit seiner Veröffentlichung bereits in einer Vielzahl von Projekten, zum Beispiel dem OASIS DocBook, erfolgreich eingesetzt. Selbst der W3C nutzt Relax NG in einigen seiner Empfehlungen wie beispielsweise der XHTML 2.0 oder RDF/XML Spezifikation.




Eindeutige Bausteine eines W3C Schemas

Beide Schema Sprachen nutzen eine XML konforme Syntax, die auf den ersten Blick ziemlich identisch aussieht. Die zugrunde liegenden Konzepte unterscheiden sich allerdings sehr deutlich voneinander.

W3C Schema
01) <?xml version="1.0" encoding="UTF-8"?>
02) <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
03) 
04)   <xs:element name="book">
05)     <xs:complexType>
06)       <xs:sequence>
07)         <xs:element name="isbn" type="xs:string"/>
08) 
09) 
10)         <xs:element name="title" type="xs:string"/>
11) 
12) 
13)         <xs:element name="author" type="xs:string"/>
14)       </xs:sequence>
15) 
16)       <xs:attribute name="id" type="xs:string"/>
17) 
18) 
19)       <xs:attribute name="available" type="xs:string"/>
20) 
21) 
22)       ...
23)     </xs:complexType>
24)   </xs:element>
25) 
26) </xs:schema>
Relax NG
01) <?xml version="1.0" encoding="UTF-8"?>
02) <grammar xmlns="http://relaxng.org/ns/structure/1.0">
03)   <start>
04)     <element name="book">
05)       <group>
06) 
07)         <element name="isbn">
08)           <text/>
09)         </element>
10)         <element name="title">
11)           <text/>
12)         </element>
13)         <element name="author">
14)           <text/>
15)         </element>
16)         <attribute name="id">
17)           <text/>
18)         </attribute>
19)         <attribute name="available">
20)           <text/>
21)         </attribute>
22)         ....
23)       <group>
24)     </element>
25)   </start>
26) </grammar>

Ein W3C Schema nutzt dieselbe Sichtweise auf die einzelnen Komponenten (components) einer XML-Datei (Elemente, Attribute, Datentypen, usw.), die schon innerhalb einer DTD verwendet wurden und setzt diese Technik konsequent fort. Im Fokus der W3C Schema Beschreibung befinden sich die Elemente und Attribute zwischen denen eine klare Trennung besteht. Zudem definiert die W3C Schema Spezifikation eine Reihe gut voneinander abgegrenzter Bausteine (distinct components), die zum Lösen der verschiedenen Aufgaben einer Schema Sprache genutzt werden können.
Relax NG verwendet hingegen einen musterbasierten Ansatz (pattern), so dass es innerhalb von Relax NG keine strikte Unterscheidung der einzelnen Komponenten gibt, sondern alle Bausteine durch ein identisches Verfahren mit Hilfe von benannten Mustern (named pattern) abgebildet werden.
Dieser Ansatz ermöglicht es dem Anwender, ein Relax NG Schema sehr viel flexibler zu schreiben und mit anderen zu kombinieren, als dies mit entsprechenden W3C Schemata möglich wäre.


mögliche Gruppierung aus der W3C Schema Sicht
Abbildung 1: mögliche W3C Schema Sicht
mögliche Gruppierung aus der Relax NG Sicht
Abbildung 2: mögliche Relax NG Sicht

Abbildung 1 zeigt eine mögliche Gruppierung der Komponenten des book-Elements aus der Sicht eines W3C Schemas. Über die Definition von Gruppen, einfachen und komplexen Typen lassen sich Strukturen zusammenfassen und dadurch wieder verwenden. Die Elemente eines der definierten Blöcke in Abbildung 1 wären: isbn, titel und author, ein anderer Block stellt die gesamten character-Elemente dar. Allerdings können die Definitionen in einem W3C Schema nicht beliebig miteinander verknüpft werden, da eine Anzahl von Restriktionen, wie beispielsweise die Reihenfolge von Elementen und Attributen, eingehalten werden müssen.
Abbildung 2 zeigt eine weitere denkbare Gruppierung, die jedoch nur mit Relax NG beschrieben werden kann. Das Muster-Konzept erlaubt es dem Anwender hierbei, die Komponenten frei untereinander zu gruppieren und anschließend zu kombinieren. Aber nicht nur die Flexibilität bei der Erstellung von Schemata wird durch patterns erhöht, sie sind ebenso einer der Hauptgründe für die Einfachheit und die leichte Erlernbarkeit von Relax NG. Ein Anwender muss sich keine lange Liste von Beschränkungen einprägen und während der Entwicklung seines Schemas überprüfen. Er kann sich vollständig auf das symantische Design des Schemas konzentrieren.
Die folgenden Abschnitte beschreiben an einigen praktischen Beispielen diese Problematik und geben zugleich eine Einführung in die beiden Schema Sprachen.


Elemente, Attribute und Kombinatoren eines W3C Schemas

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)   <xs:element name="title" type="xs:string"/>
06)   <xs:element name="author" type="xs:string"/>
07) 
08)   <!-- definition of attributes -->
09)   <xs:attribute name="id" type="xs:string"/>
10)   <xs:attribute name="available" type="xs:string"/>
11) 
12)   <!-- definition of groups -->
13)   <xs:group name="book-basic">
14)     <xs:sequence>
15)       <xs:element ref="isbn"/>
16)       <xs:element ref="title"/>
17)       <xs:element ref="author"/>
18)     </xs:sequence>
19)   </xs:group>
20) 
21)   <!-- definition of complex type elements -->
22)   <xs:complexType name="characterType">
23)     <xs:attribute ref="id"/>
24)   </xs:complexType>
25) 
26)   <!-- main definition -->
27)   <xs:element name="book">
28)     <xs:complexType>
29)       <xs:sequence>
30)         <xs:group ref="book-basic"/>
31)         <xs:element name="character" type="characterType"
32)              minOccurs="0"  maxOccurs="unbounded"/>
33)       </xs:sequence>
34)       <xs:attribute ref="id"/>
35)       <xs:attribute ref="available"/>
36)     </xs:complexType>
37)   </xs:element>
38) </xs:schema>
XML Elemente werden durch das W3C Schema Tag <xs:element> dargestellt. Das Tag <xs:element name="author" type="xs:string"/> (6) beschreibt das Element author dessen Inhalt vom Typ string sein muss. Attribute werden entsprechend durch <xs:attribute> (9) definiert. <xs:element> und <xs:attribute> bilden somit die einfachen W3C Schema Bausteine, die in Gruppen und Datentypen zu größeren Strukturen zusammengesetzt werden können. "Gruppen Kombinatoren", in der W3C Spezifikation compositors genannt, regeln dabei das Verhalten der Elemente innerhalb dieser Festlegungen.
Die Definition der Basisinformation über ein Buch (book-basic) (13) erfolgt durch Verwendung einer Gruppe: xs:group und dem Kombinator xs:sequence. xs:group enthält dabei den Namen über den die Gruppe später referenziert werden kann (30), xs:sequence legt fest, dass die Elemente der Gruppe (isbn, title, author) in der angegebenen Reihenfolge im XML-Dokument vorkommen müssen. Das xs:group-Element ist ein Container für eine Menge von Elementen, das zum Beschreiben von zusammengesetzen Strukturen genutzt werden kann, es definiert keinen eigenen Datentypen.
Neben xs:sequence existieren noch zwei weitere Kombinatoren, die eine Gruppe beschränken können: xs:choice und 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>
<xs:choice> bewirkt, dass nur eines seiner Kindelemente in der XML-Instanz auftreten darf. Bei <xs:all> Gruppen können die Kindelemente einmal oder gar nicht vorkommen und zwar in beliebiger Reihenfolge. Allerdings kann <xs:all> nur auf oberster Ebene eines Inhaltsmodells stehen, und als Kinder sind nur einzelne Elemente und keine weiteren Gruppen erlaubt.
Wichtig ist außerdem, dass in keiner der drei vorgestellten Gruppen Attribute erlaubt sind, da diese im Inhaltsmodell strikt von den Elementen getrennt behandelt werden.
Sie können nur in eigenen Attributgruppen definiert werden.

1) <xs:attributeGroup name="bookAttributes">
2)   <xs:attribute name="id" type="xs:string"/>
3)   <xs:attribute name="available" type="xs:string"/>
4) </xs:attributeGroup>
Sämtliche Attribute und referenzierten Attributgruppen müssen nach allen Kinder des Elements definiert werden.
Das folgende Beispiel wäre somit kein gültiges W3C Schema, da das number-Attribut an dieser Stelle (3) nicht erlaubt ist.

1) <xs:element name="book">
2)   <xs:complexType>
3)     <xs:attribute name="number" type="xs:string"/>
4)     <xs:element name="character" type="xs:string"/>
5)     <xs:attribute ref="bookAttributes"/>
6)   </xs:complexType>
7) </xs:element>



Einfache und komplexe Typen
Der characterType-Block des einleitenden Beispiels nutzt das bereits erwähnte Sprachelement der komplexen Typen. In der W3C Schema Sprache gibt es dabei eine grundlegende Unterscheidung zwischen komplexen Typen (xs:complexType), die Elemente enthalten und Attribute tragen dürfen, und einfachen Typen (xs:simpleType), bei denen das nicht erlaubt ist. Die einfachen Datentypen werden im nächsten Kapitel Datentypen näher betrachtet. Im Gegensatz zu Gruppen definieren komplexe Typen (1) nicht nur einen Container für Elemente, sondern eigenständige Datentypen, die dann im type-Attribut eines Elements (8) eingesetzt werden können.

01) <xs:complexType name="characterType">
02)   <xs:element ref="name"/>
03)   <xs:attribute ref="age"/>
04) </xs:complexType>
05) 
06) <xs:element name="book">
07)   ...
08)   <xs:element name="character" type="characterType"
09)        minOccurs="0"  maxOccurs="unbounded"/>
10)   ...
11) </xs:element>
12) 
13) 
14) <book>
15)   ...
16)   <character>
17)     <name>Snoopy</name>
18) 	<age>54</age>
19)   </character>
20)   <character>
21)     <name>Charlie Brown</name>
22) 	<age>54</age>
23)   </character>
24)   ...
25) </book>



Einschränkungen in einem W3C Schema
Die bereits erwähnte strikte Unterscheidung von Elementen und Attributen ist auch der Grund, warum die in Abbildung 2 dargestellte Aufteilung nicht mit einem W3C Schema realisiert werden kann.

01) <xs:group name="book-basic">
02)   <xs:sequence>
03)     <xs:element ref="isbn"/>
04)     <xs:element ref="title"/>
05)     <xs:element ref="author"/>
06)   </xs:sequence>
07)   <xs:attribute ref="id"/>
08) </xs:group>
09) 
10) <xs:group name="character">
11)   <xs:element name="character" type="characterType"
12)            minOccurs="0"  maxOccurs="unbounded"/>
13) </xs:group>
14) 
15) <xs:element name="book">
16)   <xs:complexType>
17)     <xs:group ref="book-basic"/>
18)     <xs:group ref="character"/>
19)   </xs:complexType>
20) </xs:element>
Würde man das Attribut id (7) der Basisinformationen hinzufügen, käme es beim Zusammensetzen der Blöcke book-basic (1) und character (10) dazu, dass das Attribut id zwischen Elementen (author und character) stehen würde, was nach der W3C Schema Spezifikation nicht erlaubt ist.

01) <xs:element name="book">
02)   <xs:complexType>
03)     <xs:sequence>
04)       <xs:element ref="isbn"/>
05)       <xs:element ref="title"/>
06)       <xs:element ref="author"/>
07)     </xs:sequence>
08)     <xs:attribute ref="id"/>
09)     <xs:element name="character" type="characterType"
10)              minOccurs="0"  maxOccurs="unbounded"/>
11)   </xs:complexType>
12) </xs:element>





Allgemeine Muster von Relax NG

Die Definition eines Elements bzw. Attributs in Relax NG ist sehr ähnlich zu einem W3C Schema.

01) <grammar xmlns="http://relaxng.org/ns/structure/1.0">
02)   <define name="element-author">
03)     <element name="author">
04)       <text/>
05)     </element>
06)   </define>
07)   ...
08)   <define name="element-character">
09)     <element name="character">
10)       <attribute name="id"/>
11)     </element>
12)   </define>
13) 
14)   <define name="book-basic">
15)     <group>
16)       <ref name="element-isbn"/>
17)       <optional>
18)         <ref name="element-character"/>
19)       </optional>
20)       <attribute name="id">
21)         <text/>
22)       </attribute>
23)     </group>
24)   </define>
25)   <define name="book-extended">
26)     <attribute name="available"/>
27)     <zeroOrMore>
28)       <ref name="element-character"/>
29)     </zeroOrMore>
30)   </define>
31) 
32)   <define name="element-book">
33)     <element name="book">
34)       <ref name="book-basic"/>
35)       <ref name="book-extended"/>
36)     </element>
37)   </define>
38) 
39)   <start>
40)     <ref name="element-book"/>
41)   </start>
42) </grammar>
Das <author>-Element wird zum Beispiel auf die folgende Weise beschrieben: <element name="author">...</element> (2). Das id-Attribut entsprechend: <attribute name="id">...</attribute> (20). Das Kindelement (<text/>) (4) entspricht dem Wert des type-Attributs des W3C Schemas und legt den Datentypen des Elements fest. Derzeit ist durch <text/> eine beliebige Zeichenkette erlaubt. Die verschiedenen Datentypen und ihre Auswirkungen auf den Wertebereich von Elementen werden noch einmal genauer im Kapitel Datentypen betrachtet.

Beim Festlegen der einzelnen Blöcke (book-basic, book-extended) zeigt sich aber ein deutlicher Unterschied zwischen einem W3C Schema und Relax NG. Innerhalb von Relax NG werden alle denkbaren Strukturen auf benannte Muster (named patterns) zurückgeführt. Zu ihnen zählen die Elemente und Attribute, aber auch Gruppen und die in den nächsten Abschnitten besprochenen Kardinalitäten und benannten Klassen werden über Muster definiert. Ein durch den Anwender erstelltes benanntes Muster wird durch das define-Tag eingeleitet und kann später über den Wert das name-Attributs wieder referenziert werden.
Im Gegensatz zu einem W3C Schema ist die Position von Attributen und Kindelementen innerhalb einer Definition nicht relevant, da sie identisch behandelt werden. Der Relax NG Prozessor vergleicht die Anzahl und die Namen der definierten Attribute mit dem zu validierenden Instanzdokument. Die Ordnung der Attribute eines Elements ist dabei durch die XML Spezifikation nicht festgelegt, so dass Attribute in beliebiger Reihenfolge vorkommen dürfen.
Diese Eigenschaft ermöglicht es, verschiedene Relax NG Schemata wesentlich flexibler miteinander zu kombinieren. Das id-Attribut kann im Beispiel ohne Probleme in den book-basic-Block verschoben werden. Der Anwender muss sich keine Gedanken darüber machen, ob dem id-Attribut bei einem späteren Wiederverwenden des book-basic-Blocks weitere Elemente folgen.


Kombinatoren
Eine sequentiell geordnete Gruppe wird durch das <group>-Muster eingeleitet. Da diese Ordnung der Standardfall ist, kann das <group>-Muster, wie in der Definition von element-book (33), auch fehlen. Das entsprechende Tag xs:sequence des W3C Schemas muss hingegen vorhanden sein und darf nicht ausgelassen werden.
Muster für die beiden W3C Schema Kombinatoren xs:choice und xs:all sind ebenfalls in Relax NG vorhanden.

01) <define name="choiceGroup">
02)   <choice>
03)     <element name="isbn"/>
04)     <element ref="title"/>
05)   <choice>
06) </define>
07) <define name="interleaveGroup">
08)   <interleave>
09)     <element ref="isbn"/>
10)     <element ref="title"/>
11)   </interleave>
12) </define>
Das Verhalten von <choice> (2) ist identisch zu <xs:choice>. Das <interleave>-Muster (8) unterscheidet sich hingegen von <xs:all>. Es erlaubt nicht nur das Definieren von ungeordneten Gruppen, also Gruppen in denen die Reihenfolge der Elemente nicht festgelegt ist, sondern sogar das Verschachteln von Kindern mit Elementen von Subgruppen. Dies ist mit einem W3C Schema nicht möglich.
Außerdem gelten die erwähnten <xs:all>-Restriktionen nicht für <interleave>. Das Muster kann an einer beliebigen Stelle im Inhaltsmodell stehen und auch die Art der Kinder ist nicht beschränkt.

01) <element xmlns="http://relaxng.org/ns/structure/1.0" name="museum">
02)   <interleave>
03)    <element name="individual">
04)      <empty/>
05)    </element>
06)    <group>
07)     <element name="group-member1">
08)       <empty/>
09)     </element>
10)     <element name="group-member2">
11)       <empty/>
12)     </element>
13)    </group>
14)   </interleave>
15)  </element>
1. Gültig
<museum>
  <individual></individual>
  <group-member1></group-member1>
  <group-member2></group-member2>
</museum>
2. Gültig
<museum>
  <group-member1></group-member1>
  <group-member2></group-member2>
  <individual></individual>
</museum>
3. Gültig
<museum>
  <group-member1></group-member1>
  <individual></individual>
  <group-member2></group-member2>
</museum>
4. Nicht Gültig
<museum>
  <group-member2></group-member2>
  <individual></individual>
  <group-member1></group-member1>
</museum>

Bei den ersten beiden Beispielen befindet sich das <individual>-Element vor bzw. hinter der Subgruppe. Beispiel drei zeigt die Verschachtelung des <individual>-Elements mit den Gruppen-Mitgliedern. Das vierte Beispiel ist nicht gültig, da dort die vorgegebene Reihenfolge der Subgruppen Elemente nicht eingehalten wird.
Eine Trennung zwischen Gruppen und komplexen Typen existiert in dieser Form bei Relax NG nicht, da beide W3C Schema Konzepte durch benannte Muster dargestellt werden können und somit eine Unterscheidung nicht notwendig ist.




Häufigkeitsbeschränkungen

Mit einer DTD kann die Häufigkeit mit der ein Element innerhalb eines Dokuments auftreten darf, nur sehr eingeschränkt beschrieben werden. Es stehen hierfür lediglich die auch aus den regulären Ausdrücken bekannten Operatoren ?, + und * zur Verfügung. Das Fragezeichen steht dabei für ein optionales Element. Wird das Plus angegeben, muss das Element mindestens einmal vorhanden sein, darf aber beliebig oft wiederholt werden. Elemente mit dem Stern müssen nicht vorhanden sein, können aber ebenfalls beliebig oft angegeben werden. Wird kein Operator spezifiziert, muss das Element genau einmal vorkommen.

1) <!ELEMENT Buch (ISBN?, Titel, Author+, Character*)>
2)    <!ELEMENT ISBN (#PCDATA)>
3)    <!ELEMENT Titel (#PCDATA)>
4)    <!ELEMENT Author (#PCDATA)>
5)    <!ELEMENT Character (#PCDATA)>
Ein Buch kann eine ISBN Nummer haben und muss genau einen Titel besitzen. Außerdem können ein oder mehrere Autoren das Buch verfasst haben, wobei eine beliebige Anzahl von Charakteren möglich ist.


W3C Schema
Häufigkeitseinschränkungen lassen sich mit einem W3C Schema sehr viel besser beschreiben als mit DTDs. Sie können mit Hilfe der beiden Attribute minOccurs und maxOccurs für jedes Element exakt festgelegt werden.

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>
minOccurs bestimmt dabei die minimale Anzahl von Vorkommen, über maxOccurs kann entsprechend das Maximum angegeben werden. Die character Definition (3) des Beispiels würde dem Stern einer DTD entsprechen, da ein Charakter 0-mal vorkommen darf und die maximale Anzahl unbeschränkt ist. Die nächste Definition (5) kann hingegen nur sehr umständlich mit einer DTD beschrieben werden. Sie legt fest, dass eine Person mindestens 5-mal angegeben werden muss, maximal aber 30-mal da sein darf.

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
Relax NG besitzt nicht dieselbe Ausdruckskraft wie die W3C Schema Sprache im Bereich der Häufigkeitsbeschränkungen. Es stehen direkt nur die Einschränkungsmöglichkeiten einer DTD zur Verfügung.
Diese werden identisch zu den Kombinatoren über bereits definierte benannte Muster abgebildet.

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>
Das Fragezeichen einer DTD entspricht dabei dem <optional>-Muster (2), das Plus <oneOrMore> (6) und der Stern <zeroOrMore> (9). Wird kein Kardinalitätsmuster für das Element angegeben, muss es wie bei einer DTD genau einmal vorhanden sein.
Weitere Einschränkungen bzgl. der Anzahl von Elementen können unter Relax NG ebenfalls nur durch einen erheblichen Mehraufwand erreicht werden.

01) <element name="book">
02)   <ref name="fivePersons"/>
03)   <ref name="upto25Persons"/>
04) </element>
05) 
06) <define name="fivePersons">
07)   <element ref="person"/>
08)   <element ref="person"/>
09)   <element ref="person"/>
10)   <element ref="person"/>
11)   <element ref="person"/>
12) </define>
13) 
14) <define name="maybePerson">
15)   <optional>
16)     <element ref="person">
17)   </optional>
18) </define>
19) 
20) <define name="upto25Persons">
21)   <optional>
22)     <ref name="fivePersons"/>
23)   </optional>
24)   <optional>
25)     <ref name="fivePersons"/>
26)   </optional>
27)   <optional>
28)     <ref name="fivePersons"/>
29)   </optional>
30)   <optional>
31)     <ref name="fivePersons"/>
32)   </optional>
33)   <ref name="maybePerson"/>
34)   <ref name="maybePerson"/>
35)   <ref name="maybePerson"/>
36)   <ref name="maybePerson"/>
37)   <ref name="maybePerson"/>
38) </define>
Das Beispiel entspricht der W3C Schema Definition von <xs:element name="person" type="xs:string" minOccurs="5" maxOccurs="30"/>. Hierbei werden erst die fünf Personen, die mindestens vorhanden sein müssen, definiert und referenziert (6, 2). Anschließend wird die obere Grenze festgelegt (3). Durch die Verwendung des <optional>-Musters (21, 23) kann dann jede Anzahl zwischen 5 und 30 simuliert werden. Der Aufwand ist insgesamt aber deutlich höher als bei der W3C Schema Sprache.
Durch eine intelligente Wiederverwendung der Muster lassen sich über diese Methode größere Zahlen jedoch immer noch schneller als mit einer DTD erzeugen. <upto100Persons> kann beispielsweise durch 4-maligen Aufruf von <upto25Persons> dargestellt werden.




Bewertung

Das Muster-Konzept von Relax NG erlaubt es dem Anwender flexiblere Beschreibungen zu entwickeln, als dies mit einem W3C Schema möglich ist. Zudem ist der Lernaufwand durch das einheitliche Design für die verschiedenen Sprachelemente deutlich geringer. Viele der Restriktionen, die in einem W3C Schema zu beachten sind, existieren in Relax NG nicht.
Allerdings kann die Sprachmächtigkeit von Relax NG in diesem Bereich auch zu Problemen führen. Nicht jedes Relax NG Schema lässt sich in ein equivalentes W3C Schema überführen, so dass ein Austausch von Dokumenten zwischen Anwendungen, die einerseits Relax NG und andererseits W3C Schema verwenden, unmöglich werden kann.

Die W3C Schema Sprache besitzt hingegen bei der Beschreibung von Kardinalitäten das bessere Konzept. Es erlaubt dem Anwender sehr einfach und exakt zu beschreiben, wie oft ein Element auftreten darf. Bei Relax NG ist dies nur über einen großen Umweg zu schaffen.
Die Entwickler von Relax NG sind sich dessen bewusst, allerdings der Meinung, der überwiegenden Anzahl von Anwendungen würden die vier zur Verfügung stehenden Häufigkeitsmuster ausreichen. Ein zweites Argument der Entwickler ist die deutlich höhere Geschwindigkeit bei der Überprüfung eines Dokuments, die durch das Weglassen der genaueren Einschränkungen erzielt werden kann.
Demgegenüber stehen aber sehr viele Anfragen und Wünsche von Nutzern in diversen Mailinglisten und Newsforen, so dass sich eine Umsetzung von weiteren Kardinalitäten in einer Relax NG Version 2 beispielsweise in der folgenden Form anbieten würde.

1) <element name="bar" xmlns="http://relaxng.org/ns/structure/2.0>
2)   <cardinality min="5" max="30">
3)     <element name="foo"/>
4)   </cardinality>
5) </element>






 ... [ Ausarbeitung: Schema Sprachen ] ... [ << DTDs ] ... [ Datentypen >> ] ... [ nach oben ] ...