3 Over SGML en HTML

Inhoud

  1. Introductie SGML
  2. SGML constructies in HTML
    1. Elementen
    2. Attributen
    3. Karakter referentie
    4. Opmerkingen
  3. Hoe de HTML DTD lezen
    1. DTD opmerkingen
    2. Parameter entiteit definities
    3. Element definities
    4. Attribuut definities

Deze sectie van het document introduceert SGML en omschrijft de relatie met HTML. Een complete omschrijving van SGML is terug te vinden in de standaard (bekijk [ISO8879]).

3.1 Introductie SGML

SGML is een systeem om opmaaktalen te definiëren. Auteurs maken hun documenten op door structurele, presentationele en semantische informatie naast de inhoud te plaatsen. HTML is een voorbeeld van een opmaaktaal. Hier is een voorbeeld van een HTML document:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
     "http://www.w3.org/TR/html40/strict.dtd">
<HTML>
   <HEAD>
      <TITLE>Mijn eerste HTML document</TITLE>
   </HEAD>
   <BODY>
      <P>Hallo wereld!
   </BODY>
</HTML>

Een HTML document wordt verdeeld in een "kop" of head (hier tussen <HEAD> en </HEAD>) en een "lijf" of body (hier tussen <BODY> en </BODY>). De titel van het document verschijnt in de head (samen met andere informatie over het document), en de inhoud van het document verschijnt in de body. De body in dit voorbeeld bevat slechts één paragraaf, gemarkeerd met <P>.

Elke opmaaktaal die gedefinieerd wordt in SGML wordt een SGML toepassing of applicatie genoemd. Een SGML applicatie wordt algemeen gekarakteriseerd door:

  1. Een SGML definitie. De SGML definitie specifieert welke karakters en afbakeningstekens kunnen voorkomen in de applicatie.
  2. Een document type definitie (DTD). De DTD definieert de syntax van de opmaakconstructie. De DTD kan extra definities zoals karakter referenties bevatten.
  3. Een specificatie die de semantiek omschrijft die wordt toegewezen aan de opmaak. Deze specificatie verondersteld ook syntax beperkingen die niet uitgedrukt kunnen worden binnen de DTD.
  4. Document onderdelen die data (inhoud) en opmaak bevatten. Elk onderdeel bevat een referentie naar de DTD die gebruikt moet worden om ze te interpreteren.

De specificatie bevat eveneens een SGML definitie, drie document type definities (bekijk het deel over HTML versie informatie voor een omschrijving van de drie), en een lijst van karakter referenties.

3.2 SGML constructies in HTML

De volgende secties introduceren SGML constructies die in HTML gebruikt worden.

De appendix geeft enkele SGML kenmerken die niet algemeen ondersteund worden door HTML tools en User Agents en daarom beter vermeden kunnen worden.

3.2.1 Elementen

Een SGML document type definitie omschrijft element types die structuren of gewenst gedrag representeren. HTML bevat element types die paragrafen, hypertext links, lijsten, tabellen, figuren, enz. representeren.

Elk element type definitie omschrijft in het algemeen drie stukken: een start tag, inhoud en een eind tag.

De naam van het element verschijnt in de start tag (geschreven als <element-naam>) en de eind tag (geschreven als </element-naam>); merk op dat er een slash voor de element-naam staat in de eind tag. Bijvoorbeeld: de start en eind tags van het UL element type bakenen de items van een lijst af:

<UL>
<LI><P>...item 1...
<LI><P>...item 2...
</UL>

Sommige HTML element types laten auteurs toe om eind tags weg te laten (zoals de P en LI element types). Een paar element types laten ook toe om de start tag weg telaten; bijvoorbeeld, HEAD en BODY. De HTML DTD geeft voor elk element type aan of de start en eind tag vereist zijn.

Sommige HTML element types hebben geen inhoud. Bijvoorbeeld het line break element BR heeft geen inhoud. de enige opdracht ervan is het beëndigen van een tekst met een lijn. Zulke lege elementen hebben nooit eind tags. De document type definitie en de tekst van de specificatie geven aan of een element type leeg is (geen inhoud heeft) of, als het een inhoud kan hebben, welke dan als geldig beschouwd wordt.

