3 Sobre SGML y HTML

Nota: Este documento es parte de una traducción al castellano de la Recomendación del W3C "HTML 4.01 Specification" (más información). Puede consultar la versión original del mismo. Para cualquier comentario o corrección acerca de la traducción póngase en contacto con el traductor en jrpozo arroba conclase punto net. Gracias por su colaboración.

Véase el Aviso de copyright de la traducción.

Contenidos

  1. Introducción al SGML
  2. Estructuras SGML usadas en HTML
    1. Elementos
    2. Atributos
    3. Referencias de caracteres
    4. Comentarios
  3. Cómo leer el DTD de HTML
    1. Comentarios DTD
    2. Definiciones de entidades paramétricas
    3. Declaraciones de elementos
    4. Declaraciones de atributos

Esta sección del documento presenta el SGML y habla sobre su relación con HTML. En el estándar puede encontrarse información completa sobre el SGML (ver [ISO8879]).

3.1 Introducción al SGML

El SGML es un sistema para definir lenguajes para dar formato a documentos (markup languages). Los autores utilizan un código de formato (en inglés markup) en sus documentos para representar información estructural, presentacional y semántica junto con el contenido. El HTML es un ejemplo de lenguaje de formato de documentos. Aquí tenemos un ejemplo de un documento HTML:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
     "http://www.w3.org/TR/html4/strict.dtd">
<HTML>
   <HEAD>
      <TITLE>Mi primer documento HTML</TITLE>
   </HEAD>
   <BODY>
      <P>¡Hola mundo!
   </BODY>
</HTML>

Un documento HTML se divide en una sección de cabecera (aquí, entre <HEAD> y </HEAD>) y un cuerpo (aquí, entre <BODY> y </BODY>). El título del documento aparece en la cabecera (junto con otras informaciones sobre el documento), y el contenido del documento aparece en el cuerpo. El cuerpo de este ejemplo contiene únicamente un párrafo, codificado o marcado como <P>.

Cada lenguaje de formato de documentos definido con SGML se llama aplicación SGML. Una aplicación SGML se caracteriza generalmente por:

  1. Una declaración SGML. La declaración SGML especifica qué caracteres y delimitadores pueden aparecer en la aplicación.
  2. Una definición del tipo de documento (document type definition, DTD). El DTD define la sintaxis de las estructuras de formato. El DTD puede incluir definiciones adicionales, tales como referencias a entidades de caracteres.
  3. Una especificación que describe la semántica que se debe conferir al código de formato. Esta especificación también impone restricciones de sintaxis que no pueden expresarse dentro del DTD.
  4. Documentos que contienen datos (contenido) y código (markup). Cada documento contiene una referencia al DTD que debe usarse para interpretarlo.

Esta especificación incluye una declaración SGML, tres definiciones del tipo de documento (ver la sección sobre información sobre la versión de HTML para una descripción de las tres), y una lista de referencias de caracteres.

3.2 Estructuras SGML usadas en HTML

Las secciones siguientes presentan las estructuras de SGML que se usan en HTML.

El apéndice enumera algunas características de SGML que no son soportadas por la mayoría de las herramientas y agentes de usuario HTML y que deberían evitarse.

3.2.1 Elementos

Una definición del tipo de documento SGML declara tipos de elementos que representan estructuras o un comportamiento deseado. HTML incluye elementos que representan párrafos, vínculos de hipertexto, listas, tablas, imágenes, etc.

Cada declaración de tipo de elemento describe generalmente tres partes: una etiqueta inicial, un contenido y una etiqueta final.

El nombre del elemento aparece en la etiqueta inicial (escrita <nombre-del-elemento>) y en la etiqueta final (escrita </nombre-del-elemento>); obsérvese la barra que precede al nombre del elemento en la etiqueta final. Por ejemplo, las etiquetas inicial y final del tipo de elemento UL delimitan los objetos de una lista:

<UL>
<LI><P>...objeto de lista 1...
<LI><P>...objeto de lista 2...
</UL>

