﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://schneegans.de/dtd/xhtml1-strict.dtd"[]><html lang="de" xml:lang="de" xsi:schemaLocation="http://www.w3.org/1999/xhtml http://www.w3.org/2002/08/xhtml/xhtml1-strict.xsd" xmlns="http://www.w3.org/1999/xhtml" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><head><meta name="ROBOTS" content="NOINDEX, NOFOLLOW" /><title>XHTML-Einmaleins</title><link href="http://schneegans.de/xp/?url=http%3A%2F%2Fschneegans.de%2Fstyle%2F&amp;ct=application%2Fxml" rel="Stylesheet" type="text/css" /></head><body><table id="DankeThilo" style="border-collapse: collapse; margin: 20px auto; background-color: #EEE; border: 5px #EEA000 solid; padding: 10px;"><tr style="border: none;"><td rowspan="1" colspan="1" style="border:none; text-align: center; padding: 20px; font-size: 6em; font-weight: bold; color: #EEA000;">Danke, Thilo!</td></tr><tr style="border: none;"><td rowspan="1" colspan="1" style="border:none; text-align: right; padding: 3px;"><a shape="rect" href="http://schneegans.de/xp/?url=http%3A%2F%2Fwww.steinhoefel.de%2Fblog%2F2010%2F09%2Fweitermachen-thilo.html&amp;ct=application%2Fxml" style="text-decoration: none;" class="Offsite">...</a></td></tr></table><div class="Header"> <h1>XHTML-Einmaleins</h1> <p class="Breadcrumb">» <a shape="rect" href="http://schneegans.de/xp/?url=http%3A%2F%2Fschneegans.de%2F&amp;ct=application%2Fxml">schneegans.de</a> » <a shape="rect" href="http://schneegans.de/xp/?url=http%3A%2F%2Fschneegans.de%2Fweb%2F&amp;ct=application%2Fxml">Web</a> » XHTML-Einmaleins</p> </div><div class="Content"> <h2 id="xhtml-oder-html">XHTML oder HTML?</h2> <h3>Schlüssige Argumente für XHTML</h3> <p>Die Syntax von HTML ist kompliziert – viel komplizierter, als die meisten Autoren ahnen. So ist</p> <pre xml:space="preserve" class="Snippet"><code>&lt;!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN"&gt;
&lt;&gt;
&lt;title//
&lt;p ltr&lt;span&gt;&lt;/span&lt;/p&gt;
&lt;/&gt;</code></pre> <p>gültiges HTML und zu</p> <pre xml:space="preserve" class="Snippet"><code>&lt;!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN"&gt;
&lt;html&gt;
&lt;head&gt;
&lt;title&gt;&lt;/title&gt;
&lt;body&gt;
&lt;p dir="ltr"&gt;&lt;span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;/body&gt;
&lt;/html&gt;</code></pre> <p>äquivalent. Die meisten Benutzeragenten (dazu gehören Browser oder die Crawler von Suchmaschinen) können die <a shape="rect" href="http://schneegans.de/xp/?url=http%3A%2F%2Fschneegans.de%2Fweb%2Fxhtml%2Fshorttag%2F&amp;ct=application%2Fxml">minimierte Version</a> nicht korrekt verarbeiten, und doch <a shape="rect" href="http://schneegans.de/xp/?url=http%3A%2F%2Fvalidator.w3.org%2Fcheck%3Furi%3Dhttp%3A%2F%2Fschneegans.de%2Fweb%2Fxhtml%2Fshorttag%2F%3Bss%3D1%3Bsp%3D1%3Bverbose%3D1&amp;ct=application%2Fxml" class="Offsite">zeigt</a> der W3C-Validator bestenfalls Warnungen, aber keine Fehler an.</p> <p>Verantwortlich dafür sind einige <a shape="rect" href="http://schneegans.de/xp/?url=http%3A%2F%2Fwww.w3.org%2FTR%2Fhtml401%2Fappendix%2Fnotes.html&amp;ct=application%2Fxml#h-B.3.3" class="Offsite">SGML-Features</a> in HTML. Kaum ein Autor verwendet diese Features absichtlich. Es kann aber passieren, daß man versehentlich ein <code>&gt;</code> vergißt. Darstellungsprobleme sind dann sehr schwer aufzuspüren, denn das Dokument entspricht ja der Spezifikation, und ein Validator findet deshalb keine Fehler. Tatsächlich kann XHTML, das den <a shape="rect" href="http://schneegans.de/xp/?url=http%3A%2F%2Fwww.w3.org%2FTR%2Fxhtml1%2F&amp;ct=application%2Fxml#guidelines" class="Offsite">Kompatibilitätsrichtlinien</a> genügt, besser von heutigen HTML-Benutzeragenten verarbeitet werden als gültiges HTML, das – egal ob vom Autor beabsichtigt oder nicht – diese SGML-Features verwendet.</p> <p>Sehen Sie in</p> <p class="Snippet"><code>&lt;p&gt;&lt;a href="http://www.example.org/"&gt;&lt;img border="0" src="../button1.gif" height="20" width="100" alt="Home"&gt;&lt;/a&gt;&lt;a href="http://www.example.org/"&gt;&lt;img border="0" src="../button2.gif" height="20" width="100" alt="Help"&lt;/a&gt; © 2004&lt;/p&gt;</code></p> <p>auf Anhieb das Problem? <a shape="rect" href="http://schneegans.de/xp/?url=http%3A%2F%2Fschneegans.de%2Fweb%2Fxhtml%2Fie.png&amp;ct=application%2Fxml">IE</a>, <a shape="rect" href="http://schneegans.de/xp/?url=http%3A%2F%2Fschneegans.de%2Fweb%2Fxhtml%2Ffirefox.png&amp;ct=application%2Fxml">Firefox</a> und <a shape="rect" href="http://schneegans.de/xp/?url=http%3A%2F%2Fschneegans.de%2Fweb%2Fxhtml%2Fopera.png&amp;ct=application%2Fxml">Opera</a> sind sich nicht einig, wie <a shape="rect" href="http://schneegans.de/xp/?url=http%3A%2F%2Fschneegans.de%2Fweb%2Fxhtml%2Fflawed-html%2F&amp;ct=application%2Fxml">dieses Dokument</a> angezeigt werden sollte. Der W3C-Validator hat <a shape="rect" href="http://schneegans.de/xp/?url=http%3A%2F%2Fvalidator.w3.org%2Fcheck%3Furi%3Dhttp%3A%2F%2Fschneegans.de%2Fweb%2Fxhtml%2Fflawed-html%2F%3Bss%3D1%3Bsp%3D1%3Bverbose%3D1&amp;ct=application%2Fxml" class="Offsite">nichts zu beanstanden</a>, nicht einmal der Parse-Baum zeigt Auffälligkeiten. In einem vergleichbaren <a shape="rect" href="http://schneegans.de/xp/?url=http%3A%2F%2Fschneegans.de%2Fweb%2Fxhtml%2Fflawed-xhtml%2F&amp;ct=application%2Fxml">XHTML-Dokument</a> wird der Fehler hingegen sofort <a shape="rect" href="http://schneegans.de/xp/?url=http%3A%2F%2Fschneegans.de%2Fsv%2F%3Furl%3Dhttp%3A%2F%2Fschneegans.de%2Fweb%2Fxhtml%2Fflawed-xhtml%2F&amp;ct=application%2Fxml" class="Offsite">aufgespürt</a>.</p> <p>Außerdem können in HTML viele Elemente implizit geöffnet oder geschlossen werden. Das führt häufig zu verwirrenden Fehlermeldungen bei der Validierung. Aber auch in einem gültigen Dokument kann das Weglassen eines schließenden Tags wie <code>&lt;/td&gt;</code> problematisch sein. Wiederum spielt es keine Rolle, ob der Autor das absichtlich oder versehentlich getan hat – Netscape 4.x reagiert darauf sehr allergisch.</p> <p>Schließlich ist HTML in hohem Maße kontextabhängig. <code>&lt;a href=foo.html&gt;</code>, <code>&lt;p&gt;x &lt; y&lt;/p&gt;</code> und <code>&lt;p&gt;&amp;uuml&lt;/p&gt;</code> sind gültige Fragmente, <code>&lt;a href=../foo.html&gt;</code>, <code>&lt;p&gt;x&lt;y&lt;/p&gt;</code> und <code>&lt;p&gt;T&amp;uumlr&lt;/p&gt;</code> nicht. Auch kleine Änderungen können also ein gültiges Dokument ungültig machen.</p> <p>An der Rechtschreibreform hat Bernhard Eversberg sehr treffend die <a shape="rect" href="http://schneegans.de/xp/?url=http%3A%2F%2Fwww.allegro-c.de%2Fformate%2Fneufehler.htm&amp;ct=application%2Fxml" class="Offsite">Beliebigkeit</a> als größtes Problem erkannt. Für HTML gilt dasselbe:</p> <ul><li><code>&lt;div&gt;&lt;p&gt;&lt;/div&gt;</code> ist korrekt, <code>&lt;div&gt;&lt;p&gt;&lt;/p&gt;&lt;/div&gt;</code> aber auch.</li><li><code>&lt;p dir="LTR"&gt;</code> ist korrekt, <code>&lt;p dir="ltr"&gt;</code> aber auch.</li><li><code>&lt;style type="text/css"&gt;&lt;!-- /* ... */ --&gt;&lt;/style&gt;</code> ist korrekt, <code>&lt;style type="text/css"&gt;/* ... */&lt;/style&gt;</code> aber auch.</li><li><code>&lt;p&gt;&amp;auml&lt;/p&gt;</code> ist korrekt, <code>&lt;p&gt;&amp;auml;&lt;/p&gt;</code> aber auch.</li><li><code>&lt;a href=foo.html&gt;</code> ist korrekt, <code>&lt;a href="foo.html"&gt;</code> aber auch.</li></ul> <p>In XHTML gibt es in all diesen Fällen <strong>eine</strong> korrekte Schreibweise. Und das ist nicht die einzige Gemeinsamkeit von HTML und reformierter Rechtschreibung. Beide wollen das Schreiben einfacher machen und nehmen dafür in Kauf, daß das Lesen schwieriger wird.</p> <p>Durch <a shape="rect" href="http://schneegans.de/xp/?url=http%3A%2F%2Fwww.spartanicus.utvinternet.ie%2Fcustom_dtd.htm&amp;ct=application%2Fxml" class="Offsite">strengere DTDs</a> und SGML-Deklarationen <em>könnte</em> der W3C-Validator zwar viel mehr Fehler in HTML-Dokumenten aufspüren, aber die offensichtlichen Tippfehler in</p> <pre xml:space="preserve" class="Snippet"><code>&lt;!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN"&gt;
&lt;html&gt;
&lt;head&gt;&lt;title&gt;...&lt;/title&gt;&lt;/head&gt;
&lt;body&gt;
&lt;p title=""style=""&gt;&lt;/p&gt;
&lt;p&gt; &lt; &amp; &gt; &lt;/p&gt;
&lt;p&gt;&amp;auml&lt;/p&gt;
&lt;!------&gt;&lt;hr&gt;&lt;!------&gt;
&lt;/body&gt;
&lt;/html&gt;</code></pre> <p>können von einem SGML-Parser prinzipiell nicht gefunden werden. Tagsoup-Parser könnten sie aber durchaus irritieren. XHTML vermeidet all diese Probleme. Die Syntax ist einfacher, <a shape="rect" href="http://schneegans.de/xp/?url=http%3A%2F%2Flists.w3.org%2FArchives%2FPublic%2Fpublic-evangelist%2F2004Dec%2F0008.html&amp;ct=application%2Fxml" class="Offsite">intuitiver</a> und damit nicht nur für Anfänger viel besser geeignet.</p> <p>In Zweifelsfällen ist es zudem von Vorteil, daß die <a shape="rect" href="http://schneegans.de/xp/?url=http%3A%2F%2Fwww.w3.org%2FTR%2FREC-xml%2F&amp;ct=application%2Fxml" class="Offsite">XML-Spezifikation</a> für jeden kostenlos im Netz abrufbar ist. Wer hingegen die <a shape="rect" href="http://schneegans.de/xp/?url=http%3A%2F%2Fwww.iso.ch%2Fiso%2Fen%2FCatalogueDetailPage.CatalogueDetail%3FCSNUMBER%3D16387&amp;ct=application%2Fxml" class="Offsite">SGML-Spezifikation</a> lesen will, muß dafür bezahlen.</p> <p>Ein weiterer Vorteil ist die bessere Validierbarkeit von XHTML mittels Schemata. Der W3C-Validator gilt zwar gemeinhin als überaus streng, er <em>kann</em> viele Fehler aber überhaupt nicht finden; <code>&lt;html lang="klingon"&gt;</code> geht bspw. als gültiges HTML-Fragement durch. Ein <a shape="rect" href="http://schneegans.de/xp/?url=http%3A%2F%2Fschneegans.de%2Fsv%2F%3Furl%3Dhttp%3A%2F%2Fschneegans.de%2Fsv%2Ftest-cases%2Finvalid-attribute-values.xml&amp;ct=application%2Fxml" class="Offsite">Schema-Validator</a> hingegen kann feststellen, daß der Attributwert nicht zulässig ist.</p> <p>Schließlich lassen sich bei XHTML XML-Tools einsetzen – XSLT und DOM funktionieren nämlich besser als das Herumgestochere im Quelltext mit regulären Ausdrücken.</p> <h3>Schlüssige Argumente gegen XHTML</h3> <p><code>document.write()</code> kann <a shape="rect" href="http://schneegans.de/xp/?url=http%3A%2F%2Fwww.w3.org%2FMarkUp%2F2004%2Fxhtml-faq.html&amp;ct=application%2Fxml#docwrite" class="Offsite">nicht</a> mehr verwendet werden. Sonst fällt mir ehrlich nichts ein.</p> <h3>Unsinnige Argumente für XHTML</h3> <p>Einige Leuten meinen, XHTML sei besser als HTML für <em class="Ironie">„moderne“</em>, auf CSS basierende Layouts ohne Tabellen geeignet und habe Vorteile für die Barrierefreiheit. Das ist natürlich völliger <a shape="rect" href="http://schneegans.de/xp/?url=http%3A%2F%2Fhsivonen.iki.fi%2Fwannabe%2F&amp;ct=application%2Fxml" class="Offsite">Quatsch</a>. HTML 4.01 und XHTML 1.0 unterscheiden sich lediglich syntaktisch. Die Verwendung von <a shape="rect" href="http://schneegans.de/xp/?url=http%3A%2F%2Fschneegans.de%2Fweb%2Fxhtml%2F&amp;ct=application%2Fxml#xhtml-10-oder-11">XHTML 1.1</a> ist sogar nachteilig für die Barrierefreiheit.</p> <p>Microsoft hat es geschafft, <a shape="rect" href="http://schneegans.de/xp/?url=http%3A%2F%2Fmsdn2.microsoft.com%2Fen-us%2Flibrary%2Fexc57y7e(en-US%2CVS.80).aspx&amp;ct=application%2Fxml" class="Offsite">fast alle unsinnigen Argumente für XHTML</a> in einem einzigen Dokument zu nennen.</p> <h3>Unsinnige Argumente gegen XHTML</h3> <p>Manche Leute behaupten, IE unterstütze bspw. <code>&lt;br /&gt;</code> nicht.</p> <p><a shape="rect" href="http://schneegans.de/xp/?url=http%3A%2F%2Fwww.w3.org%2FTR%2Fxhtml1%2F&amp;ct=application%2Fxml#C_10" class="Offsite">Angeblich</a> existieren auch Benutzeragenten, die bspw. <code>&lt;input type="checkbox" checked="checked" /&gt;</code> nicht verstehen, sondern nur die minimierte Form <code>&lt;input type="checkbox" checked /&gt;</code>. Ich habe solche Benutzeragenten noch nicht gesehen. HTML erlaubt ja auch beide Varianten, d.h. HTML-Benutzeragenten müssen mit beiden Varianten umgehen können.</p> <p>Es gibt in der Tat Benutzeragenten, die die o.g. SGML-Features <strong>korrekt</strong> interpretieren, bspw. <a shape="rect" href="http://schneegans.de/xp/?url=http%3A%2F%2Fwww.gnu.org%2Fsoftware%2Fw3%2F&amp;ct=application%2Fxml" class="Offsite">Emacs/W3</a>. Diese Benutzeragenten können XHTML-Dokumente in der Tat nicht verarbeiten, auch wenn sie den Kompatibilitätsrichtlinien entsprechen. Diese Benutzeragenten können aber auch die meisten der heute im Web publizierten HTML-Dokumente nicht sinnvoll verarbeiten.</p> <p>Viele Autoren wollen keine XML-Deklaration verwenden, weil diese verhindert, daß IE in den <a shape="rect" href="http://schneegans.de/xp/?url=http%3A%2F%2Fmsdn.microsoft.com%2Fen-us%2Flibrary%2Fbb250395.aspx&amp;ct=application%2Fxml" hreflang="en" lang="en" xml:lang="en" class="Offsite">standards compliant mode</a> schaltet. Eine XML-Deklaration ist aber nur dann erforderlich, wenn das XHTML-Dokument nicht UTF-8- oder UTF-16-codiert ist <em>und</em> der HTTP-<code>Content-Type</code>-Header keinen <code>charset</code>-Parameter enthält. Beachten Sie einfach die Hinweise zur Deklaration der <a shape="rect" href="http://schneegans.de/xp/?url=http%3A%2F%2Fschneegans.de%2Fweb%2Fxhtml%2F&amp;ct=application%2Fxml#codierung">Zeichencodierung</a>.</p> <p>Kritiker von XHTML verweisen gern auf den Artikel <a shape="rect" href="http://schneegans.de/xp/?url=http%3A%2F%2Fwww.hixie.ch%2Fadvocacy%2Fxhtml&amp;ct=application%2Fxml" class="Offsite">Sending XHTML as text/html Considered Harmful</a> von Ian Hickson. Leider ist dieser Artikel einseitig, irreführend und teilweise auch schlichtweg falsch:</p> <blockquote cite="http://schneegans.de/xp/?url=http%3A%2F%2Fwww.hixie.ch%2Fadvocacy%2Fxhtml&amp;ct=application%2Fxml"><p>&lt;script&gt; and &lt;style&gt; elements in XHTML sent as text/html have to be escaped using ridiculously complicated strings.</p></blockquote> <p>In der Tat möchte man Konstruktionen wie</p> <pre xml:space="preserve" class="Snippet"><code>&lt;script type="text/javascript"&gt;&lt;!--//--&gt;&lt;![CDATA[//&gt;&lt;!--
...
//--&gt;&lt;!]]&gt;&lt;/script&gt;</code></pre> <p>oder</p> <pre xml:space="preserve" class="Snippet"><code>&lt;style type="text/css"&gt;&lt;!--/*--&gt;&lt;![CDATA[/*&gt;&lt;!--*/
...
/*]]&gt;*/--&gt;&lt;/style&gt;</code></pre> <p>nicht ernsthaft verwenden. Muß man ja auch nicht – das <a shape="rect" href="http://schneegans.de/xp/?url=http%3A%2F%2Fschneegans.de%2Fweb%2Fxhtml%2F&amp;ct=application%2Fxml#embedded">Einbetten von JavaScript- oder CSS-Code</a> in XHTML ist kaum schwieriger als in HTML.</p> <blockquote cite="http://schneegans.de/xp/?url=http%3A%2F%2Fwww.hixie.ch%2Fadvocacy%2Fxhtml&amp;ct=application%2Fxml"><p>IE6 does not support application/xhtml+xml (in fact, it does not support XHTML at all).</p></blockquote> <p>Das stimmt natürlich, jedoch impliziert die Darstellung, IE6 unterstütze HTML. Das tut er aber <a shape="rect" href="http://schneegans.de/xp/?url=http%3A%2F%2Fschneegans.de%2Fweb%2Fxhtml%2Fshorttag%2F&amp;ct=application%2Fxml">noch viel weniger</a>.</p> <blockquote cite="http://schneegans.de/xp/?url=http%3A%2F%2Fwww.hixie.ch%2Fadvocacy%2Fxhtml&amp;ct=application%2Fxml"><p>Using XHTML and sending it as text/html is effectively the same, from an HTML4 point of view, as writing tag soup.</p></blockquote> <p>Dieselbe Taktik. Erstens bestreitet das niemand, und zweitens ist auch HTML, das als <code>text/html</code> ausgeliefert wird, für den typischen Benutzeragenten nur Tagsoup.</p> <blockquote cite="http://schneegans.de/xp/?url=http%3A%2F%2Fwww.hixie.ch%2Fadvocacy%2Fxhtml&amp;ct=application%2Fxml"><p>The "xmlns" attribute is invalid HTML4.</p></blockquote> <p>Dann wird es eben ignoriert, genau das <a shape="rect" href="http://schneegans.de/xp/?url=http%3A%2F%2Fwww.w3.org%2FTR%2Fhtml401%2Fappendix%2Fnotes.html&amp;ct=application%2Fxml#h-B.1" class="Offsite">empfiehlt</a> die HTML-Spezifikation ja.</p> <blockquote cite="http://schneegans.de/xp/?url=http%3A%2F%2Fwww.hixie.ch%2Fadvocacy%2Fxhtml&amp;ct=application%2Fxml"><p>RFC 2854 spec refers to "a profile of use of XHTML which is compatible with HTML 4.01".</p></blockquote> <p>Dieser Satz steht leider wirklich in <a shape="rect" href="http://schneegans.de/xp/?url=http%3A%2F%2Fwww.faqs.org%2Frfcs%2Frfc2854.html&amp;ct=application%2Fxml" class="Offsite">RFC 2854</a>, und Hickson stürzt sich natürlich sofort auf diese sprachliche Ungenauigkeit. Das Ziel der Kompatibilitätsrichtlinien <a shape="rect" href="http://schneegans.de/xp/?url=http%3A%2F%2Fwww.w3.org%2FTR%2Fxhtml1%2F&amp;ct=application%2Fxml#guidelines" class="Offsite">laut XHTML-1.0-Spezifikation</a> ist aber nicht die Kompatibilität von XHTML und HTML, denn diese ist unbestreitbar nicht zu erreichen. Vielmehr sollen XHTML-Dokumente von <q cite="http://schneegans.de/xp/?url=http%3A%2F%2Fwww.w3.org%2FTR%2Fxhtml1%2F&amp;ct=application%2Fxml#guidelines">existing HTML user agents</q> verarbeitet werden kann. Das ist ein wesentlicher Unterschied. Es ist deshalb auch ganz einfach, die Tauglichkeit der Kompatibilitätsrichtlinien zu widerlegen: Man erstelle ein XHTML-1.0-Dokument, das den Kompatibilitätsrichtlinien genügt und von einem einigermaßen aktuellen Benutzeragenten (sagen wir, ab Netscape 3.x) anders dargestellt wird als das entsprechende HTML-Dokument. Bisher hat mir niemand ein solches XHTML-Dokument präsentieren können.</p> <h2 id="xhtml-10-oder-11">XHTML 1.0 oder 1.1?</h2> <p>XHTML 1.0 verwendet praktisch dasselbe Vokabular wie HTML 4.01; XHTML 1.1 tut das nicht. Deshalb können XHTML-1.0-Dokumente von HTML-Benutzeragenten verarbeitet werden, wenn sie den Kompatibilitätsrichtlinien genügen, XHTML-1.1-Dokumente hingegen nicht. Das ist die Begründung dafür, daß XHTML-1.1-Dokumente nicht als <code>text/html</code> deklariert werden <a shape="rect" href="http://schneegans.de/xp/?url=http%3A%2F%2Fwww.w3.org%2FTR%2Fxhtml-media-types%2F&amp;ct=application%2Fxml#summary" class="Offsite">sollten</a>.</p> <p>In XHTML 1.1 fehlt das für die Zugänglichkeit wichtige <code>lang</code>-Attribut. Es existieren Benutzeragenten, die das <code>lang</code>-Attribut unterstützen, das <code>xml:lang</code>-Attribut aber nicht, bspw. der IBM Home Page Reader.</p> <p>Außerdem ist das <a shape="rect" href="http://schneegans.de/xp/?url=http%3A%2F%2Fwww.w3.org%2FTR%2Fxhtml-modularization%2Fabstract_modules.html&amp;ct=application%2Fxml#s_imapmodule" class="Offsite"> <code>usemap</code></a>-Attribut in XHTML 1.1 vom Typ <code>IDREF</code>, so daß bislang benutzte Werte wie <code>#map</code> ungültig werden; Werte wie <code>map</code> können aber von vielen HTML-Benutzeragenten nicht verarbeitet werden.</p> <h2 id="mime"><code>text/html</code> oder <code>application/xhtml+xml</code> oder <code>application/xml</code> oder <code>text/xml</code>?</h2> <p>Internet Explorer und zahlreiche andere Benutzeragenten unterstützen den Inhaltstyp <code>application/xhtml+xml</code> nicht oder können XHTML-Dokumente, die mit den Inhaltstypen <code>application/xml</code> oder <code>text/xml</code> ausgeliefert werden, nicht verarbeiten. (Den <code>Content-Type</code>-Header können Sie bequem mit <a shape="rect" href="http://schneegans.de/xp/?url=http%3A%2F%2Fweb-sniffer.net%2F&amp;ct=application%2Fxml" class="Offsite">Web-Sniffer</a> einsehen.)</p> <p>Die einfachste Lösung besteht darin, XHTML-Dokumente als <code>text/html</code> auszuliefern. Dies ist für XHTML-1.0-Dokumente, die den Kompatibilitätsrichtlinien genügen, <a shape="rect" href="http://schneegans.de/xp/?url=http%3A%2F%2Fwww.w3.org%2FTR%2Fxhtml-media-types%2F&amp;ct=application%2Fxml#text-html" class="Offsite">zulässig</a> und unproblematisch. Die Einhaltung der Kompatibilitätsrichtlinien sollten Sie stets <a shape="rect" href="http://schneegans.de/xp/?url=http%3A%2F%2Fqa-dev.w3.org%2F~bjoern%2Fappendix-c%2Fvalidator%2F&amp;ct=application%2Fxml" class="Offsite">überprüfen</a>.</p> <p>Komplizierter wird es, wenn Sie mittels <a shape="rect" href="http://schneegans.de/xp/?url=http%3A%2F%2Fschneegans.de%2Fweb%2Fxhtml%2F&amp;ct=application%2Fxml#content-negotiation">Content Negotiation</a> eine <code>text/html</code>- und eine <code>application/xhtml-xml</code>-Variante ausliefern wollen. Es existieren zwar Anleitungen für PHP, ASP.NET und Apache, die teilweise jedoch recht abenteuerlich sind. Manchmal wird nicht einmal der <code>Accept</code>-, sondern der <code>User-Agent</code>-Header ausgewertet!</p> <p>Content Negotiation führt dazu, daß mit HTTP 1.0 Caching unmöglich wird. <a shape="rect" href="http://schneegans.de/xp/?url=http%3A%2F%2Fwww.w3.org%2FProtocols%2Frfc2616%2Frfc2616-sec13.html&amp;ct=application%2Fxml#sec13.6" class="Offsite">Caching von verhandelbaren Ressourcen</a> ist auf die Header <code>Vary</code>, <code>ETag</code>, <code>If-Match</code> und <code>If-None-Match</code> angewiesen, und die gibt es erst in HTTP 1.1. (Es geht hier überhaupt nicht um den <code>Host</code>-Header; den schicken auch viele Benutzeragenten, die ansonsten nur HTTP 1.0 verstehen.) HTTP 1.0 ist keineswegs obsolet – standardmäßig ist im IE6 <em class="Menupath"><span>Extras</span> <span>→ Internetoptionen…</span> <span>→ Erweitert</span> <span>→ HTTP 1.1 über Proxyverbindungen verwenden</span></em> deaktiviert.  Praktisch läuft das darauf hinaus, daß man Caching mindestens in öffentlichen Caches unterbinden muß. Sie müssen sich darüber im klaren sein, daß eine fehlerhafte Konfiguration des Servers fatale Auswirkungen haben kann, etwa wenn IE eine <code>application/xhtml+xml</code>-Ressource aus einem Cache erhält. Solche Fehler sind zudem nur sehr schwer aufzuspüren.</p> <p>Die o.g. <a shape="rect" href="http://schneegans.de/xp/?url=http%3A%2F%2Fschneegans.de%2Fweb%2Fxhtml%2F&amp;ct=application%2Fxml#xhtml-oder-html">Vorteile von XHTML</a> gelten auch für <code>text/html</code>-Ressourcen, so daß ich inzwischen von Content Negotiation abrate. Für Content Negotiation sprechen allerdings folgende Argumente:</p> <ul><li>Wer XHTML schreibt und immer als <code>text/html</code> ausliefert, läuft Gefahr, Verstöße gegen Wohlgeformtheits-Bedingungen nicht sofort zu bemerken. Der W3C-Validator erkennt nicht alle Verstöße, denn er hat einige ärgerliche <a shape="rect" href="http://schneegans.de/xp/?url=http%3A%2F%2Fesw.w3.org%2Ftopic%2FMarkupValidator%2FXML_Limitations&amp;ct=application%2Fxml" class="Offsite">Einschränkungen</a>. Sie sollten also einen richtigen XML-Validator verwenden, bspw. meinen <a shape="rect" href="http://schneegans.de/xp/?url=http%3A%2F%2Fschneegans.de%2Fsv%2F&amp;ct=application%2Fxml" class="Offsite">Schema-Validator</a> oder <a shape="rect" href="http://schneegans.de/xp/?url=http%3A%2F%2Fvalet.webthing.com%2Fpage%2F&amp;ct=application%2Fxml" class="Offsite">Page Valet</a>, wobei Sie Xerces manuell als Parser auswählen müssen. Testen Sie außerdem mit <a shape="rect" href="http://schneegans.de/xp/?url=http%3A%2F%2Fschneegans.de%2Fxp%2F&amp;ct=application%2Fxml">XHTML Proxy</a>!</li><li>Es mag unbefriedigend sein, daß der schöne XHTML-Quellcode durch einen Tagsoup-Parser gedreht wird.</li><li>Mozilla schaltet mit <code>application/xhtml+xml</code> seinen <em class="Name" lang="en" xml:lang="en">„full standards mode“</em> ein, ohne das konzeptionell untaugliche <a shape="rect" href="http://schneegans.de/xp/?url=http%3A%2F%2Fwww.mozilla.org%2Fdocs%2Fweb-developer%2Fquirks%2Fdoctypes.html&amp;ct=application%2Fxml" hreflang="en" lang="en" xml:lang="en" class="Offsite">DOCTYPE sniffing</a> bemühen zu müssen.</li></ul> <p>Beim Einsatz von Content Negotiation können Sie anstelle von <code>application/xhtml+xml</code> auch <code>application/xml</code> ausliefern, XHTML-Benutzeragenten unterstützen beides. Hingegen sollte <code>text/xml</code> <a shape="rect" href="http://schneegans.de/xp/?url=http%3A%2F%2Fwww.w3.org%2FTR%2Fwebarch%2F&amp;ct=application%2Fxml#no-text-xml" class="Offsite">niemals benutzt werden</a>, denn die Regeln zur Bestimmung der Zeichencodierung einer <code>text/xml</code>-Ressource sind völlig <a shape="rect" href="http://schneegans.de/xp/?url=http%3A%2F%2Fwww.w3.org%2FTR%2Fxhtml-media-types%2F&amp;ct=application%2Fxml#text-xml" class="Offsite">idiotisch</a>. Ich kenne keinen Benutzeragenten, der <code>text/xml</code> spezifikationskonform unterstützt, auch wenn bspw. Mozilla das mit seinem <code>Accept: text/xml</code> glauben machen möchte.</p> <p>Einige <a shape="rect" href="http://schneegans.de/xp/?url=http%3A%2F%2Fwww.abakus-internet-marketing.de%2Fforen%2Fviewtopic%2Ft-10640%2Fpostdays-0%2Fpostorder-asc%2Fstart-15.html&amp;ct=application%2Fxml" class="Offsite">verwirrte</a> <a shape="rect" href="http://schneegans.de/xp/?url=http%3A%2F%2Fwww.shop.tutorials.de%2Fshowpost.php%3Fs%3Dfe6fbbc56a32b228f121e198ff3e72e8%26p%3D936597%26postcount%3D3&amp;ct=application%2Fxml" class="Offsite">Leute</a> sind offenbar der Überzeugung, mit</p> <pre xml:space="preserve" class="Snippet"><code>&lt;meta http-equiv="Content-Type" content="application/xhtml+xml; charset=utf-8" /&gt;</code></pre> <p>in einem <code>text/html</code>-Dokument den XML-Parser des Benutzeragenten aktivieren zu können. Das ist natürlich Unsinn. Ein Benutzeragent müßte mit seinem Tagsoup-Parser beginnen und ab dem <code>meta</code>-Element mit seinem XML-Parser weitermachen oder gar noch einmal von vorne beginnen.</p> <p>Tatsächlich ist <code>application/xhtml+xml</code> an dieser Stelle nicht nur wirkungslos, sondern sogar schädlich. Mindestens Lynx nämlich kann aus</p> <pre xml:space="preserve" class="Snippet"><code>&lt;meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" /&gt;</code></pre> <p>die Deklaration der Codierung ermitteln, aus</p> <pre xml:space="preserve" class="Snippet"><code>&lt;meta http-equiv="Content-Type" content="application/xhtml+xml; charset=iso-8859-1" /&gt;</code></pre> <p>aber nicht. Es spricht nichts dagegen, auch in einem XHTML-Dokument die Zeichencodierung bspw. mit</p> <pre xml:space="preserve" class="Snippet"><code>&lt;meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" /&gt;</code></pre> <p>anzugeben. Das kann sogar notwendig sein, wenn Sie die Zeichencodierung ansonsten nur in der XML-Deklaration angegeben und nicht in einem <em class="Ironie">„echten“</em> HTTP-Header wie <code>Content-Type: text/html; charset=iso-8859-1</code>, denn HTML-Benutzeragenten verarbeiten die XML-Deklaration nicht.</p> <p>Mit <code>application/xhtml+xml</code> im richtigen <code>Content-Type</code>-Header ist das <code>meta</code>-Element hingegen völlig irrelevant.</p> <h2 id="content-negotiation" lang="en" xml:lang="en">Content Negotiation</h2> <p>Ich <a shape="rect" href="http://schneegans.de/xp/?url=http%3A%2F%2Fschneegans.de%2Fweb%2Fxhtml%2F&amp;ct=application%2Fxml#mime">rate</a> im allgemeinen vom Einsatz von <span lang="en" xml:lang="en">Content Negotiation</span> ab. Wenn Sie es trotzdem versuchen wollen, sind hier zwei Ansätze, die sich einigermaßen bewährt haben:</p> <h3>MultiViews</h3> <p>Apache verfügt mit seiner <a shape="rect" href="http://schneegans.de/xp/?url=http%3A%2F%2Fhttpd.apache.org%2Fdocs%2Fcontent-negotiation.html&amp;ct=application%2Fxml" class="Offsite">Content Negotiation</a> über einen leistungsfähigen Mechanismus, um Clients mit der für sie am besten geeigneten Variante einer Ressource zu beliefern. Varianten werden dabei normalerweise in verschiedenen Dateien gespeichert, so könnte bspw. <code>dokument.html</code> die HTML-Repräsentation eines Dokuments enthalten, <code>dokument.pdf</code> die Repräsentation im PDF-Format und schließlich <code>dokument.txt</code> eine Repräsentation als <code>text/plain</code>. Der Zugriff auf die Ressource erfolgt über die URL <code>dokument</code>, Apache erledigt den Rest.</p> <p>Es wäre wünschenswert, wenn dieser Mechanismus auch mehrere Varianten einer Repräsentation zuordnen könnte. Eine Datei, die ein XHTML-Dokument enthält, welches den <a shape="rect" href="http://schneegans.de/xp/?url=http%3A%2F%2Fwww.w3.org%2FTR%2Fxhtml1%2F&amp;ct=application%2Fxml#guidelines" class="Offsite">Kompatibilitätsrichtlinien</a> entspricht, könnte dann als <code>text/html</code> <em>und</em> <code>application/xhtml+xml</code> ausgeliefert werden. Diese Möglichkeit besteht nach meinen Erfahrungen aber nicht. Sie müssen daher Ihre Dokumente doppelt auf dem Server ablegen.</p> <p>Nennen Sie bspw. eine Kopie <code>dokument.html</code> und die zweite <code>dokument.xhtml</code>. Ergänzen Sie die <code>.htaccess</code> dann um folgende Direktiven:</p> <pre xml:space="preserve" class="Snippet"><code>Options +MultiViews
AddType text/html;charset=iso-8859-1 .html
AddType application/xhtml+xml;charset=iso-8859-1;qs=0.999 .xhtml</code></pre> <p>Ggf. müssen Sie eine andere Codierung angeben.</p> <p>Die <code>qs</code>-Werte verdienen besondere Beachtung. Der HTML-Variante wird eine geringfügig höhere Qualität zugewiesen. Der IE, der einfach nur <code>*/*</code> verlangt, erhält deshalb diese Variante. Opera ist unproblematisch, da er <code>text/html</code> explizit angibt. Mozilla wertet in seinem <code>Accept</code>-Header die XHTML-Variante (<code>1.0</code>) entschieden höher als die HTML-Variante (<code>0.9</code>). Der vom Apache verwendete <a shape="rect" href="http://schneegans.de/xp/?url=http%3A%2F%2Fhttpd.apache.org%2Fdocs%2F2.0%2Fcontent-negotiation.html&amp;ct=application%2Fxml" class="Offsite">Algorithmus</a> wird deshalb für Mozilla die XHTML-Variante selektieren.</p> <p>Wenn Sie auf Ihrem Webserver Skripte ausführen können oder sogar Shell-Zugang haben, können Sie Kopien vermeiden, indem Sie symbolische Links erstellen.</p> <p>Der <code>qs</code>-Parameter in der <code>AddType</code>-Direktive beeinflußt leider nicht nur die Auswahl der Variante; er erscheint auch im <code>Content-Type</code>-Header. <a shape="rect" href="http://schneegans.de/xp/?url=http%3A%2F%2Fwww.rfc-editor.org%2Frfc%2Frfc3236.txt&amp;ct=application%2Fxml" class="Offsite">RFC 3236</a> erlaubt für den MIME-Typ <code>application/xhtml+xml</code> aber nur die Parameter <code>charset</code> und <code>profile</code>, eine Ausgabe wie <code>Content-Type: application/xhtml+xml; charset=iso-8859-1; qs=0.999</code> ist also nicht RFC-konform. Mir ist allerdings kein Benutzeragent bekannt, der sich daran stört.</p> <p>Bei Verwendung von Type-Maps wird der <code>qs</code>-Parameter nicht in den <code>Content-Type</code>-Header geschrieben. Pro Ressource müssen dann allerdings <em>drei</em> Dateien gespeichert werden. Ein <a shape="rect" href="http://schneegans.de/xp/?url=http%3A%2F%2Fgroups.google.com%2Fgroups%3Fselm%3Dhsivonen-F8BA91.16591027022002%40tron.sci.fi&amp;ct=application%2Fxml" class="Offsite">Perl-Script von Henri Sivonen</a> leistet hier sicherlich gute Dienste. Es erzeugt für alle <code>.xml</code>-Dateien symbolische Links als <code>.html</code> und generiert eine <code>.var</code>-Datei.</p> <h3>mod_rewrite</h3> <p>Mit <a shape="rect" href="http://schneegans.de/xp/?url=http%3A%2F%2Fhttpd.apache.org%2Fdocs%2Fmisc%2Frewriteguide.html&amp;ct=application%2Fxml" class="Offsite">mod_rewrite</a> läßt sich eine einfache, aber nicht ganz saubere Lösung konstruieren. Sie müssen Ihre Dokumente oder deren Dateinamen nicht ändern, sondern einfach nur einige Direktiven in die <code>.htaccess</code> aufnehmen:</p> <pre xml:space="preserve" class="Snippet"><code>RewriteEngine On
RewriteCond %{HTTP_ACCEPT} application/xhtml\+xml
RewriteCond %{HTTP_ACCEPT} !application/xhtml\+xml\s*;\s*q=0
RewriteCond %{REQUEST_URI} \.html$
RewriteCond %{THE_REQUEST} HTTP/1\.1
RewriteRule .* - "[T=application/xhtml+xml; charset=iso-8859-1]"</code></pre> <p>Achten Sie auch hier wieder auf die richtige Codierung!</p> <p>Apache ändert dann den Inhaltstyp aller Dateien mit der Endung <code>.html</code> vom voreingestellten <code>text/html</code> in <code>application/xhtml+xml</code>, wenn der <code>Accept</code>-Header des Browsers diese Zeichenfolge enthält, der zugehörige <code>q</code>-Wert nicht mit einer Null beginnt und die Anfrage mittels HTTP 1.1 gestellt wird. Unter Apache 1.x funktioniert das auch für Standarddokumente, die per <code>/</code> angefordert werden, nicht aber unter Apache 2.x.</p> <p>Apache erzeugt einen korrekten <code>Vary</code>-Header, wenn der Inhaltstyp verändert wird, so daß HTTP-1.1-Clients die Ressource cachen können. HTTP-1.0-Clients kennen den <code>Vary</code>-Header aber nicht. Um Caching-Probleme zu vermeiden, wird ihnen eine Antwort mit dem originalen Inhaltstyp geschickt.</p> <h3>PHP, ASP, CGI</h3> <p>Google hilft.</p> <h3>Testen der Konfiguration</h3> <p>Sie können leicht mit einem Telnet-Client testen, ob die Konfiguration wie gewünscht funktioniert. Stellen Sie dazu mittels <code>telnet www.example.org 80</code> eine Verbindung zum Webserver her und geben Sie dann folgendes ein:</p> <pre xml:space="preserve" class="Snippet"><code>HEAD / HTTP/1.1
Host: www.example.org
Accept: application/xhtml+xml
Connection: close</code></pre> <p>Der Server sollte dann etwa so antworten:</p> <pre xml:space="preserve" class="Snippet"><code>HTTP/1.1 200 OK
Vary: Accept
Content-Type: application/xhtml+xml; charset=iso-8859-1</code></pre> <p>Entscheidend ist der <code>Content-Type</code>-Header. Enthält er <code>application/xhtml+xml</code> und eine Zeichencodierungsdeklaration, ist alles in Ordnung.</p> <h2 id="embedded">Eingebetteter JavaScript- und CSS-Code</h2> <p>Die Kompatibilitätsrichtlinien <a shape="rect" href="http://schneegans.de/xp/?url=http%3A%2F%2Fwww.w3.org%2FTR%2Fxhtml1%2F&amp;ct=application%2Fxml#C_4" class="Offsite">empfehlen</a>, JavaScript- und CSS-Code als externe Ressourcen abzulegen, wenn im Quelltext bestimmte Zeichenfolgen auftreten. Das ist natürlich möglich, ist aber nicht erforderlich. Man kann JavaScript- und CSS-Code stets so in XHTML-Dokumente einbinden, daß sowohl HTML- als auch XHTML-Benutzeragenten den Code korrekt interpretieren.</p> <p>Die Elementtypen <code>script</code> und <code>style</code> sind in HTML mit CDATA-Inhaltsmodell definiert. Das heißt, daß Zeichen wie <code>&lt;</code> oder <code>&amp;</code> automatisch <em class="Ironie">„entwertet“</em> sind; <code>&lt;</code> leitet in einem HTML-<code>script</code>-Element also <em>kein</em> <span lang="en" xml:lang="en">Tag</span> ein und <code>&amp;</code> <em>keine</em> <span lang="en" xml:lang="en">Entity</span>-Referenz.</p> <p>In XML gibt es das CDATA-Inhaltsmodell nicht mehr. Stattdessen gibt es <a shape="rect" href="http://schneegans.de/xp/?url=http%3A%2F%2Fwww.w3.org%2FTR%2FREC-xml%2F&amp;ct=application%2Fxml#sec-cdata-sect" class="Offsite">CDATA-Abschnitte</a>. Ohne explizit notierten CDATA-Abschnitt verhalten sich die Zeichen <code>&lt;</code> oder <code>&amp;</code> in einem XHTML-<code>script</code>-Element also genauso wie etwa in einem <code>p</code>-Element, d.h. sie leiten ein <span lang="en" xml:lang="en">Tag</span> bzw. eine <span lang="en" xml:lang="en">Entity</span>-Referenz ein.</p> <p>Es ergibt sich also das Problem, daß <code>&lt;script type='text/javascript'&gt;alert('&amp;#20AC;')&lt;/script&gt;</code> in einem HTML-Dokument eine andere Bedeutung hat als in einem XHTML-Dokument – ein HTML-Benutzeragent würde <code>&amp;#20AC;</code> anzeigen, ein XHTML-Benutzeragent hingegen <code>€</code>.</p> <p>In dieser Hinsicht <em class="Ironie">„gefährlich“</em> sind die Zeichenfolgen <code>&lt;</code> und <code>&amp;</code>. Wenn diese Zeichenfolgen im JavaScript- oder CSS-Code auftreten, betten Sie den Code folgendermaßen ein:</p> <pre xml:space="preserve" class="Snippet"><code>&lt;script type='text/javascript'&gt;
/* &lt;![CDATA[ */
s = '&lt;';
/* ]]&gt; */
&lt;/script&gt;

