XML-Know How

Aufruf von XSD

Nachdem ein XSD-Schema definiert wurde, muss es noch in das XML-Dokument eingebunden werden. Zur Erinnerung: bei DTDs erfolgt die Einbindung über die DOCTYPE-Deklaration:

<!DOCTYPE artikel SYSTEM „artikel.dtd">

Das heißt, es kann jedem Dokument nur eine DTD zugeordnet werden. Wenn ein Dokument aber Elemente aus mehreren Namespaces enthält, also eigentlich mehrere DTDs benötigt, bleibt nur der Workaround, diese DTDs zu einer einzigen zu kombinieren und dabei die Namespace-Prefixe bei jeder Element-Deklaration als Teil des Element-Namens zu verwenden. Das ist freilich sehr umständlich, aufwändig und fehleranfällig. Die Idee der Modularität, die hinter dem Namespace-Konzept steht, wird so nicht wirklich unterstützt.

In SGML gibt es zwar auch eine Konstruktion, die mehrere DOCTYPEs und damit mehrere DTDs pro Dokument zulässt (CONCUR für »concurrent DTDs«). Hier muss aber im SGML-Dokument der Name des jeweiligen DOCTYPE in Klammern vor jedem Element stehen, wodurch solche Dokumente nicht XML-kompatibel sind.

XSD dagegen ermöglicht die Zuordnung beliebig vieler Schemas zu einem XML-Dokument. Die Differenzierung erfolgt über die Namespaces: es wird für jeden Namespace ein eigenes Schema zur Verfügung gestellt.

Für den Aufruf von XSD-Schemas aus XML-Dokumenten stellt die XSD-Spezifikation Attribute mit einem eigenen Namespace zur Verfügung (xsi:schemaLocation und xsi:noNamespaceSchemaLocation). Gemäß der XSD-Spezifikation muss Software, die XSD-kompatibel ist, diese Attribute von sich aus erkennen und auswerten können. Der Namespace ist www.w3.org/2001/XMLSchema-instance. Als Namespace-Prefix für die Attribute verwenden wir im folgenden Beispiel »xsi« (für XMLSchema-instance). Die Attribute stehen im Root-Element des XML-Dokuments oder in anderen Elementen, in denen mit xmlns ein Namespace definiert wird.

Angenommen, wir wollen für das Bookshop-Beispiel im Element <bookshop> für die drei Namespaces »bookshop«, »bibliostandard« und »XHTML« XSDs zuordnen. Dann muss das <bookshop>-Element so aussehen:

<bookshop

xmlns=‘http://www.beispiel1.org/bookshop‘
xmlns:std=‘http://www.beispiel2.org/bibliostandard‘
xmlns:xhtml=‘http://www.w3.org/1999/xhtml‘

xmlns:xsi=‘http://www.w3.org/2001/XMLSchema-instance‘

xsi:schemaLocation="

www.beispiel1.org/bookshop
file:///C:/schemas/bookshop.xsd

www.beispiel2.org/bibliostandard
file:///C:/schemas/bibliostandard.xsd

www.w3.org/1999/xhtml
file:///C:/schemas/xhtml.xsd"
>

Zuerst müssen mittels xmlns-Attributen alle benötigten Namespaces mit Prefixen deklariert werden (einschließlich des xsi-Namespace für das xsi:schemaLocation-Attribut). Dann folgt das xsi:schemaLocation-Attribut, in dem in Paaren – durch Leerraum getrennt – die Namespaces und die Pfade zu den dazugehörigen XSD-Dateien genannt werden.

In jedem Paar muss der Namespace wie im xmlns-Attribut als URI angegeben werden, und auch die Pfadangabe muss die Form eines URI haben. In der Regel wird hier als URI ein URL verwendet, also die Zeichenfolge, die man in das Adressfeld eines Webbrowsers eingeben muss, um die gewünschte Datei mit dem Browser zu öffnen. Der Vorteil eines URL ist, dass jedes internetfähige Betriebssystem URL-Ressourcen finden kann. Damit wird gewährleistet, dass sowohl lokale als auch Web-Ressourcen aufgerufen werden können. Falls als URI ein URN verwendet wird (z. B. eine ISBN), muss die verwendete Software einen Mechanismus zur Auflösung des URN in einen Pfad haben, denn das Ziel ist letztlich keine abstrakte Zuordnung, sondern eine konkrete XSD-Datei.

Der vorstehende Beispielcode hat zum Ergebnis, dass <bookshop> und alle Elemente in <bookshop>, wenn sie keinen Namespace-Prefix haben, mit bookshop.xsd validiert werden. Alle Elemente, die den Prefix »std« haben, werden mit bibliostandard.xsd validiert und die XHTML-Elemente mit xhtml.xsd.

Falls ein XML-Dokument keine Namespaces nutzt und die dazugehörige XSD auch keinen targetNamespace fordert, wird nur eine einzige XSD für das Dokument benötigt, die auch nicht namespace-gebunden ist. Der Aufruf der XSD erfolgt dann durch das Attribut noNamespaceSchemaLocation, das als Wert das Schema per URI angibt:

<bookshop noNamespaceSchemaLocation=
”file:///C:/schemas/bookshop.xsd”>

XML-Dokumente, die per XSD validiert werden, benötigen keine DOCTYPE-Angabe. Allerdings stört sie auch nicht und kann dazu dienen, per Internal Subset oder DTD Entities zu deklarieren (dazu mehr im Abschnitt Entities in XSD).