Minz schaut über den Tellerrand

Nochmal eingefügtes XML (Extensible Markup Language)

9/29/2003

Letztesmal ging es hier um XML Namensräume, Eingefügtes XML innerhalb einer XHTML Datei und die Schwierigkeiten, die ich hatte diese XML Elemente via CSS zu gestalten.

Was war geschehen?. Die Gestaltung funktionierte gut, wenn die Datei als text/html beim Broswer ankam. Schön und gut, aber eine Datei, die XML Elemente enthält, ist keine HTML-Datei. So wurde ich auf CSS3 Selektoren aufmerksam gemacht, die ich zuerst nicht einsetzen wollte, da CSS3 noch keine offizielle W3C-Empfehlung ist.

Trotzdem war ich neugierig, also schaute ich mal nach, was das W3C [1] dazu zu sagen hat.

Die Selektoren-Schreibweise (prefix\:element), die ich in meinen Beispielen verwendet habe, ist eine Art Ausweichlösung für ältere Programme (sogenannte down-level clients), die nicht vollständig XML kompatibel sind. Wenn also Dateien als text/html gesendet werden, scheint es als ob Opera und Mozilla reagieren, als wären sie down-level clients. Also greift die von mir gewählte Selektoren-Schreibweise. Beispiel:

mz\:navigation {
	background-color: #E3ECF6;
}

Wenn jetzt die Datei als text/xml, application/xhtml+xml, application/xml an den Browser geschickt wird verhält sich Mozilla nicht länger wie ein down-level client, daher greift der oben beschriebene Selektor nicht mehr, und das XML Element bleibt ohne Gestaltung. (Hier zu sehen).

Screenshot, der ein Fehlverhalten des Opera zeigt. Elemente aus anderen Namensräumen werden irrtümlicherweise auch mit Stilen versehen

Daher führt das W3C sowohl eine neue @-Regel als auch eine spezielle Selektoren-Schreibweise ein. Dem folgend, benutzte ich folgende Stylesheet-Anweisungen (Auszug):

@namespace mz url(http://xhtml2.researchkitchen.de/);


mz|navigation {
	background-color: #E3ECF6;
}

Die @namespace Regel ermöglicht es ein Namensraum-Präfix zu definieren und mit einem Namensraum zu verknüpfen (über einen URI). Die Selektoren-Schreibweise wiederum erlaubt die direkte Auswahl von Elementen aus diesem Namensraum. Eine Maskierung des Doppelpunktes ist nicht mehr notwendig. Stattdessen wird das "|" verwendet.

Randnotiz: Das Bild zeigt eine Missinterpretation, die dem Opera Browser unterläuft (Opera 7.20b). Er vermischt Elemente aus unterschiedlichen Namensräumen und wendet die Stile nicht nur wie gewünscht auf das Element <mz:title /> sondern auch auf das HTML Element <title>. (Rot umrandeter Bereich):

[..Das W3C sagt hierzu:] It should be noted that down-level clients may incorrectly match selectors against XML elements in other namespaces.[..]

Untenstehend Links zu den neuen Dateien mit korrigiertem Stylesheet (empfohlener Browser: Mozilla):

MIME-Type text/html
http://xhtml2.researchkitchen.de/texthtml.php
MIME-Type text/xml
http://xhtml2.researchkitchen.de/textxml.php
MIME-Type application/xhtml+xml
http://xhtml2.researchkitchen.de/xhtml.php
MIME-Type application/xml
http://xhtml2.researchkitchen.de/xml.php

[1] W3C Arbeitspapier: CSS Namespace Enhancements

Kommentare

Anne:

This is a great resource minz!

Some extra things:

- You could use a different prefix for your namespaces within CSS, 'cause the prefixes are always replaced by the full URI
- Prefixes are case insensitive within CSS (but I think this one is still a Mozilla bug :))

Abgegeben am 10/4/2003 um 46:52 PM