&lt;style type='text/css'&gt;
/* &lt;![CDATA[ */
p:after { content: '&amp;'; }
/* ]]&gt; */
&lt;/style&gt;</code></pre> <p>Der CDATA-Abschnitt sorgt dafür, daß sich XHTML-Benutzeragenten den Inhalt der Elemente so lesen wie HTML-Benutzeragenten. Die Kommentare <code>/* */</code> wiederum sorgen dafür, daß in HTML-Benutzeragenten die CDATA-Marken nicht als JavaScript- oder CSS-Code intepretiert werden.</p> <p>JavaScript- oder CSS-Code, der die o.g. Zeichenfolgen <strong>nicht</strong> enthält, kann auch sicher ohne CDATA-Abschnitt eingebettet werden:</p> <pre xml:space="preserve" class="Snippet"><code>&lt;script type='text/javascript'&gt;
s = '&gt;';
&lt;/script&gt;

&lt;style type='text/css'&gt;
p:after { content: '+'; }
&lt;/style&gt;</code></pre> <p>Auf keinen Fall dürfen Kommentare (<code>&lt;!-- --&gt;</code>) verwendet werden, um den Inhalt von <code>style</code>- und <code>script</code>-Elementen vor älteren Benutzeragenten zu verstecken, denn XML-Parser dürfen Kommentare einfach ignorieren.</p> <p>Problematisch ist lediglich die Zeichenfolge <code>]]&gt;</code>, die ja das Ende eines CDATA-Abschnitts markiert. In XML darf sie nicht anderweitig benutzt werden, bspw. <code>&lt;p&gt;]]&gt;&lt;/p&gt;</code> ist nicht wohlgeformt. Wenn Sie diese Zeichenfolge in JavaScript- oder CSS-Code benötigen, müssen Sie sie zerlegen, bspw. so:</p> <pre xml:space="preserve" class="Snippet"><code>&lt;style type="text/css"&gt;
p:after { content: "]]" "&gt;"; }
&lt;/style&gt;

