Namensräume
Manchmal wollt Ihr Tags aus verschiedenen XML-Sprachen im selben Dokument verwenden. Das ist
beispielsweise der Fall, wenn Eure Webseite (in XHTML) eine mathematische Formel (in MathML) oder
eine Zeichnung (in SVG) enthalten soll. Dann kann es Euch aber passieren, daß mehrere Sprachen
den gleichen XML-Namen für unterschiedliche Tags verwenden. In solchen Fällen
müßt Ihr irgendwie angeben, welche Variante Ihr meint. Das tut Ihr, indem Ihr den passenden
Namensraum der Sprache, aus dem der gewünschte Tag kommt,
angebt. Deshalb definiert jede XML-Sprache einen eigenen Namensraum.
Das könnt Ihr Euch ähnlich vorstellen wie den Gültigkeitsbereich einer Variablen. Bei
«doppeldeutigen» Tagnamen gebt Ihr einfach den entsprechenden Namensraum mit an.
Dazu gibt es zwei Möglichkeiten: Mit Hilfe des Attributs 'xmlns' könnt Ihr einem Tag (und allen
darin enthaltenen Kindstags) einen Namensraum zuordnen
<comic xmlns="http://mein.server.test/XML/comic">
<titel>Die Beispiel-Serie</title>
<autor>A. U. Tor</autor>
<logo xmlns="mein.server.test/XML/grafik">
<titel>Logo "Beispiel-Serie"</titel>
</logo>
</comic>
Hier werden zwei verschiedene Tags mit dem Namen 'titel' verwendet, das eine aus dem Namensraum
'http://mein.server.test/XML/comic', das andere aus dem Namensraum 'http://mein.server.test/XML/grafik'.
Wie Ihr seht, wird eine URL angegeben. Allerdings muß unter dieser URL nicht unbedingt auch wirklich
etwas abrufbar sein. Es ist nur eine Konvention, vergleichbar mit einem eindeutigen Namen.
Die zweite Möglichkeit ist die Verwendung von qualifizierten Namen.
Ein qualifizierter Name besteht aus einem Präfix, einem Doppelpunkt und dem
lokalen Namen (das ist der «normale» Tagname). Die
Zuordnung der Präfixe zu den Namensräumen geschieht mit mehreren xmlns-Attributen
im Wurzelelement
<comic
xmlns:comic="http://mein.server.test/XML/comic"
xmlns:grafik="http://mein.server.test/XML/grafik">
<comic:titel>Die Beispiel-Serie</comic:title>
<autor>A. U. Tor</autor>
<logo xmlns="mein.server.test/XML/grafik">
<grafik:titel>Logo "Beispiel-Serie"</grafik:titel>
</logo>
</comic>
Ihr unterscheidet also die Tags nach den qualifizierten Namen 'comic:titel' und 'grafik:titel'.
Ansichtssache
Eine Frage brennt Euch vermutlich schon seit einiger Zeit auf der Zunge: Wenn die Tags eines
XML-Dokuments nur Aussagen über den Inhalt machen und Ihr nahezu beliebige eigene Tags
definieren könnt - woher weiß dann Euer Browser, wie er das XML-Dokument darstellen soll?
Die kurze und unbefriedigende Antwort ist: Er weiß es natürlich gar nicht. Ihr könnt es
ihm aber sagen, und zwar mit Hilfe des vertrauten CSS oder mit XSL. Zuerst einige Worte zu CSS mit XML.
Eine externe CSS-Datei könnt Ihr mit Hilfe einer PI (Steueranweisung) in Euer XML-Dokument
einbinden
<?xml-stylesheet href="myStyles.css" type="text/css"?>
In dieser CSS-Datei könnt Ihr mit gewöhnlichen Tag-Selektoren das Aussehen Eurer
XML-Tags festlegen. Nehmen wir als Beispiel folgendes XML-Dokument, das eine Comic-Sammlung
beschreibt
<?xml version="1.0" encoding="ISO-8859-1" standalone="yes"?>
<?xml-stylesheet href="comics-styles.css" type="text/css"?>
<comics>
<book>
<title>Die Beispiel-Serie</title>
<author>A. U. Tor</author>
</book>
<book>
<title>Noch eine Serie</title>
<author>Blei&Stift</author>
</book>
</comics>
Die dazugehörige CSS-Datei könnte etwa so aussehen
book{display:block;
margin:10px;
background-color:lightgray;
border-style:solid;
border-width:thin;
padding:5px}
title{display:block;
font-size:125%;
color:darkred}
author{display:block;
font-weight:bold}
Neben diesen einfachen Tag-Selektoren könnt Ihr noch weitere Selektorarten verwenden, von
denen ich die wichtigsten kurz beschreiben werde (die Eigenschafts-Wert-Paare sind als
«formatierung» symbolisiert)
tag1, tag2{formatierung} /* Wird auf beide Tags angewendet */
*{formatierung} /* Universalselektor, wird auf alle Tags angewendet */
/* Wird angewendet, wenn tag2 als Abkömmling von tag1 vorkommt */
tag1 tag2{formatierung}
/* Wird angewendet, wenn ein tag-Element
ein 'attribut'-Attribut besitzt */
tag[attribut]{formatierung}
/* Wird angewendet, wenn ein tag-Element
ein 'attribut'-Attribut mit dem Wert 'wert' besitzt */
tag[attribut="wert"]{formatierung} |