|
Übersicht: Namensräume
Konzept der Namensräume
Die Einführung von Namensräumen in XML dient in erster
Linie der Vermeidung von Namenskonflikten, insbesondere bei der Verwendung zusammengesetzter,
meist nicht durch dieselbe Person erstellter, Dokumentdefinitionen. Ein zweites Ziel ist die Basis für eine leichte Öffnung und
Erweiterung von Schemata zu schaffen. Namensräume waren in der ersten XML Version noch nicht enthalten
und wurden der Spezifikation erst später hinzugefügt. Somit können sie auch nicht innerhalb einer DTD eingesetzt werden.
W3C Schema sowie Relax NG unterstützen XML Namensräume hingegen in vollem Umfang. Dieses Kapitel soll erst einen kurzen Überblick über das
generelle Konzept von Namensräumen verschaffen, im zweiten Teil werden dann die unterschiedlichen Umsetzungsvarianten von W3C Schema
und Relax NG beleuchtet.
01) <?xml version="1.0"?>
02) <library
03) xmlns="http://eric.van-der-vlist.com/ns/library"
04) xmlns:hr="http://eric.van-der-vlist.com/ns/person">
05) <book id="b0836217462" available="true">
06) <isbn>0836217462</isbn>
07) <title xml:lang="en">Being a Dog Is a Full-Time Job</title>
08) <author id="CMS">
09) <name xmlns="http://eric.van-der-vlist.com/ns/person">C M Schulz</name>
10) <hr:born>1922-11-26</hr:born>
11) <hr:dead>2000-02-12</hr:dead>
12) </author>
13) </book>
14) </library>
|
Die Definition eines Default-Namensraum erfolgt innerhalb des XML-Instanz-Dokuments über des xmlns-Attribut (3). Dieser Namensraum gilt für alle
folgenden Elemente und zwar solange, bis der Default-Namensraum wieder überschrieben wird. Attribute werden durch einen Default-Namensraum
nicht betroffen, sie müssen explizit mit einem Namensraum versehen werden. Der Default-Namensraum kann auf zwei Arten überschrieben werden.
Erstens ist die Angabe eines vollqualifizierten Namens (lokaler Teil und zugehöriger Namensraum) für ein Element möglich (9).
Der redefinierte Namensraum gilt dann entsprechend für alle Kinder des Elements.
Diese erste Art der Qualifizierung kann ein Dokument aber sehr schnell unhandlich machen, so dass die zweite Variante,
der Einsatz von einem Präfix, häufig vorgezogen wird. Zeile 4 bindet den Namensraum http://eric.van-der-vlist.com/ns/person
an das Präfix hr, welches dann verwendet werden kann (10,11) und die Übersichtlichkeit und Lesbarkeit
des Dokuments deutlich erhöht. Es können dabei beliebig viele Präfixe für unterschiedliche Namensräume definiert werden.
|
|
Namensräume in einem W3C Schema
Die Definition und die Verwendung von Namensräumen in einem W3C Schema unterscheidet sich nur gering von einem Instanz-Dokument. Es kann ein
Default-Namensraum angegeben werden und auch der Einsatz von beliebig viele Präfixen ist möglich.
01) <xs:schema targetNamespace="http://example.org/ns/books/"
02) xmlns:xs="http://www.w3.org/2001/XMLSchema"
03) xmlns:bk="http://example.org/ns/books/"
04) elementFormDefault="qualified"
05) attributeFormDefault="unqualified">
06) <bk:book id="0836217462"">
07) <xs:element name="title">
08) ...
09) </xs:element>
10) </bk:book>
11) </xs:schema>
|
In einem W3C Schema kann zudem das targetNamespace-Attribut (1) enthalten sein. Es beschreibt den Namensraum, den das W3C Schema Dokument
selbst darstellt. Sollen Elemente aus diesem Namensraum referenziert werden (6), muss vorher auch ein entsprechendes Präfix (3) existieren.
Die Attribute elementFormDefault und attributeFormDefault steuern, ob Elemente bzw. Attribute standardmäßig
einen qualifizierten Namen besitzen müssen. Die Angabe der Attribute ist optional; wenn sie nicht angegeben werden, gilt der Standardwert unqualified.
|
|
Einbinden unbekannter Elemente
Durch die Verwendung von qualifizierten Namen und Präfixen ist das erste Ziel von Namensräumen, die Eindeutigkeit von Elementen, erreicht.
Wie sieht es aber mit dem zweiten Ziel, der Erweiterung aus? Natürlich könnte für ein beliebiges Element die Schema Definition
angepasst und der entsprechende Namensraum mit in das Inhaltsmodell aufgenommen werden. Allerdings wird hierdurch das Schema nicht wirklich "offen"
für fremde Elemente, es wäre eine ständige Anpassung notwendig.
Um diesen Konflikt zu lösen, existieren in der W3C Schema Spezifikation das xs:any- bzw. xs:anyAttribute-Element.
01) <xs:element name="book">
02) <xs:complexType>
03) <xs:sequence">
04) <xs:element name="isbn" type="xs:string"/>
05) <xs:element name="furtherInformations">
06) <xs:complexType>
07) <xs:sequence>
08) <xs:any namespace="http://purl.org/dc/elements/1.1/"
09) processContents="skip"/>
10) </xs:sequence>
11) </xs:complexType>
12) </xs:element>
13) </xs:sequence>
14) </xs:complexType>
15) </xs:element>
|
Das xs:any-Element spezifiziert, dass im Inhaltsmodell des Typs jedes wohlgeformte XML zulässig ist. Über das namespace-Attribut (8)
lässt sich dabei steuern, aus welchen Namensräumen Inhalte akzeptiert werden. Im Beispiel werden nur Elemente aus dem Namensraum
http://purl.org/dc/elements/1.1/ zugelassen. Die folgende Instanz ist somit ein gültiges Dokument, da das <dc:publisher>-Element aus
dem geforderten Namensraum stammt.
01) <book xmlns:dc="http://purl.org/dc/elements/1.1/">
02) <isbn>2346175840</isbn>
03) <furtherInformations>
04) <dc:publisher>
05) <dc:name>Andrews Mc Meel Publishing</dc:name>
06) </dc:publisher>
07) ...
08) </furtherInformations>
09) </book>
|
Neben der expliziten Angabe der Namensräume (über eine Leerzeichen getrennte Liste), kann das namespace-Attribut
noch drei weitere Werte annehmen:
- ##any: Wohlgeformtes XML aus einem beliebigem Namensraum (Standardfall)
- ##local: Wohlgeformtes XML, das nicht qualifiziert ist und somit keinem Namensraum angehört
- ##other: Wohlgeformtes XML, das nicht aus dem Ziel-Namensraum des gerade definierten Typs stammt
Über das zweite Attribut processContents des xs:any-Elements kann festgelegt werden,
wie ein XML-Prozessor mit fremdem Inhalt umgehen soll. Auch dieses Attribut kann drei Werte annehmen:
- skip: der fremde Inhalt wird durch den XML-Prozessor nicht weiter betrachtet
- lax: der XML-Prozessor versucht die Elemente zu validieren; wenn er keine Schema Informationen erreichen kann, werden jedoch keine Fehler gemeldet
- strict: der XML-Prozessor ist dazu verpflichtet, das mit dem vorgeschriebenen Namensraum assoziierte Schema zu erlangen und die Elemente zu validieren (Standardfall)
Das Integrieren von fremden Attributen erfolgt entsprechend über das anyAttribute-Element.
01) <element name="book">
02) <complexType>
03) <sequence>
04) <any namespace="http://www.w3.org/1999/xhtml"
05) processContents="skip"
06) minOccurs="1" maxOccurs="unbounded"/>
07) </sequence>
08) <anyAttribute namespace="http://www.w3.org/1999/xhtml"
09) processContents="lax"/>
10) </complexType>
11) </element>
|
Die möglichen Werte für das namespace- bzw. processContents-Attribut sind identisch zu xs:any.
Im xs:any-Element kann zudem noch über minOccurs und maxOccurs (6) angegeben werden,
wie viele fremde Elemente eingefügt werden dürfen. Dies ist bei Attributen nicht möglich.
|
|
Namensräume in Relax NG
Der grundsätzliche Einsatz von Namensräumen unterscheidet sich nur unwesentlich vom W3C Schema.
01) <element xmlns="http://relaxng.org/ns/structure/1.0" name="library"
02) ns="http://eric.van-der-vlist.com/ns/library"
03) xmlns:hr="http://eric.van-der-vlist.com/ns/person">
04) <element name="book">
05) <attribute name="id"/>
06) <element name="titel" ns="http://eric.van-der-vlist.com/ns/library1">
07) <text/>
08) </element>
09) <element name="hr:author">
10) <attribute name="id"/>
11) <element name="hr:name">
12) <text/>
13) </element>
14) </element>
15) </element>
16) </element>
|
Der Default-Namensraum wird über das ns-Attribut (2) festgelegt und kann natürlich auch jederzeit
wieder überschrieben werden (6). Das ns-Attribut ist dabei ein sich vererbendes Attribut,
das heisst der aktuelle Wert gilt auch für alle Kinder. Das Definieren (3) und der Einsatz (9) von Präfixen geschieht
ebenfalls identisch zu einem W3C Schema.
|
|
Einbinden unbekannter Elemente
Beim Einbinden unbekannter Elemente unterschieden sich die Konzepte von Relax NG und W3C Schema hingegen. Relax NG löst dieses Problem
wieder durch den Einsatz von Mustern. Hierfür wird zuerst ein Muster definiert, welches beliebige fremde Elemente und Attribute akzeptiert.
01) <define name="anything">
02) <zeroOrMore>
03) <choice>
04) <element>
05) <anyName/>
06) <ref name="anything"/>
07) </element>
08) <attribute>
09) <anyName/>
10) </attribute>
11) <text/>
12) </choice>
13) </zeroOrMore>
14) </define>
|
Um fremde Inhalte (Elemente und Attribute) zu akzeptieren, wird lediglich ein neues Muster benötigt: <anyName/> (5).
Es akzeptiert einen beliebigen lokalen Namen in jedem Namensraum. Dieses sehr allgemein gehaltene Muster wird im nächsten Schritt auf
den "gewünschten Grad der Offenheit" des Schemas reduziert.
01) <define name="foreign-elements">
02) <zeroOrMore>
03) <element>
04) <anyName>
05) <except>
06) <nsName ns=""/>
07) <nsName ns="http://eric.van-der-vlist.com/ns/library"/>
08) <nsName ns="http://eric.van-der-vlist.com/ns/person"/>
09) </except>
10) </anyName>
11) <ref name="anything"/>
12) </element>
13) </zeroOrMore>
14) </define>
|
Das bereits aus dem Kapitel Relax NG Datentypen bekannte <except>-Pattern (5) schränkt die möglichen Namensräume
des <anyName>-Musters ein. Es sind jetzt nur noch "fremde" Namesräume erlaubt, da die "eigenen" ausgeschlossen wurden (7,8).
Zeile 6 verbietet zudem, dass Elemente eingebunden werden können, die keinen Namensraum besitzen. Dadurch wird das erste Ziel von Namensräumen
sichergestellt: die Eindeutigkeit von Elementen.
Fremde Attribute können auf dieselbe Art eingebunden werden. Hierfür gilt es lediglich in Zeile 3 und 12 das <element>
durch ein <attribute>-Muster zu ersetzen.
Ein konkretes Relax NG Schema das fremde Elemente zulässt, könnte dann beispielsweise wie folgt aussehen.
01) <element name="book">
02) <interleave>
03) <group>
04) <attribute name="id"/>
05) <ref name="title-element"/>
06) <zeroOrMore>
07) <ref name="author-element"/>
08) </zeroOrMore>
09) </group>
10) <ref name="foreign-elements"/>
11) <ref name="foreign-attributes"/>
12) </interleave>
13) </element>
|
Das <interleave>-Muster (2) wird hierbei genutzt, um fremde Inhalte an beliebigen Stellen zu erlauben. Dies ermöglicht einen maximalen
Grad der Offenheit und Fehlertoleranz.
|
|
Bewertung
Beide Schema Sprachen unterstützen XML Namensräume im vollen Umfang. Die Ansätze unterscheiden sich dabei aber in einigen Punkten.
Relax NG setzt seine Linie der Einfachheit und Allgemeingültigkeit konsequent fort. Es sind in Relax NG nur Namensraum-Konzepte implementiert,
die auch zwingend vorgeschrieben sind.
Das W3C Schema processContents-Attribut existiert aus diesem Grunde in Relax NG nicht. Die XML Namensraum Spezifikation
beschreibt nur, wie ein Element durch ein Namensraum qualifiziert werden kann. Sie legt dabei nicht fest, dass hinter einem Namensraum-URI
auch ein entsprechendes Schema Dokument vorhanden sein muss. Diese Annahme wird aber von W3C Schema benötigt, um die Validierung
fremder Inhalte, bei der Angabe von strict, zu ermöglichen.
Ebenso sind die Attribute elementFormDefault und attributeFormDefault in Relax NG nicht enthalten.
Mit dem <except>-Muster können bestimmte Namensräume unter Relax NG ausgeschlossen werden. Diese Möglichkeit
besteht in einem W3C Schema nicht. Hier können entweder nur alle Namensräume akzeptiert (##any),
oder eine Liste der erlaubten URIs erstellt werden. Das Konzept der Negativ-Liste existiert nicht.
|
|
|