Element namen zijn altijd case-insensitive (ze mogen uit kleine of hoofdletters bestaan).

Raadpleeg de SGML standard voor informatie over regels betreffende elementen (zoals bijvoorbeeld dat ze op de juiste manier genest moeten worden, een eind tag sluit bij een overeenkomstige start tag, alle ongesloten tussenliggende start tags met genegeerde eind tags (sectie 7.5.1), enz.).

Bijvoorbeeld de volgende paragraaf:

<P>Dit is de eerste paragraaf.</P>
...een block element...

kan herschreven worden zonder zijn eind tag:

<P>Dit is de eerste paragraaf.
...een block element...

omdat de <P> start tag gesloten wordt door het volgende block element. Hetzelfde geldt wanneer een paragraaf ingesloten is door een block element, zoals in:

<DIV>
<P>Dit is de paragraaf.
</DIV>

De eind tag van het omsluitende block element (hier, </DIV>) impliceert de eind tag van de open <P> start tag.

Elementen zijn geen tags. Sommige mensen refereren naar elementen als ware het tags (bijvoorbeeld, "de P tag"). Onthoudt dat het element één ding is, en de tag een ander.(of het nu een start of een eind tag is) Bijvoorbeeld het HEAD element is altijd aanwezig, zelfs als zowel start en eind tag ontbreken in de opmaak.

Alle element types gedefinieerd in deze specificatie zijn opgenomen in de element index.

3.2.2 Attributen

Elementen kunnen geassocieerde eigenschappen hebben die attributen genoemd worden. Deze attributen kunnen bepaalde waarden hebben (standaard waarden of waarden geset door auteurs of scripts). "Attribuut en waarde"-paren verschijnen voor het afsluitende ">" van een element start tag. Eender welk aantal (legale) "attribuut en waarde"-paren gescheiden door spaties mogen voorkomen in een start tag van een element. Ze mogen in elke volgorde verschijnen.

In dit voorbeeld wordt het id attribuut van een H1 element geset:

<H1 id="sectie1">
Dit is een geïdentificeerde heading dankzij het id attribuut
</H1> 

