Unterschiede zwischen HTML und XHTML

Unterschied: MIME-Typen

Der MIME-Typ für gewöhnliche HTML-Dokumente lautet stets text/html. XHTML-Dokumente können diesen MIME-Typ ebenfalls haben. Doch dann werden sie in Browsern nicht von XML-Parsern verarbeitet, sondern vom HTML-Parser. Das ist zwar robust rückwärtskompatibel, stellt jedoch die Verwendung von XHTML in Frage. Seine Vorteile kann XHTML eigentlich nur ausspielen, wenn es als XML-Dokument von einem XML-Parser verarbeitet wird.

Wenn Sie — wie es eigentlich vorgesehen ist — XHTML als XML-Dokument ausliefern möchten, stehen dafür die MIME-Typen text/xml und application/xml zur Verfügung, die für alle von XML abgeleiteten Sprachen gedacht sind. Das W3-Konsortium hat zusätzlich den MIME-Typ application/xhtml+xml speziell für XHTML etabliert. Für das Erstellen von XHTML-Dokumenten hat dies direkt zunächst keine Bedeutung. Wohl aber für die Kommunikation zwischen Web-Browser und Web-Server. Wenn der Server dem Browser die angeforderte XHTML-Datei mit dem Typ application/xhtml+xml sendet, muss der Browser in der Lage sein, diesen MIME-Typ zu verarbeiten und Dateien dieses Typs am Bildschirm anzuzeigen. Anderenfalls kann es beispielsweise passieren, dass der Browser dem Anwender die Datei zum Download anbietet, statt sie ins Anzeigefenster zu laden. Das W3-Konsortium hat eine Übersicht über die Browserunterstützung der verschiedenen MIME-Typen zusammengestellt.

Der Unterschied der MIME-Typen ist kein theoretischer. Bei text/html nutzen die Browser den herkömmlichen HTML-Parser bei der Verarbeitung des Quellcodes. Die heute üblichen HTML-Parser der Browser lassen syntaktische Fehler im Dokument einfach durchgehen und versuchen das Dokument irgendwie anzuzeigen. Bei application/xhtml+xml behandelt ein Browser, der den MIME-Typ korrekt verarbeitet, das XHTML-Dokument als echtes XML-Dokument und benutzt dafür seinen XML-Parser. Der XML-Parser arbeitet im Gegensatz zum HTML-Parser nach festen, vorgegebenen Regeln. Er erwartet, dass das Dokument die strengen Syntaxregeln von XML einhält. Wenn er auf einen syntaktischen Fehler stößt, muss er die Verarbeitung abbrechen. Im Anzeigefenster des Browsers erscheint dann entweder nur eine Fehlermeldung anstelle des Dokuments, oder, wie bei vielen aktuellen Browsern, das Dokument nur bis zur Stelle des Fehlers. Wenn Sie also den MIME-Typ application/xhtml+xml verwenden, müssen Sie genau darauf achten, dass Ihre XHTML-Dateien wohlgeformt sind. Dies können Sie beispielsweise mit dem Validator des W3-Konsortiums prüfen.

Unterschied: Dateinamen

Wenn keine MIME-Typ-Angabe existiert, die festlegt, wie ein Dokument zu behandeln ist, prüfen viele XML-fähige Browser die Dateinamenerweiterung. Wenn Sie in einer Datei zwar alle Regeln von XHTML einhalten, die Datei aber mit den typischen Endungen .htm oder .html abspeichern, benutzen diese Browser ihre HTML-Parser. Speichern Sie die Datei dagegen mit einer anderen Endung ab, z.B. .xhtml, dann benutzen die Browser unter Umständen ihre XML-Parser. Dies wirkt sich genauso aus wie bei den verschiedenen MIME-Typen.

Der Unterschied hinsichtlich der Dateinamen ist mit dem der MIME-Typen verknüpft. Ein Web-Server unterscheidet eine HTML-Datei für gewöhnlich über dessen Dateinamenerweiterung von einer XHTML-Datei. Dementsprechend wählt er einen geeigneten MIME-Typ, also etwa text/html, application/xml oder application/xhtml+xml.

Unterschied: Die XML-Deklaration und die Zeichenkodierung

Das allererste, was am Anfang eines XHTML-Dokument notiert werden sollte, das als XML verarbeitet werden soll, ist eine so genannte XML-Deklaration. Damit geben Sie an, dass das folgende Dokument XML-gerechte Daten enthält. Außerdem können Sie in dieser ersten Zeile bereits die Zeichenkodierung der nachfolgenden Daten angeben. Eine solche Deklaration gibt es in HTML nicht, sie ist also XHTML-spezifisch.

<?xml version="1.0" encoding="UTF-8" ?>
<!-- restliche XML-Datei folgt ab hier -->

