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.net. Gracias por su colaboración.
Véase el Aviso de copyright de la traducción.
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]).
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:
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.
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.
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.
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 (") y simples ('). Para las comillas dobles los autores también pueden utilizar la referencia a entidad de caracteres ".
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.
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.
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.
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.
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.
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).
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:
En este ejemplo:
<!ELEMENT UL - - (LI)+>
Este ejemplo ilustra la declaración de un tipo de elemento vacío:
<!ELEMENT IMG - O EMPTY>
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.
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 &. 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)>
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}.
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:
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".
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.
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.