Hallo, Christian,
Wie wäre es, wenn man XHTML-Dokumente so filtert, dass wenn in der ACCEPT-Zeile vom UA application/xhtml+xml steht, dann das Dokument "normal" ausgeliefert wird, wenn nicht, dann sollen folgende Aktionen durchgeführt werden:
Ja, keine schlechte Idee. Für statische Seiten ist es recht einfach zu lösen, für dynamische wäre ein Output Buffer notwendig... sehr umständlich. Mit dutzenden Templates und Includes wird das schnell zum Problem, vor allem wenn die Includes (X)HTML-Code ausgeben anstatt beispielsweise an einem Dokument über das DOM zu werkeln oder den Code abstraktert einbindet. Bei meinen Projekten habe ich nie eine strikte Trennung zwischen Verarbeitung und variablen Daten (Schande), dadurch wäre es mir nicht möglich, ausgelagerte Daten jedes Mal von neuem je nach Accept-Header zu verwenden.
Bei mir sähe das dann momentan folgendermaßen aus:
if ($accept-xhtml)
echo('<p>foo<br />bar</p>');
else
echo('<p>foo<br>bar</p>');
Bei ausgelagerten Daten wäre es im Grunde genommen auch nicht besser:
$murks['xhtml']='<p>foo<br />bar</p>';
$murks['html']='<p>foo<br>bar</p>';
und
if ($accept-xhtml)
echo($murks['xhtml']);
else
echo($murks['html']);
Dann eher:
echo($murks[$accept-xhtml]);
Doppelte Inhalte wären dennoch von Nöten.
Sonderlich sinnvoll, jedes Markupschnipsel einzeln zu behandeln, ist es auch nicht:
echo(return xhtml-transform($murks));
Immerhin sind die statischen Methoden, welche vordefinierten Code einbinden, welcher jeweils einmal in XHTML und einmal in HTML definiert ist, besser für den Gebrauch auf dynamischen Seiten, welche jedes Mal individuell erzeugt werden und dadurch die Zeit sowieso kritisch ist.
Das Erstellen der jeweils doppelten statischen Inhalte kann natürlich automatisiert werden, hier würde dann das Caching greifen. Falls sich der Timestamp der include-Datei geändert hat, kann das System die Versionen immer noch on-the-fly neu erzeugen.
a) Content-Type: text/html
b) s!<?xml.[^?]?>!!g
c) s! />!>!g
Gibt es eigentlich Unterschiede der DTDs von HTML 4.01 Strict und XHTML Strict gibt, welche XHTML-Markup zu invalidem HTML-Markup machen würden - mir fallen keine ein, man sollte aber darüber nachdenken.
d) s!xml:!!g (primär wg. xml:lang)
Je nach Eingabe müsste man wohl das ganze xml:lang-Attribut streichen, falls das Ausgangsdokument nach den Kompatibilitätsrichtlinien verfasst ist (muss es aber nicht beziehungsweise sollte es nicht, falls man eine Transformation vornehmen will).
e) s!xmlns(?::[^=]*)?="[^"]*"!!g (ist das so überhupt korrekt, als regulärer Ausdruck? - ich meine die 2 Doppelpunkte)
Ich verstehe nichts, ich kenne diese Syntax nicht... Soll das eine lookahead assertation sein...? Wozu zwei Doppelpunkte, der eine für xmlns:[namespace]="..." und der andere für die assertation? Diese Form kenne ich nicht.
Täusche ich mich oder würde folgendes ausreichen:
xmlns(:[^=]+)?="[^"]*"
Es gibt doch keine »verschachtelten« Namespace-Angaben... http://www.w3.org/TR/REC-xml-names/#NT-NSAttName
f) s!<[CDATA[!<!--!g
Du solltest vielleicht andere delimiter verwenden... Es kommt nicht gut, wenn die Delimiter unmaskiert im Ausdruck auftauchen.
g) s!]]>!-->!g
Naja, setzt natürlich voraus, dass CDATA-Bereiche nur in script- und style-elementen verwendet werden,
h) s!<!DOCTYPE[^>]*>!<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">!g (meinetwegen auch Strict - hoffentlich hab' ich da alles richtig)
Siehe oben, Strict sollte aber möglich sein.
Lässt sich das Ganze nicht vereinfachen, indem man eine XSL-Transformation vornimmt, bei welcher nichts geändert wird und die Ausgabe schlichtweg HTML ist...? Die paar RegExps wären vermutlich perfomanter und nicht jeder hat einen XSLT-Prozessor auf dem Server zur Verfügung.
Somit dürfte das ganze dann auf "normales" HTML 4 runtergestrippt sein.
Soweit ich das beurteilen kann, ist die Liste recht vollständig.
AFAIK senden nämlich nur XHTML-Konforme Browser einen entsprechenden DOCTYPE.
Meintest du »Accept«...? Ja, ich denke schon. Momentan wäre es nur Mozilla, welchem XHTML ausgeliefert würde. Bei Amaya und Konqueror weiß ich es nicht.
Natürlich könnte man die veränderten Dokumente auch Cachen, damit der Server nicht jedes Mal ungeheuer belastet wird.
Bei generierten Seiten ist das wie gesagt nicht einfach.
Grüße,
Mathias
--
Mein Leben, ein Leben ist es kaum, / Ich gehe dahin als wie im Traum.
Wie Schatten huschen die Mensch hin, / Ein Schatten dazwischen ich selber bin.
Und im Herzen tiefe Müdigkeit - / Alles sagt mir: Es ist Zeit ...
(Theodor Fontane, Mein Leben)