&lt;script type="text/javascript"&gt;
alert(']]'+'&gt;');
&lt;/script&gt;</code></pre> <h2 id="entity-ref">Entity-Referenzen</h2> <p>Die Entity-Referenzen <code>&amp;lt;</code>, <code>&amp;gt;</code>, <code>&amp;quot;</code> und <code>&amp;amp;</code> sind in XHTML völlig unproblematisch. Vermeiden sollte man <a shape="rect" href="http://schneegans.de/xp/?url=http%3A%2F%2Fwww.w3.org%2FTR%2Fxhtml1%2F&amp;ct=application%2Fxml#C_16" class="Offsite"><code>&amp;apos;</code></a>, weil HTML-Benutzeragenten damit nichts anfangen können, und den ganzen Rest wie <code>&amp;auml;</code> oder <code>&amp;nbsp;</code>, denn diese sind in der DTD deklariert. Bei HTML-Benutzeragenten spielt das keine Rolle; XHTML- und XML-Benutzeragenten können diese Entity-Referenzen jedoch nur auflösen, wenn sie Zugriff auf die DTD haben und einen validierenden Parser verwenden. Mozilla etwa verwendet im Gegensatz zu IE keinen validierenden Parser und kann Entity-Referenzen im allgemeinen nicht auflösen, es funktioniert aber <a shape="rect" href="http://schneegans.de/xp/?url=http%3A%2F%2Fdeveloper.mozilla.org%2Fen%2Fdocs%2FXML_in_Mozilla&amp;ct=application%2Fxml#XHTML" class="Offsite">ausnahmsweise</a> mit einigen Dokumenttyp-Deklarationen.</p> <p>Mit UTF-8 kann man auf Entity-Referenzen leicht verzichten, ansonsten nimmt man eben numerische Zeichenreferenzen wie <code>&amp;#228;</code>. (Die hexadezimale Schreibweise <code>&amp;#xE4;</code> wird von einigen Netscape-4.x-Versionen nicht unterstützt und sollte deshalb vermieden werden.)</p> <h2 id="codierung">Codierung</h2> <p>Es ist nicht ganz einfach, die Codierung eines XHTML-Dokuments, das als <code>text/html</code> ausgeliefert wird, so zu deklarieren, daß sowohl HTML-Benutzeragenten als auch XML-Software das Dokument decodieren können. Dabei sind folgende Bedingungen zu berücksichtigen:</p> <ul><li>HTML-Benutzeragenten berücksichtigen zur Ermittlung der Codierung HTTP-Header und auch ein <code>meta</code>-Element. (Das <code>meta</code>-Element wird von einigen Benutzeragenten ignoriert, wenn es erst spät auftaucht. Deshalb sollte das <code>meta</code>-Element immer das erste Kind des <code>head</code>-Elements sein.)</li><li>XML-Software berücksichtigt ein <span lang="en" xml:lang="en">byte order mark</span> (<a shape="rect" href="http://schneegans.de/xp/?url=http%3A%2F%2Fwww.unicode.org%2Ffaq%2Futf_bom.html&amp;ct=application%2Fxml#22" hreflang="en" class="Offsite">BOM</a>), XML-Deklaration und manchmal HTTP-Header. Sie muß das <code>meta</code>-Element ignorieren. (Das ist übrigens kein Rückschritt gegenüber HTML, sondern die Voraussetzung für einfache und schnelle Parser, denn man <a shape="rect" href="http://schneegans.de/xp/?url=http%3A%2F%2Fwww.w3.org%2FTR%2FREC-xml%2F&amp;ct=application%2Fxml#sec-guessing" class="Offsite">erspart</a> sich so, das Dokument zu decodieren, um herauszufinden, wie man es decodieren muß.)</li><li>In HTML gibt es <a shape="rect" href="http://schneegans.de/xp/?url=http%3A%2F%2Fschneegans.de%2Fbugs%2Fie-utf-7%2F&amp;ct=application%2Fxml">keine Standardcodierung</a>.</li><li>In XHTML ist UTF-8 die Standardcodierung.</li><li>Eine XML-Deklaration verhindert den <a shape="rect" href="http://schneegans.de/xp/?url=http%3A%2F%2Fmsdn.microsoft.com%2Fen-us%2Flibrary%2Fbb250395.aspx&amp;ct=application%2Fxml" hreflang="en" lang="en" xml:lang="en" class="Offsite">standards compliant mode</a> beim IE.</li><li>Widersprüchliche Deklarationen sollten vermieden werden.</li></ul> <p>Daraus folgt inbesondere:</p> <ul><li>Wer nicht UTF-8 verwendet und wegen IE keine XML-Deklaration angeben möchte, muß die Codierung im HTTP-<code>Content-Type</code>-Header deklarieren. Ein <code>meta</code>-Element <a shape="rect" href="http://schneegans.de/xp/?url=http%3A%2F%2Fwww.w3.org%2FTR%2Fxhtml1%2F&amp;ct=application%2Fxml#C_9" class="Offsite">genügt nicht</a>. (Der W3C-Validator und Validome sehen das dummerweise anders.)</li><li>Bei Verwendung von UTF-8 ist es ausreichend, diese Codierung in einem <code>meta</code>-Element zu deklarieren.</li><li>Es ist im Hinblick auf XML-Software sinnvoll, auf den HTTP-Header verzichten zu können. Insbesondere kann ein XHTML-Dokument dann als Datei mit XML-Software bearbeitet werden. Bspw. MSXML ignoriert den HTTP-Header.</li></ul> <h2 id="empfehlungen">Meine Empfehlungen</h2> <ul><li>Verwenden Sie XHTML 1.0 Strict.</li><li>Verwenden Sie einen <a shape="rect" href="http://schneegans.de/xp/?url=http%3A%2F%2Fschneegans.de%2Fsv%2F&amp;ct=application%2Fxml" class="Offsite">XML-Validator</a>. Der <a shape="rect" href="http://schneegans.de/xp/?url=http%3A%2F%2Fesw.w3.org%2Ftopic%2FMarkupValidator%2FXML_Limitations&amp;ct=application%2Fxml" class="Offsite">W3C-Validator</a> und <a shape="rect" href="http://schneegans.de/xp/?url=http%3A%2F%2Fschneegans.de%2Fweb%2Fvalidome-bugs%2F&amp;ct=application%2Fxml">Validome</a> sind keine XML-Validatoren.</li><li>Beachten Sie dabei die Kompatibilitätsrichtlinien und <a shape="rect" href="http://schneegans.de/xp/?url=http%3A%2F%2Fqa-dev.w3.org%2F~bjoern%2Fappendix-c%2Fvalidator%2F&amp;ct=application%2Fxml" class="Offsite">überprüfen</a> Sie die Einhaltung.</li><li>Codieren Sie Ihre XHTML-Dokumente und Stylesheets in UTF-8. Verwenden Sie keine Entity-Referenzen außer <code>&amp;lt;</code>, <code>&amp;gt;</code>, <code>&amp;quot;</code> und <code>&amp;amp;</code>.</li><li>Liefern Sie Ihre Dokumente als <code>text/html</code> aus. Content Negotiation lohnt sich nicht.</li><li>Testen Sie Ihre XHTML-Dokumente in XHTML-Benutzeragenten – mit <a shape="rect" href="http://schneegans.de/xp/?url=http%3A%2F%2Fschneegans.de%2Fxp%2F&amp;ct=application%2Fxml">XHTML Proxy</a> geht das ganz einfach.</li></ul> </div><div class="Footer"> <em>URL:</em> http://schneegans.de/web/xhtml/<br /><a shape="rect" href="http://schneegans.de/xp/?url=http%3A%2F%2Fschneegans.de%2Fsv%2F%3Furl%3Dhttp%3A%2F%2Fschneegans.de%2Fweb%2Fxhtml%2F&amp;ct=application%2Fxml" hreflang="en" class="Offsite">XHTML überprüfen</a> · <a shape="rect" href="http://schneegans.de/xp/?url=http%3A%2F%2Fjigsaw.w3.org%2Fcss-validator%2Fvalidator%3Furi%3Dhttp%3A%2F%2Fschneegans.de%2Fweb%2Fxhtml%2F&amp;ct=application%2Fxml" class="Offsite">CSS überprüfen</a> · <a shape="rect" href="http://schneegans.de/xp/?url=http%3A%2F%2Fschneegans.de%2Fxp%2F%3Furl%3Dhttp%3A%2F%2Fschneegans.de%2Fweb%2Fxhtml%2F&amp;ct=application%2Fxml" class="Offsite">Als <code>application/xml</code> laden</a><address><em>Autor:</em> <a shape="rect" href="http://schneegans.de/xp/?url=http%3A%2F%2Fschneegans.de%2Fchristoph%2F&amp;ct=application%2Fxml">Christoph Schneegans</a> (<a shape="rect" href="mailto:Christoph%20Schneegans%20%3CChristoph@Schneegans.de%3E">Christoph@Schneegans.de</a>)</address> </div></body></html><!-- XHTML Proxy has successfully processed this page. -->