Algunos tipos de elemento de HTML permiten a los autores omitir las etiquetas finales (p.ej., los tipos de elemento P y LI). Algunos elementos también permiten omitir la etiqueta inicial; por ejemplo, HEAD y BODY. El DTD de HTML indica para cada tipo de elemento si la etiqueta inicial y la etiqueta final son necesarias.

Algunos tipos de elemento de HTML no tienen contenido. Por ejemplo, el elemento de salto de línea BR no tiene contenido; su único papel es terminar una línea de texto. Estos elementos vacíos nunca tienen etiquetas finales. La definición del tipo de documento y el texto de la especificación indican si un tipo de elemento es vacío (es decir, si no tiene contenido) o, en caso de que pueda tener contenido, lo que se considera como contenido legal.

Para los nombres de los elementos no se distingue nunca entre mayúsculas y minúsculas.

Consulte el estándar SGML para más información sobre las reglas que gobiernan a los elementos (p.ej., deben anidarse correctamente, una etiqueta final cierra hasta su etiqueta inicial correspondiente todas las etiquetas iniciales intermedias abiertas (sección 7.5.1.), etc.).

Por ejemplo, el siguiente párrafo:

<P>Este es el primer párrafo.</P>
...un elemento en bloque...

puede escribirse sin su etiqueta final:

<P>Este es el primer párrafo.
...un elemento en bloque...

ya que la etiqueta inicial <P> es cerrada por el siguiente elemento en bloque. Análogamente, si un párrafo está contenido en un elemento en bloque, como aquí:

<DIV>
<P>Este es el párrafo.
</DIV>

la etiqueta final del elemento en bloque que lo contiene (aquí, </DIV>) implica la etiqueta final de la etiqueta inicial <P> abierta.

Los elementos no son etiquetas. Algunas personas se refieren a los elementos como etiquetas (p.ej., "la etiqueta P"). Recuerde que el elemento es una cosa, y la etiqueta (sea la inicial o la final) es otra cosa distinta. Por ejemplo, el elemento HEAD está siempre presente, incluso si tanto la etiqueta inicial de HEAD como la final están ausentes del código.

Todos los tipos de elemento declarados en esta especificación se enumeran en el índice de elementos.

3.2.2 Atributos

Los elementos pueden tener propiedades asociadas, llamadas atributos, que pueden tener valores (por defecto o asignados por el autor o por un script). Las parejas atributo/valor aparecen antes del ">" final de la etiqueta inicial de un elemento. En la etiqueta inicial de un elemento puede aparecer cualquier número de parejas (legales) atributo/valor, separadas por espacios. Pueden aparecer en cualquier orden.

En este ejemplo se establece el atributo id de un elemento H1:

<H1 id="seccion1">
Este es un título identificado gracias al atributo id
</H1> 

