Eigenen Namensraum in XHTML einbinden
Math.random()
- html
Hallo Forum!
Wie lässt sich ein selbst entworfener Namensraum korrekt in eine xhtml-Datei einbinden?
Zu dieser naheliegenden Frage steht nichts in SelfHTML und im Forum habe ich auch nichts dazu gefunden.
Auch im sonstigen Internet habe ich dazu keine klare Antwort gefunden.
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.
Hier ein Phantasiebeispiel:
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:buch="http://www.de">
<head><title>Test XML</title></head>
<body>
<buch:Schwarte titel="Das 1x1 der Papierverschwendung" exe="Staub_aufwirbeln()">
<buch:Kapitel titel="Vorwort" exe="Blah_Blah()" />
<buch:Kapitel titel="Kapitel 1" exe="Vorlesen()" />
</buch:Schwarte>
<script type="text/javascript">
alert( document.getElementsByTagName("Kapitel")[0].getAttribute("titel") );
</script></body></html>
Man könnte derartige Abläufe in JavaScript natürlich wie ein Anfänger über das Setzen von Variablen und abenteuerliche 'if'-Konstruktionen realisieren.
Aber für die klare und einfache Beschreibung von Strukturen gibt es doch extra XML?
Und xhtml ist doch u.a. dafür da, um andere Namensräume (z.B. SVG) einbetten zu können?
Erste Tests laufen problemlos und ohne Fehlermeldungen. Ich bin soweit, dass ich meine XML-Struktur beliebig ändern kann ohne das Script anfassen zu müssen.
Meine konkreten Fragen:
1. Ist meine Vorgehensweise korrekt oder ist das Funktionieren ausschließlich der Großzügigkeit der Browser zu verdanken?
2. Wodurch ist sichergestellt, dass der Browser nicht beim Einlesen versucht, die ihm unbekannte Struktur darzustellen?
3. Wie kriege ich das Ganze validiert? Im Moment nämlich überhaupt nicht. Denn in der xhtml-DTD steht ja nichts von meinem Namensraum.
Vielen Dank für eure Antworten!
@@Math.random():
nuqneH
Diese Struktur möchte ich logischerweise mit XML beschreiben
Warum verwendest du nicht die vorhandenen XHTML-Elemente? Angereichert mit RDFa sollte das sinnvolles Markup ergeben.
Wenn du deine Daten in XML pflegen willst, kannst du sie auch per XSLT transformiert ausliefern.
- Wie kriege ich das Ganze validiert? Im Moment nämlich überhaupt nicht. Denn in der xhtml-DTD steht ja nichts von meinem Namensraum.
Eben. Du müsstest dir eine eigene DTD schreiben, die XHTML + dein Zeugs enthält.
Qapla'
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.)
- 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.
- 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 */
- 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
Vielen Dank für die ausführlichen Antworten!
Es wird sicher etwas dauern, die Hinweise aufzunehmen und die beste Methode zu finden.
Die Menü-Struktur besteht in meinem Fall aus etwa 50 Unterpunkten, die verschiedenst ineinander verschachtelt sind. Ich denke, eine XML-Struktur ist da das übersichtlichste/einfachste Mittel zur Beschreibung. Zumal sich die User-Bewegungen durch die Menü-Struktur intern gut mittels TreeWalker realisieren lassen. Ist vielleicht auch nur 'ne Sache der Gewohnheit.
Jetzt werde ich erst einmal die anderen Methoden ausprobieren um herauszufinden, was am besten funktioniert und am kompatibelsten ist.