|
Übersicht: Eindeutige Bausteine und allgemeine Muster
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.
|
Abbildung 1: mögliche W3C Schema 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>
|
|
|
|