Standaard vereist SGML dat alle attributenwaarden omsloten worden door ofwel dubbele aanhalingstekens (ASCII decimaal 34) of enkele aanhalingstekens (ASCII decimaal 39). Enkele aanhalingstekens kunnen in een attribuutwaarde opgenomen worden wanneer de waarde omsloten wordt door dubbele aanhalingstekens en vice versa. Auteurs kunnen ook gebruik maken van numerieke karakter referenties om dubbele aanhalingstekens (&#34;) en enkele aanhalingstekens (&#39;)weer te geven. Voor dubbele aanhalingstekens kunnen auteurs ook gebruik maken van de karakter entiteit referentie &quot;.

In sommige gevallen mogen auteurs de waarde van een attribuut geven zonder aanhalingstekens. De attribuutwaarde mag dan alleen letters (a-z en A-Z), cijfers (0-9), koppeltekens (ASCII decimaal 45), punten (ASCII decimaal 46), onderstrepen (ASCII decimaal 95) en dubbele punten (ASCII decimaal 58) bevatten. We raden aan om de aanhalingstekens ook te gebruiken wanneer het mogelijk is om ze weg te laten.

Attribuutnamen zijn altijd hoofdletterongevoelig. (ze mogen uit hoofdletters of kleine letters bestaan)

Attribuutwaarden zijn in het algemeen hoofdletterongevoelig. De definitie van elke attribuut in de referentie geeft aan of de waarde hoofdlettergevoelig is of niet.

Al de attributen die door deze specificatie gedefinieerd worden zijn opgenomen in de attribuut index.

3.2.3 Karakter referentie

Karakter referenties zijn numerieke of symbolische namen voor karakters die opgenomen mogen worden in een HTML document. Ze zijn nuttig om te verwijzen naar zelden gebruikte karakters of naar karakters die door tools moeilijk of onmogelijk in te geven zijn. Je zal karakter referenties in dit hele document zien; ze beginnen met een "&" teken en eindigen met een punt-komma (;). Enkele veel voorkomende voorbeelden zijn:

We bekijken de HTML karakter referentie later in detail in het deel over de HTML document karakter set. De specificatie bevat ook een lijst van karakter referenties die kunnen voorkomen in HTML 4.01 documenten.

3.2.4 Opmerkingen

HTML opmerkingen hebben de volgende syntax:

<!-- dit is een opmerking -->
<!-- en dit is een opmerking
    die meer dan een regel inneemt -->

Witte ruimte tussen de openende afsluiter ("<!") en de opmerking open afsluiter ("--") is niet toegestaan, maar is wel toegestaan tussen de opmerking sluitende afsluiter ("--") en de afsluitende afsluiter (">"). Een veel voorkomende fout is het opnemen van een reeks koppeltekens ("---") in een opmerking. Auteurs zouden twee of meer aaneengrenzende koppeltekens binnen een opmerking moeten vermijden.

Informatie tussen de opmerkingstekens heeft geen speciale betekenis. (bijvoorbeeld de karakter referenties worden niet als dusdanig geïnterpreteerd.).

Merk op dat opmerkingen opmaak zijn.

3.3 Hoe de HTML DTD lezen

Elke element en attribuut definitie in deze specificatie is vergezeld van zijn document type definitie fragment. We hebben gekozen om de DTD fragmenten in de specificatie toe te voegen in plaats van te zoeken naar een meer toegankelijke, maar langere en minder precieze vorm van omschrijven van de eigenschappen van een element. De volgende uitleg zou lezers die onbekend zijn met SGML moeten toelaten om de DTD te lezen en de technische details van de HTML specificatie te begrijpen.

3.3.1 DTD opmerkingen

In DTD's kunnen opmerkingen over meerdere regels verspreid zijn. In de DTD worden opmerkingen afgesloten door een paar "--" tekens zoals bijvoorbeeld

<!ELEMENT PARAM - O EMPTY       -- waarde van een parameter -->
In dit geval legt de opmerking "waarde van een parameter" het gebruik van het PARAM element type uit. Opmerkingen in de DTD zijn enkel informatief.

3.3.2 Parameter entiteit definities

De HTML DTD begint met een reeks parameter entiteit definities. Een parameter entiteit definitie definieert een soort macro die elders in de DTD berefereerd en geëxpandeerd kan worden. Deze macro's mogen niet verschijnen in HTML documenten. Enkel in de DTD zijn ze toegestaan. Andere types macro's, karakter referenties genoemd, mogen in de tekst van een HTML document of binnen de attribuutwaarden gebruikt worden.

Wanneer er naar de parameter entiteit gerefereerd wordt in de DTD, dan wordt het geëxpandeerd in een string.

Een parameter entiteit definitie begint met het sleutelwoord <!ENTITY % gevolgd door de entiteitsnaam, een string tussen aanhalingstekens en tenslotte een afsluitend > teken. Een aantal parameter entiteiten in een DTD begin met een "%" teken, gevolgd door de parameter entiteit naam en afgesloten door een optioneel ";" teken.

Het volgende voorbeeld definieert de string waarnaar de "%fontstyle;" entiteit zal expanderen.

<!ENTITY % fontstyle "TT | I | B | BIG | SMALL">

De string waarnaar de parameter entity expandeerd kan op zijn beurt andere parameter entiteitsnamen bevatten. Deze namen worden verder recursief geëxpandeerd. In het volgende voorbeeld wordt de "%inline;" parameter entiteit gedefinieerd om de "%fontstyle;", de "%phrase;", de "%special;" en de "%formctrl;" parameter entiteiten te bevatten.

<!ENTITY % inline "#PCDATA | %fontstyle; | %phrase; | %special; | %formctrl;">

De volgende twee DTD entiteiten zal je regelmatig terugvinden in de HTML DTD: "%block;" "%inline;". Ze worden respectievelijk gebruikt wanneer het inhoudsmodel block-level en inline elementen bevat. (gedefinieerd in het deel over de globale structuur van een HTML document).

3.3.3 Element definities

Het grootste stuk van de HTML DTD bestaat uit de definities van element types en hun attributen. Het <!ELEMENT sleutelwoord begint een definitie en het > teken beëindigd het. Tussen deze zijn de volgende zaken gespecificeerd:

  1. De elementnaam.
  2. Of de elementtags al dan niet optioneel zijn. . Twee koppeltekens na de elementnaam betekent dat de start en eind tags verplicht zijn. Eén koppelteken gevolgd door de letter O geeft aan dat de eind tag weggelaten (o=optioneel) kan worden. Een paar O's geeft aan dat zowel de start als de eindtags weggelaten kunnen worden.
  3. De inhoud van het element, als deze er is. De toegestane inhoud voor een element wordt inhoudsmodel genoemd. Element types die ontworpen werden zonder inhoud worden lege elementen genoemd. Het inhoudsmodel voor zulke elementen is gedefinieerd met het sleutelwoord "EMPTY".

In dit voorbeeld:

    <!ELEMENT UL - - (LI)+>

Dit voorbeeld illustreert de definitie van een leeg element type:

    <!ELEMENT IMG - O EMPTY>

Inhoudsmodel definities 

Het inhoudsmodel omschrijft wat de inhoud van een bepaald element type kan zijn. Inhoudsmodel definities kunnen de volgende zaken inhouden:

Het inhoudsmodel van een element is gespecificeerd met de volgende syntax. Noteer dat de lijst hieronder een vereenvoudiging is van de volledige SGML syntax regels en geen rekening houdt met bijvoorbeeld prioriteitsregels.

( ... )
Sluit een groep af.
A
A moet één keer voorkomen.
A+
A moet één of meerdere keren voorkomen.
A?
A moet nul of één keer voorkomen.
A*
A mag nul of meer keer voorkomen.
+(A)
A mag voorkomen.
-(A)
A mag niet voorkomen.
A | B
Ofwel A ofwel B moet voorkomen, maar niet beiden tegelijk.
A , B
Zowel A als B moeten in deze volgorde voorkomen.
A & B
Zowel A als B moeten in willekeurige volgorde voorkomen.

Hier zijn enkele voorbeelden van de HTML DTD:

   <!ELEMENT UL - - (LI)+>

Het UL element moet één of meer LI elementen bevatten.

   <!ELEMENT DL    - - (DT|DD)+>

Het DL element moet één of meer DT of DD elementen in willekeurige volgorde bevatten.

   <!ELEMENT OPTION - O (#PCDATA)>

Het OPTION element mag enkel tekst en entiteiten zoals &amp; bevatten -- dit wordt aangegeven door het SGML data type #PCDATA.

Een aantal HTML element types gebruiken een bijkomende SGML eigenschap om elementen uit te sluiten van hun inhoudsmodel. Uitgesloten elementen worden vooraf gegaan door een koppelteken. Expliciete uitsluitingen zijn sterker dan toegestane elementen.

In dit voorbeeld betekent -(A) dat het element A niet kan voorkomen in een ander A element (dit wil zeggen dat ankers niet genest kunnen worden).

   <!ELEMENT A - - (%inline;)* -(A)>

Merk op dat het A element type een onderdeel van de DTD parameter entiteit "%inline;" is, maar dat het zelf expliciet uitgesloten wordt door -(A).

De volgende element type definitie voor een FORM is gelijkaardig en verbiedt geneste forms:

   <!ELEMENT FORM - - (%block;|SCRIPT)+ -(FORM)>

3.3.4 Attribuut definities

Het <!ATTLIST sleutelwoord begint de definitie van attributen die een element kan hebben. Het wordt gevolgd door de naam van het element waarover het gaat, een lijst van attribuut definities en een afsluitend > teken. Elke attribuut definitie bestaat uit drie stukken die het volgende definiëren:

In dit voorbeeld wordt het naam (name) attribuut gedefinieerd voor het MAP element. Dit attribuut is optioneel voor dit element.

<!ATTLIST MAP
  name        CDATA     #IMPLIED
  >

Het type van waarden die toegestaan zijn voor het attribuut wordt gegeven als CDATA, een SGML data type. CDATA is tekst die een karakter referentie kan bevatten.

Raadpleeg voor meer informatie over "CDATA", "NAME", "ID", en andere data types het deel over HTML data types.

Het volgende voorbeeld illustreert verschillende attribuut definities:

rowspan     NUMBER     1         -- aantal rijen overspannen door de cell --
http-equiv  NAME       #IMPLIED  -- HTTP respons header naam  --
id          ID         #IMPLIED  -- unieke identificatie binnen het document -- 
valign      (top|middle|bottom|baseline) #IMPLIED

Het rowspan attribuut vereist waarden van het type NUMBER. De standaard waarde is expliciet gegeven als "1". Het optionele http-equiv attribuut vereist waarden van het type NAME. Het optioneel id attribuut vereist waarden van het type ID. Het optioneel valign attribuut is beperkt tot de waarden van de set {top, middle, bottom, baseline}.

DTD entiteiten in attribuut definities 

Attribuut definities kunnen ook parameter entiteit referenties bevatten.

In dit voorbeeld zien we dat de attribuut definitie lijst voor het LINK element begint met de "%attrs;" parameter entiteit.

<!ELEMENT LINK - O EMPTY               -- een media-onafhankelijke link -->
<!ATTLIST LINK
  %attrs;                              -- %coreattrs, %i18n, %events --
  charset     %Charset;      #IMPLIED  -- karakter encodering van de gelinkte bron --
  href        %URI;          #IMPLIED  -- URI voor de gelinkte bron --
  hreflang    %LanguageCode; #IMPLIED  -- taal code --
  type        %ContentType;  #IMPLIED  -- advies inhoudstype --
  rel         %LinkTypes;    #IMPLIED  -- relatie met bestemmingstype (voorwaarts) --
  rev         %LinkTypes;    #IMPLIED  -- relatie met startdocument (terugwaarts) --
  media       %MediaDesc;    #IMPLIED  -- voor het weergeven op deze media --
  >

Start tag: vereist, Eind tag: verboden

De "%attrs;" parameter entiteit wordt als volgt gedefinieerd:

<!ENTITY % attrs "%coreattrs; %i18n; %events;">

De "%coreattrs;" parameter entiteit in de "%attrs;" definitie expandeert als volgt:

<!ENTITY % coreattrs
 "id          ID             #IMPLIED  -- unieke identificatie binnen het document --
  class       CDATA          #IMPLIED  -- door spaties gescheiden lijst van classes --
  style       %StyleSheet;   #IMPLIED  -- geassocieerde style info --
  title       %Text;         #IMPLIED  -- adviestitel --"
  >

De "%attrs;" parameter entiteit is gedefinieerd voor het gemak omdat deze attributen gedefinieerd zijn voor de meeste HTML element types.

De DTD definieert de "%URI;" parameter entiteit op gelijkaardige manier zodat ook deze expandeert in de string "CDATA".

<!ENTITY % URI "CDATA"
    -- een Uniform Resource Identifier,
       zie [URI]
    -->

Zoals dit voorbeeld illustreert geeft de parameter entiteit "%URI;" de lezers van de DTD meer informatie over het type van data dat verwacht kan worden voor een attribuut. Gelijkaardige entiteiten zijn gedefinieerd voor "%Color;", "%Charset;","%Length;", "%Pixels;", enz.

Boolean attributen 

Sommige attributen spelen de rol van booleaanse variabelen (bijvoorbeeld het selected attribuut voor het OPTION element). Hun voorkomen in de start tag van een element impliceert dat de waarde van het attribuut "waar" is. Hun afwezigheid impliceert een "vals" waarde.

Boolean attributen mogen legaal één enkele waarde hebben: de naam van het attribuut zelf.(bijvoorbeeld selected="selected").

Dit voorbeeld definieert het selected attribuut als een boolean attribuut.

selected     (selected)  #IMPLIED  -- de optie is vooraf geselecteerd --

Het attribuut wordt geset op "true" door voor te komen in de start tag van het element:

<OPTION selected="selected">
...inhoud...
</OPTION>

In HTML kunnen boolean attributes voorkomen in geminimaliseerde vorm -- de attribuutwaarde verschijnt alleen in de start tag van het element. Zo kan selected geset worden door het volgende te schrijven:

<OPTION selected>

in plaats van:

<OPTION selected="selected">

Auteurs zouden zich er bewust van moeten zijn dat veel User Agents alleen de geminimaliseerde vorm van de boolean attributen herkennen.