Por defecto, SGML requiere que todos los valores de atributo estén delimitados ya sea mediante comillas dobles (ASCII decimal 34) o mediante comillas simples (ASCII decimal 39). Un valor de atributo delimitado por comillas dobles puede contener signos de comillas simples, y viceversa. Los autores también pueden utilizar referencias numéricas de caracteres para representar comillas dobles (&#34;) y simples (&#39;). Para las comillas dobles los autores también pueden utilizar la referencia a entidad de caracteres &quot;.

En ciertos casos, los autores pueden especificar el valor de un atributo sin ponerlo entre comillas. El valor del atributo sólo puede contener letras (a-z y A-Z), dígitos (0-9), guiones (ASCII decimal 45), puntos (ASCII decimal 46), subguiones (ASCII decimal 95) y dos puntos (ASCII decimal 58). Recomendamos usar comillas incluso cuando sea posible eliminarlas.

Para los nombres de atributos no se distingue nunca entre mayúsculas y minúsculas.

Para los valores de los atributos en general no se distingue entre mayúsculas y minúsculas. En el manual de referencia se indica, en la definición de cada atributo, si se distingue para su valor entre mayúsculas y minúsculas.

Todos los atributos definidos por esta especificación se enumeran en el índice de atributos.

3.2.3 Referencias de caracteres

Las referencias de caracteres son nombres simbólicos o numéricos de caracteres que pueden incluirse en un documento HTML. Son útiles para hacer referencia a caracteres usados esporádicamente, o a aquellos que son difíciles o imposibles de introducir con las herramientas de creación. A lo largo de este documento pueden verse referencias de caracteres; comienzan con un signo "&" y terminan con un punto y coma (;). A continuación figuran algunos ejemplos comunes:

Hablaremos con más detalle acerca de las referencias de caracteres en HTML más adelante en la sección sobre el conjunto de caracteres de los documentos HTML. La especificación contiene también una lista de referencias de caracteres que pueden aparecer en documentos HTML 4.

3.2.4 Comentarios

Los comentarios en HTML tienen la sintaxis siguiente:

<!-- esto es un comentario -->
<!-- y esto también es un comentario,
     que ocupa más de una línea -->

No se permite espacio en blanco entre el delimitador de apertura de declaración de etiqueta ("<!") y el delimitador de apertura de comentario ("--"), pero sí se permite entre el delimitador de cierre de comentario ("--" y el delimitador de cierre de declaración de etiqueta (">"). Un error común es incluir una cadena de guiones ("---") dentro de un comentario. Los autores deberían evitar poner dos o más guiones adyacentes dentro de un comentario.

La información que aparece entre comentarios no tiene significado especial (p.ej., las referencias de caracteres no se interpretan como tales).

Obsérvese que los comentarios forman parte del código.

3.3 Cómo leer el DTD de HTML

En esta especificación, todas las declaraciones de elementos y atributos vienen acompañadas del fragmento correspondiente de la definición del tipo de documento. Hemos optado por incluir en la especificación fragmentos del DTD en lugar de intentar describir las propiedades de un elemento de una forma que sea más abordable, pero más larga y menos precisa. El tutorial que sigue permitirá a los lectores que no estén familiarizados con el SGML leer el DTD y entender los detalles técnicos de la especificación HTML.

3.3.1 Comentarios DTD

En los DTDs, los comentarios pueden extenderse a lo largo de una o más líneas. En el DTD, los comentarios están delimitados por un par de marcas "--", p.ej.:

<!ELEMENT PARAM - O EMPTY       -- valor de propiedad con nombre -->

Aquí, el comentario "valor de propiedad con nombre" explica el uso del tipo de elemento PARAM. Los comentarios de un DTD son únicamente informativos.

3.3.2 Definiciones de entidades paramétricas

El DTD HTML comienza con una serie de definiciones de entidades paramétricas. Una definición de entidad paramétrica define una clase de macro a la que se puede hacer referencia y ser expandida en cualquier otra parte del DTD. Estas macros no pueden aparecer en documentos HTML, sólo en el DTD. Otros tipos de macros, llamadas referencias de caracteres, sí pueden utilizarse en el texto de un documento HTML o dentro de los valores de los atributos.

Cuando se hace referencia a una entidad paramétrica por su nombre en el DTD, ésta se expande, sustituyéndose por una cadena.

Una definición de entidad paramétrica comienza con la palabra clave <!ENTITY % seguida por el nombre de la entidad, la cadena entre comillas a la que se expande la entidad, y por último un > de cierre. Las apariciones de entidades paramétricas dentro de un DTD comienzan con un "%", seguido por el nombre de la entidad paramétrica, y finalmente por un ";" opcional.

El siguiente ejemplo define la cadena a la que se expandirá la entidad "%fontstyle;".

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

La cadena a la que se expande la entidad paramétrica puede contener otros nombres de entidades paramétricas. Estos nombres se expanden recursivamente. En el siguiente ejemplo, la entidad paramétrica "%inline;" se define de modo que incluya las entidades paramétricas "%fontstyle;", "%phrase;", "%special;" y "%formctrl;".

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

Hay dos entidades DTD que aparecen frecuentemente en el DTD HTML: "%block;" e "%inline;". Se utilizan cuando el modelo de contenido incluye elementos en bloque y elementos en línea, respectivamente (definidos en la sección sobre la estructura global de un documento HTML).

3.3.3 Declaraciones de elementos

El grueso del DTD HTML consiste en la declaración de tipos de elementos y sus atributos. La palabra clave <!ELEMENT comienza una declaración y el carácter > la termina. Entre ellos se especifica:

  1. El nombre del elemento.
  2. Si las etiquetas del elemento son opcionales. Si aparecen dos guiones después del nombre del elemento tanto la etiqueta inicial como la final son obligatorias. Un guión seguido por la letra "O" indica que puede omitirse la etiqueta final. Un par de letras "O" indican que tanto la etiqueta inicial como la final pueden omitirse.
  3. Los contenidos del elemento, si los hay. El contenido admitido para un elemento se denomina su modelo de contenido. Los tipos de elemento diseñados de modo que no tengan contenido se llaman elementos vacíos. El modelo de contenido de tales tipos de elemento se declara con la palabra clave "EMPTY".

En este ejemplo:

    <!ELEMENT UL - - (LI)+>

Este ejemplo ilustra la declaración de un tipo de elemento vacío:

    <!ELEMENT IMG - O EMPTY>

Definiciones del modelo de contenido 

El modelo de contenido describe cuál puede ser el contenido de una aparición de un tipo de elemento. Las definiciones del modelo de contenido pueden incluir:

El modelo de contenido de un elemento se especifica de acuerdo a la sintaxis siguiente. Obsérvese que la lista que sigue es una simplificación de las reglas de sintaxis de SGML y no habla, por ejemplo, de precedencias.

( ... )
Delimita un grupo.
A
A debe aparecer una sola vez.
A+
A debe aparece una o más veces.
A?
A debe aparecer cero o una veces.
A*
A puede aparecer cero o más veces.
+(A)
A puede aparecer.
-(A)
A no debe aparecer.
A | B
O bien A o bien B deben aparecer, pero no las dos.
A , B
Tanto A como B deben aparecer, y en ese orden.
A & B
Tanto A como B deben aparecer, en cualquier orden.

Aquí presentamos algunos ejemplos sacados del DTD de HTML:

   <!ELEMENT UL - - (LI)+>

El elemento UL debe contener uno o más elementos LI.

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

El elemento DL debe contener uno o más elementos DT o DD en cualquier orden.

   <!ELEMENT OPTION - O (#PCDATA)>

El elemento OPTION sólo puede contener texto y entidades, tales como &amp;. Esto se indica con el tipo de datos de SGML #PCDATA.

Algunos tipos de elementos HTML usan una característica adicional de SGML para excluir elementos de su modelo de contenido. Los elementos excluidos van precedidos de un guión, y van al final de la descripción del modelo de contenido. Las exclusiones explícitas prevalecen sobre los elementos permitidos.

En este ejemplo, el -(A) significa que el elemento A no puede aparecer en otro elemento A (es decir, los vínculos no pueden estar anidados).

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

Obsérvese que el tipo de elemento A es parte de la entidad paramétrica del DTD "%inline;", pero está excluido explícitamente debido al -(A).

Análogamente, la siguiente declaración del tipo de elemento FORM prohíbe los formularios anidados:

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

3.3.4 Declaraciones de atributos

La palabra clave <!ATTLIST comienza la declaración de los atributos que puede tomar un elemento. Va seguida por el nombre del elemento en cuestión, una lista de definiciones de atributos, y un > de cierre. Cada definición de atributo es una terna que define:

En este ejemplo, se define el atributo name para el elemento MAP. El atributo es opcional para este elemento.

<!ATTLIST MAP
  name        CDATA     #IMPLIED
  >

El tipo de los valores permitidos para el atributo está dado como CDATA, un tipo de datos de SGML. CDATA es texto que puede contener referencias de caracteres.

Para más información sobre "CDATA", "NAME", "ID", y otros tipos de datos, consúltese la sección sobre tipos de datos de HTML.

Los siguientes ejemplos ilustran varias definiciones de atributos:

rowspan     NUMBER     1         -- número de filas abarcado por la celda --
http-equiv  NAME       #IMPLIED  -- nombre de encabezado de respuesta HTTP --
id          ID         #IMPLIED  -- identificador único a nivel de documento -- 
valign      (top|middle|bottom|baseline) #IMPLIED

El atributo rowspan requiere valores de tipo NUMBER. El valor por defecto está dado explícitamente y es "1". El atributo opcional http-equiv requiere valores de tipo NAME. El atributo opcional id requiere valores de tipo ID. El atributo opcional valign está restringido a los valores del conjunto {top, middle, bottom, baseline}.

Entidades DTD en definiciones de atributos 

Las definiciones de atributos también pueden contener referencias a entidades.

En este ejemplo, vemos que la lista de definiciones de atributos para el elemento LINK comienza con la entidad paramétrica "%attrs;".

<!ELEMENT LINK - O EMPTY               -- un vínculo independiente del medio -->
<!ATTLIST LINK
  %attrs;                              -- %coreattrs, %i18n, %events --
  charset     %Charset;      #IMPLIED  -- codificación de caracteres del
                                          recurso vinculado --
  href        %URI;          #IMPLIED  -- URI del recurso vinculado --
  hreflang    %LanguageCode; #IMPLIED  -- código de idioma --
  type        %ContentType;  #IMPLIED  -- tipo consultivo de contenido --
  rel         %LinkTypes;    #IMPLIED  -- tipos de vínculos directos --
  rev         %LinkTypes;    #IMPLIED  -- tipos de vínculos inversos --
  media       %MediaDesc;    #IMPLIED  -- para representar en estos medios --
  >

Etiqueta inicial: obligatoria, Etiqueta final: prohibida

La entidad paramétrica "%attrs;" se define como sigue:

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

La entidad paramétrica "%coreattrs;" de la definición de "%attrs;" se expande como sigue:

<!ENTITY % coreattrs
 "id          ID             #IMPLIED  -- identificador único a nivel de documento --
  class       CDATA          #IMPLIED  -- lista de clases separadas por espacios --
  style       %StyleSheet;   #IMPLIED  -- información de estilo asociada --
  title       %Text;         #IMPLIED  -- título consultivo --"
  >

La entidad paramétrica "%attrs;" se ha definido por conveniencia ya que estos atributos se definen para la mayoría de los tipos de elemento de HTML.

Análogamente, el DTD define la entidad paramétrica "%URI;" que se expande a la cadena "CDATA".

<!ENTITY % URI "CDATA"
    -- un Identificador Uniforme de Recursos,
       ver [URI]
    -->

Como se muestra en este ejemplo, la entidad paramétrica "%URI;" proporciona a los lectores del DTD más información sobre el tipo de datos que se espera para un atributo. Se han definido entidades similares para "%Color;", "%Charset;", "%Length;", "%Pixels;", etc.

Atributos booleanos  

Algunos atributos actúan como variables booleanas (p.ej., el atributo selected del elemento OPTION). Su aparición en la etiqueta inicial de un elemento implica que el valor del atributo es "verdadero" ("true"). Su ausencia implica un valor "falso" ("false").

Los atributos booleanos sólo pueden tomar un valor legal: el propio nombre del atributo (p.ej., selected="selected").

Este ejemplo define el atributo selected como un atributo booleano.

selected     (selected)  #IMPLIED  -- opción preseleccionada --

El atributo se iguala a "verdadero" si aparece en la etiqueta inicial del elemento:

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

En HTML, los atributos booleanos pueden aparecer en forma minimizada: sólo aparece el valor del atributo en la etiqueta inicial del elemento. Así, puede establecerse selected escribiendo:

<OPTION selected>

en lugar de:

<OPTION selected="selected">

Los autores deberían tener en cuenta que muchos agentes de usuario sólo reconocen la forma minimizada de los atributos booleanos, y no la forma completa.