Att leverera HTML & XHTML

Denna artikel beskriver kortfattat några aspekter på hur XHTML sändes fråm en server till ett användarprogram (t.ex. webbläsare), och hur vanligt förekommande användarprogram använder den uppmärkta text de mottar. Den beskriver implementationsspecifika frågor snarare än W3C-standarder.

Sådana aspekter har en direkt bäring på hur man deklarerar teckenkodning för HTML- eller XHTML-dokument. Denna information är också användbar för att förklara varför formattering med CSS inte alltid ger det som man förväntade sig, eller varför det blir olika resultat i olika användarprogram.

MIME-typer

När en server levererar (dvs sänder) ett dokument till en webbläsare så sänds också en del extra information tillsammans med dokumentet, vilket kallas HTTP huvud.

Det så kallade Content-Type-fältet i HTTP-huvudet beskriver vilket dataformat som används. Denna information uttrycks med hjälp av en MIME media typ. Nedan följer ett exempel på ett HTTP-huvud för en HTML-fil som använder MIME-typen text/html. Lägg märke till att Content-Type-fältet också kan tala om vilken teckenkodning dokumentet är uttryckt i.

HTTP/1.1 200 OK
Date: Wed, 05 Nov 2003 10:46:04 GMT
Server: Apache/1.3.28 (Unix) PHP/4.2.3
Content-Location: CSS2-REC.en.html
Vary: negotiate,accept-language,accept-charset
TCN: choice
P3P: policyref=http://www.w3.org/2001/05/P3P/p3p.xml
Cache-Control: max-age=21600
Expires: Wed, 05 Nov 2003 16:46:04 GMT
Last-Modified: Tue, 12 May 1998 22:18:49 GMT
ETag: "3558cac9;36f99e2b"
Accept-Ranges: bytes
Content-Length: 10734
Connection: close
Content-Type: text/html; charset=utf-8
Content-Language: en

För HTML-filer väljs normalt MIME-typen text/html. Då en webbläsare tar emot en fil av denna MIME-typ, så gör den antagandet att uppmärkningen används enligt HTML-syntax, och den kommer att använda en HTML-parser för att tolka vad uppmärkningen i dokumentet betyder.

Till skillnad från HTML är XHTML ett uppmärkningsspråk baserad på XML. Syntaxen för XML skiljer sig något från HTML-syntaxen, och en XML-processor ger felanmärkning om du använder syntaxen på ett ogiltigt sätt. Vid utveckling av XML-baserat innehåll läggs stor vikt på att uppmärkningen är välformad och giltig, och man kan bearbeta innehållet med alla de verktyg, data och automatiserade processer som finns i XML-världen. Många utvecklare föredrar att använda XHTML, eftersom XML:s strikta definition möjliggör ett antal fördelarna vad gäller skapande och uppdatering av dokument, liksom automatiserad behandling av dessa.

För att skicka XHTML-dokument till en webbläsare tillsammans med en MIME-typ som säger att detta är XML, så måste du använda en av följande MIME-typer: application/xhtml+xml, application/xml eller text/xml. W3C rekommenderar att man bara använder den första av dessa MIME-typer då man levererar XHTML som XML – dvs application/xhtml+xml.

När en webbläsare läser XML, så använder den en XML-parser, inte en HTML-parser.

Tyvärr kan Internet Explorer, i versioner upp t.o.m. 8, inte hantera filer som levereras som XML. Men det finns ett flertal andra webbläsare som klarar av detta. För att komma runt problemet att inte alla webbläsare kan stödja XML-baserat innehåll, så levereras många XHTML-filer med MIME-typ text/html. I dessa fall kommer webbläsaren att läsa filen som om det var HTML, och alltså använda en HTML-parser.

Eftersom webbläsaren då behandlar XML som om det vore HTML, så måste man, när man skapar detta innehåll, ta hänsyn till skillnaderna mellan dessa två format, så att skillnaderna mellan XML och HTML inte får webbläsaren att bli lurad. Bland annat handlar det om olika sätt att deklarera teckenkodning eller språkdeklarationer i dokumentet.

Appendix C av specifikationen för XHTML rekommenderar att man följer en liten uppsättning kompatibilitetsriktlinjer då man levererar XHTML som HTML. Dessa riktlinjer är speciellt viktiga för äldre versioner av webbläsare. De rekommenderar t.ex. att man ser till att ha ett blanktecken före tecknen '/>' vid slutet av tomma taggar (såsom img, hr eller br), att man använder både HTML:s attribut lang och XML:s attribut xml:lang, att använder båda attributen id och name i fragmentidentifierare.

'Standards' vs 'Quirks' modes