Die XML-Deklaration ist eine besondere, alleinstehende Auszeichnung, die in der ersten Zeile eines XML-Dokuments stehen muss. Das erste und letzte Zeichen innerhalb der spitzen Klammern < und > ist ein Fragezeichen. Unmittelbar hinter dem Anfangsfragezeichen muss xml (kleingeschrieben) stehen. Dahinter können in Form von Attributen verschiedene Angaben folgen.

Das version-Attribut ist obligatorisch und deshalb auch in der einfachen Variante erforderlich. Die Versionsnummer bezieht sich auf die Version der Sprachspezifikation von XML. Verwenden Sie die Angabe 1.0, wenn Sie keine besonderen Gründe dafür haben, die ebenfalls mögliche Angabe 1.1 zu wählen.

Beim Attribut encoding können Sie die Zeichenkodierung angeben, nach der das XHTML-Dokument zu verarbeiten ist. Die Angabe utf-8 ist empfehlenswert. Details zum Thema Zeichenkodierung werden im Buchabschnitt Zeichenkodierung in HTML behandelt.

Unterschied: Dokumenttyp-Deklaration

XHTML 1.0 und HTML 4.0(1) haben unterschiedliche Dokumenttyp-Deklarationen. Die Dokumenttyp-Deklaration (der Doctype) nimmt Bezug auf die DTD (Dokumenttyp-Definition) und Sprachversion, die Sie im Dokument verwenden und an deren Regeln Sie sich halten. Mit XHTML5 ändert sich die Lage insofern, als XHTML5 gar keine Dokumenttyp-Deklaration mehr fordert — aus dem einfachen Grund, weil für XHTML5 gar keine DTD existiert. XHTML5 ist lediglich eine XML-gerechte Variante von HTML5. Und HTML5 basiert nicht mehr auf Markup-Dokumenttyp-Deklarationen, sondern auf DOM-Datenstrukturen.

Nachfolgendes Beispiel zeigt den Beginn eines typischen XHTML1.0-Dokuments

<?xml version="1.0" encoding="UTF-8" ?>
<!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">
<!-- usw. -->

In XHTML5 entfällt die Dokumenttyp-Deklaration:

<?xml version="1.0" encoding="UTF-8" ?>
<html xmlns="http://www.w3.org/1999/xhtml">
<!-- usw. -->

Unterschied: HTML-Wurzelelement mit Namensraumangabe

Das einleitende <html>-Tag hat in HTML meistens keine Attribute. In XHTML müssen Sie jedoch den Namensraum für XHTML explizit angeben.

<html xmlns="http://www.w3.org/1999/xhtml">
<!-- Inhalt des Dokuments -->
</html>

Notieren Sie in XHTML im einleitenden <html>-Tag immer das Attribut xmlns, das einen XML-Namensraum bezeichnet, und weisen Sie ihm den Wert http://www.w3.org/1999/xhtml zu. Das Attribut xmlns gehört übrigens nicht zum Sprachumfang von HTML, sondern ist ein allgemeines XML-Attribut.

Unterschied: Kleinschreibung

In HTML ist es egal, ob Sie <TABLE CLASS="border">, <TABLE class="border"> oder <Table Class="border"> notieren. HTML unterscheidet bei Namen von HTML-Elementen und Attributnamen nicht zwischen Groß- und Kleinschreibung. Nur bei der Wertzuweisung an manche Attribute wird Groß-/Kleinschreibung unterschieden — aber auch nur im Hinblick auf andere Sprachen. Bei Attributen mit festen erlaubten Werten, wie etwa shape bei Image-Maps, ist es egal, ob Sie RECT oder rect als Wert zuweisen. Nicht so bei XHTML. XML unterscheidet nämlich strikt zwischen Groß- und Kleinschreibung. Das bedeutet, <TABLE> ist etwas anderes als <table>. Für XHTML wurde festgelegt, dass alle Elementnamen und Attributnamen klein geschrieben werden. Das Gleiche gilt auch für die festen Wertzuweisungen wie rect.

Unterschied: Leere Elemente

In HTML gibt es diverse leere Elemente. Das Abschluss-Tag ist deshalb verboten, weil die Elemente als inhaltsleer definiert sind. Beispiele:
<img>, <br>, <input>, <hr>.
In XML-basierten Sprachen, also auch in XHTML, müssen solche leeren Elemente gesondert gekennzeichnet werden.

Was in HTML so aussieht:

<p>Text mit<br>Zeilenumbruch</p>
<p><img src="bild.png" alt="ein Bild"></p>

… wird in XHTML typischerweise so notiert:

<p>Text mit<br />Zeilenumbruch</p>
<p><img src="bild.png" alt="ein Bild" /></p>

