molily: Eigenen Namensraum in XHTML einbinden

Beitrag lesen

Ich möchte, dass sich der User auf einer xhtml-Seite durch einen strukturierten Programmablauf (''Menü'') bewegen kann.
Diese Struktur möchte ich logischerweise mit XML beschreiben und per JavaScript/DOM darauf zugreifen.

Wenn es sich ohnehin um ein JavaScript-Menü handelt, kannst du die Struktur auch als JavaScript-Objekt definieren:

var buch = {  
   title : 'Das 1x1 der Papierverschwendung',  
   callback : Staub_aufwirbeln,  
   kapitel : [  
      { title : 'Vorwort', callback : Blah_Blah },  
      { title : 'Kapitel 1', callback : Vorlesen },  
   ]  
};

Das ist allemal besser als JavaScript-Code in XML-Attributen unterzubringen und diese dann mit eval() auszuführen.

Man könnte derartige Abläufe in JavaScript natürlich wie ein Anfänger über das Setzen von Variablen und abenteuerliche 'if'-Konstruktionen realisieren.

Ein Nicht-Anfänger würde aber nicht unbedingt ein ins XHTML eingebettetes eigenes XML-Derivat verwenden. Hauptsache ist, dass die Deklaration von der Verarbeitung getrennt ist. JSON ist ein Format, dass man ebenfalls breit verarbeiten kann wie XML. (Obiges Beispiel ist nicht wirklich JSON, weil es auf Funktionsobjekte verweist. Aber die könnte man durchaus als Strings notieren und dann als Methoden eines gekapselten Objektes aufrufen.)

  1. Ist meine Vorgehensweise korrekt oder ist das Funktionieren ausschließlich der Großzügigkeit der Browser zu verdanken?

Das ist korrekt unter der Bedingung, dass das Dokument als application/xhtml+xml ausgeliefert wird. Damit wirst du dir aber die Kompatibilität mit IE < 9 verbauen. Wenn du das auf das Web loslassen willst, ist das keine gute Idee.

Für application/xhtml+xml solltest du schreiben:
document.getElementsByTagNameNS("http://www.de", "Kapitel")
denn getElementsByTagName sucht in sämtlichen Namensräumen, es vergleicht nur den local name.

Für text/html müsstest du schreiben:
document.getElementsByTagName("buch:Kapitel")

Wie du siehst ist das nicht miteinander kompatibel.

  1. Wodurch ist sichergestellt, dass der Browser nicht beim Einlesen versucht, die ihm unbekannte Struktur darzustellen?

Indem du das Element mit CSS ausblendest:

buch|Schwarte { display: none; } /* Für application/xhtml+xml */
Schwarte { display: none; }      /* Für text/html */

  1. Wie kriege ich das Ganze validiert? Im Moment nämlich überhaupt nicht. Denn in der xhtml-DTD steht ja nichts von meinem Namensraum.

XHTML Modularisierung erlaubt es, eigene Module in XHTML einzubinden. Das kann, muss aber nicht auf Basis von XML-DTD sein. Du könntest auch XML Schema schreiben.

Alles in allem sehe ich in der Idee nur wenige Vorteile.

Mathias