Dagens populära webbläsare kan visa HTML-dokument antingen i s.k. standards mode eller i s.k. quirks mode. Detta betyder att olika uppsättningar presentationsregler kommer att användas i dessa två olika fall – 'standards mode' gör att filen behandlas enligt W3C:s standarder, och 'quirks mode' gör att den försöker återskapa det avvikande beteende som gamla webbläsare har.

I de senaste versionerna av alla vitt spridda webbläsare aktiveras 'standards mode' då det mottagna dokumentet har en DOCTYPE-deklaration. Om det inte finns en DOCTYPE-deklaration så kan ett och samma dokument visas upp på olika sätt i olika webbläsare.

Skärmdumparna nedan illustrerar några av skillnaderna.

Bild av fil visat i standards mode.
Ett dokument visat i 'standards mode'.
Bild av fil visad i quirks mode.
Samma dokument visat i 'quirks mode'.

Klicka på bilderna om du vill se de verkliga HTML-sidorna. Om använder Internet Explorer så kommer du att få se motsvarande effekter.

De två bilderna visar två sidor med exakt samma uppmärkning och CSS-formattering, med ett undantag. Den enda skillnaden i källformatet för dessa två filer är att den till vänster inleds med en DOCTYPE-deklaration, medan den andra inte gör det. En fil med en lämplig DOCTYPE-deklaration skall i normala fall visas i 'standards mode' i moderna versioner av de flesta webbläsare. Om DOCTYPE saknas, så används 'quirks mode'.

De visuella skillnaderna illustrerade ovan beror på följande skillnader i implementering i webbläsare som Internet Explorer:

Den ursprungliga avsikten med DOCTYPE är att ange definitionen av det använda uppmärkningsspråket. Följande visar källtexten med DOCTYPE-deklarationen högst upp (betonad som röd kursiv text).

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
	  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xml:lang="en" lang="en" xmlns="http://www.w3.org/1999/xhtml"> 
<head> 
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 
    <title>XHTML document</title> 
    <style type="text/css">
    body { background: white; color: black; font-family: arial, sans-serif; font-size: 12px; }
    p { font-size: 100%; }
    h1 { font-size: 16px; }
    div { margin: 20px; width: 170px; padding: 50px; border: 6px solid teal; }
    table { border: 1px solid teal; }
    </style> 
    </head> 

<body> 
    <h1>Test file for Standards/Quirks</h1> 
    <div>
        A div with CSS width:170px, margin:20px, padding:50px and border:6px.
        </div> 
    <p>Text in a p element.</p>
    <table> 
        <tr><td>Text in a table.</td></tr> 
        </table>
    </body> 
</html> 
	

Webbläsare som behandlar dokument på olika sätt enligt ovan, kallas ofta DOCTYPE-bytande.

Rent allmänt är det en bra ide att alltid leverera dina sidor i 'standards mode' – dvs ange alltid en DOCTYPE-dellaration.

XML-deklarationen och DOCTYPE:er

Det finns en aspekt på användning av DOCTYPE som är av kritisk betydelse för hur teckenkodning deklareras och för att uppnå förutsägbar presentation.

Eftersom XHTML 1.0 baseras på XML, så kan man lägga till en XML-deklaration i början av uppmärkningen, även om innehållet levereras som HTML. Detta får den inledande delen av filen ovan att se ut som följder (XML-deklarationen betonas med röd kursiv text):

<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
	  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xml:lang="en" lang="en" xml‎ns="http://www.w3.org/1999/xhtml">
<head>
...

I webbläsare som Internet Explorer 7, Firefox, Safari, Opera, Google Chrome och andra, så kommer en sida som levereras med en DOCTYPE-deklaration att visas i 'standards mode', oavsett om sidan har en XML-deklaration eller ej.

För Internet Explorer 6 gäller dock att om det i sidan finns något före DOCTYPE-deklarationen och detta inte är en byte-ordings-markering (byte-order mark) så kommer sidan att visas i 'quirks mode'.

Om den del, av dina avsedda användare, som använder sig av Internet Explorer 6 är tillräckligt stor så kan detta webläsarbeteende skapa problem. Om du vill säkerställa att dina sidor visas på samma sätt som sker i webbläsare som följer standard, så bör du ha en tydlig strategi för hur du hanterar detta.

Om det är så att dina dokument inte innehåller sådan uppmärkning som skapar olika beteende i 'standards mode' resp. 'quirks mode', så behöver man naturligtvis inte vidtaga några åtgärder. Men om sådana skillnader kan uppstå med dina sidor, så måste du antingen anpassa din CSS, eller utelämna XML-deklarationen.

Lägg märke till att om du beslutar dig för att utelämna XML-deklarationen, så bör du välja antingen UTF-8 eller UTF-16 som teckenkodning av sidan. (Se Declaring character encodings in HTML för mer information om effekter av teckenkodning.)