Notieren Sie unmittelbar vor der schließenden spitzen Klammer des alleinstehenden Tags einen Schrägstrich, sodass am Ende die Zeichenfolge /> steht. Vor dem Schrägstrich sollte ein Leerzeichen stehen, um die Funktionalität in alten Browsern zu gewährleisten. Alternativ dazu können Sie auch ein Element mit Anfangs- und End-Tag notieren, z.B. <br></br>. Dabei darf jedoch nichts, auch kein Leerzeichen und kein Zeilenumbruch, zwischen dem Anfangs- und dem End-Tag stehen, andernfalls entsteht ungültiges XHTML.

Unterschied: Elemente mit optionalem Abschluss-Tag

In HTML dürfen einige Elemente historisch bedingt trotz Elementinhalt ohne Abschluss-Tag notiert werden, auch wenn das aus heutiger Sicht keineswegs mehr empfehlenswert ist. Beispiele solcher Elemente sind <body>, <p>, <td>, <dd>, <dt> oder <option>. In XHTML sind Abschluss-Tags bei Elementen mit Inhalt dagegen immer Vorschrift.
HTML darf (leider) auch so aussehen:

<select name="Auswahl" size="1">
  <option>1. Eintrag
  <option>2. Eintrag
</select>

In XHTML muss ein solches Konstrukt immer so aussehen:

<select name="Auswahl" size="1">
  <option>1. Eintrag</option>
  <option>2. Eintrag</option>
</select>

Unterschied: Attributwerte in Anführungszeichen

In HTML dürfen Sie Attributen Werte zuweisen, ohne diese mit Hochkommata zu umschließen — auch wenn das nicht empfehlenswert ist. In XHTML sind die Hochkommata jedoch zwingend erforderlich.

In HTML ist es erlaubt zu notieren:

<a id=anker>Anker</a>

XHTML dagegen schreibt vor:

<a name="anker">Anker</a>

Unterschied: Alleinstehende (leere) Attribute

In HTML gibt es einige Attribute, die keine Wertzuweisung erhalten. Beispiele:
checked, readonly, disabled, multiple oder defer.

In XML-basierten Sprachen dagegen muss allen Attributen ein Wert zugewiesen werden. Da aleinstehende Attribute nur einen möglichen Wert annehmen können, hat man sich darauf verständigt, als Wert einfach den Attributnamen zu nehmen. Notieren Sie in XHTML also:
checked="checked", readonly="readonly", disabled="disabled", multiple="multipe" oder defer="defer".

Unterschied: Leerraum in Attribut-Wertzuweisungen

Bei Wertzuweisungen an Attribute müssen Sie in XHTML besser aufpassen als in HTML. Leerzeichen sind erlaubt wo erforderlich, doch Zeilenumbrüche sollten Sie vermeiden.
Empfohlenes XHTML 1.0 ist:

<p title="Anfang der Geschichte">Text Text Text</p>

Problematisch ist dagegen:

<p title="Anfang
der
Geschichte">Text Text Text</p>

Unterschied: Verweise zu Ankern

In HTML können Sie Verweise zu Ankern notieren, die mit einem name-Attritut definiert sind, z.B. <a href="#anker">Verweis</a>, wobei der Zielanker mit <a name="anker">irgendwas</a> ausgezeichnet ist. Auch andere Attribute verwenden diese Technik in HTML, wie etwa das usemap-Attribut beim img-Element zum Verweis auf ein map-Element, bei dem ein entsprechendes name-Attribut notiert ist.

In XML-verarbeiteten XHTML funktionieren solche Verweise nicht. XML benötigt zwingend das globale Attribut id für Anker. Allerdings ist es seit Version 4.0 auch in HTML so, dass Elemente mit id-Attribut Anker darstellen, z.B. <h2 id="ueberschrift_2">Überschrift</h2>. Insofern ist es aus heutiger Sicht sinnvoll, Verweiszielanker innerhalb von Dokumenten vorzugsweise mit dem id-Attribut auszuzeichnen.

Unterschied: Das lang-Attribut

XML-basierte Sprachen benutzen normalerweise anstelle von lang das XML-Universalattribut xml:lang. Da das lang-Attribut in XHTML jedoch ebenfalls zur Verfügung steht, existieren also zwei Attribute für die gleiche Sache. XHTML-Parser bevorzugen im Zweifelsfall das Attribut xml:lang, das aber von reinen HTML-Parsern nicht erkannt wird. Notieren Sie deshalb in XHTML am besten beide Varianten, wenn Sie lang verwenden.

In HTML genügt also:

<p lang="de">...</p>

In XHTML ist es sinnvoll zu notieren:

<p lang="de" xml:lang="de">...</p>

Unterschied: Inhalt von Script- und Style-Bereichen

In HTML wird der Inhalt der Elemente script und style vom HTML-Parser nicht beachtet, während ein XML-Parser in XHTML die Inhalte dieser Elemente wie alle anderen Elementinhalte interpretiert. Im Klartext bedeutet das, dass bei HTML innerhalb eines Script-Bereichs oder Style-Bereichs HTML-eigene Zeichen wie <, >, & und " nicht maskiert werden müssen. Nicht so in XHTML. Wenn Sie beispielsweise in einem JavaScript innerhalb einer Bedingung vergleichen, ob ein Wert kleiner oder größer als ein anderer Wert ist, müssen Sie die spitzen Klammern außerhalb einer Zeichenkette notieren und können sie daher an der Stelle auch nicht maskieren. Um das Problem zu lösen, können Sie das Script in einen sogenannten CDATA-Abschnitt anschließen. Dies ist eine XML-typische Notation.

Da XML-Parser HTML-Kommentare (und damit auch den enthaltenen JavaScript-Code) entfernen dürfen, sollte auf die früher übliche Auskommentierung des Scripts verzichtet werden, die für die heute verwendeten Browser auch nicht mehr erforderlich ist.

Beispiel für HTML:

<script>
  /* JavaScript-Kommentar: jetzt folgt ein kleines Script */
  if (parseInt(navigator.appVersion) < 5)
    alert("Oh, ein sehr alter Browser");
  /* und damit ist das Script auch schon zu ende */
</script>

Entsprechendes Beispiel für XHTML:

<script type="text/javascript">
/* <![CDATA[ */
  /* JavaScript-Kommentar: jetzt folgt ein kleines Script */
  if (parseInt(navigator.appVersion) < 5)
    alert("Oh, ein sehr alter Browser");
  /* und damit ist das Script auch schon zu ende */
/* ]]> */
</script>

Der CDATA-Abschnitt beginnt mit <![CDATA[ und endet mit ]]>. Ohne diese Umklammerung würde ein XML-Parser das <-Zeichen innerhalb des Scripts als Fehler ankreiden. Damit der Browser die Anfang- und Endmarkierung des CDATA-Abschnitts nicht als JavaScript-Code zu interpretieren versucht, werden sie durch JavaScript-Kommentare vor ihm versteckt. Den Inhalt von style-Elementen können Sie ebenso umschließen und analog die Markierungen mit CSS-Kommentaren vor dem CSS-Parser verbergen.

Um Fehler bei JavaScript-Interpretern zu vermeiden, bleibt außerdem die Möglichkeit, JavaScript in separaten Dateien zu notieren. Auch bei Stylesheets besteht die Möglichkeit, Formate zentral in einer separaten CSS-Datei zu definieren.

Unterschied: Ausnahmen von Verschachtelungsregeln

In der Dokumenttyp-Definition von HTML 4.01 sind einige Ausnahmen bei Verschachtelungsregeln für Elemente definiert. Dies ist beispielsweise bei dem a-Element nötig, das kein anderes a-Element enthalten darf. Die DTD kann zwar festgelegen, dass ein a-Element nicht direkt ein a-Element enthalten darf, sodass <a><a>…</a></a> nicht erlaubt ist. Ein a-Element darf jedoch andere Elemente enhalten, die ihrerseits ein a-Element enthalten dürfen, z.B. span. In diesem Fall greifen die normalen Regeln nicht und es ist eine Ausnahmeregel nötig, um z.B. <a><span><a>…</a></span></a> zu verbieten.

Mit Hilfe von SGML ist die Formulierung solcher Ausnahmen möglich. So ist beispielsweise festgelegt, dass ein a-Element auch als indirektes Kindelement kein anderes a-Element enthalten darf. XML dagegen bietet keine Möglichkeit, solche Ausnahmen zu formulieren. In den XML-basierten Dokumenttyp-Definitionen von XHTML fehlen solche Verschachtelungsverbote daher. Somit ist z.B. <a><a>…</a></a> gemäß den Regeln der DTDs von XHTML zunächst erlaubt. Um eine möglichst hunderprozentige Kompatibilität zwischen HTML und XHTML zu erreichen, blieb dem W3-Konsortium nur der Ausweg, solche Verschachtelungsverbote verbal als „normativen Anhang“ zu den DTDs zu erklären.

In HTML5 ist das allerdings auch nicht anders. Da HTML5 nicht mehr DTD-basiert ist, liegen Ausnahmeregeln bei Elementverschachtelungen dort ebenfalls nicht maschinenlesbar vor.

 


Korrekturen, Hinweise und Ergänzungen
Bitte scheut euch nicht und meldet, was auf dieser Seite sachlich falsch oder irreführend ist, was ergänzt werden sollte, was fehlt usw. Dazu bitte oben aus dem Menü Seite den Eintrag Diskutieren wählen. Es ist keine Anmeldung erforderlich, um Anmerkungen zu posten. Unpassende Postings, Spam usw. werden allerdings kommentarlos entfernt.

Unless otherwise stated, the content of this page is licensed under Creative Commons Attribution-ShareAlike 3.0 License