Este documento se encontrará en estado de borrador durante un periodo indefinido de tiempo dedicado a efectuar las correciones oportunas.
(Los posibles errores presentes en este documento, debidos a la
traducción, son de la responsabilidad del traductor y no
son achacables en modo alguno al W3C).
Para cualquier comentario
sobre la traducción dirigirse a Fran Rosa Soler
Esta traducción se encuentra también publicada en Kusornet:
<http://www.kusor.net/w3c/xhtmltut/>
La versión oficial de este documento es la versión original (en
inglés):
http://www.w3.org/MarkUp/Guide/xhtml-m12n-tutorial/
Última actualización: $Fecha: 2001/08/01 19:26:28 $
Copyright ©2001 W3C® (MIT, INRIA, Keio), Todos los Derechos Reservados. Se aplican las reglas de responsabilidad, marca registrada, uso del documento y licencia de software del W3C.
La Modularización de XHTML proporciona un marco de trabajo para la creación de nuevos lenguajes de marcas a través de la extensión de los módulos Centrales de XHTML y el uso del Marco de Trabajo de Módulos de XHTML. En algunos casos, se querrán crear lenguajes de marcas completos y propietarios a través de estos mecanismos. En otros casos, se pueden querer crear nuevos módulos reutilizables para ser usados por su organización o por otros en la definición de lenguajes de marcas. En ambos casos, la mecánica de los módulos añadidos y de los lenguajes de marcas definidos es la misma. Este documento describe la manera en que estos módulos son definidos, y cómo deben ser combinados para crear nuevos lenguajes de marcas.
Los Módulos XHTML se componen de, al menos, dos módulos - un Módulo Qname y un Módulo de Declaración. En este apartado vamos a ver cómo se construyen cada uno de estos módulos. En el siguiente apartado, usaremos este nuevo módulo con otro módulo de la familia XHTML y algunos módulos Centrales de XHTML para definir un nuevo lenguaje de marcas.
La construcción de un Módulo Qname XHTML debe seguir el siguiente proceso:
<!ENTITY % MODULE.myelement.qname "%MODULE.pfx;myelement" >
Si el módulo añade atributos a elementos definidos en módulos que no comparten el espacio de nombre de este módulo, hay que declarar los atributos de manera que éstos usen el prefijo %MODULE.pfx. Por ejemplo:
<ENTITY % MODULE.img.myattr.qname "%MODULE.pfx;myattr" >
La construcción de un Módulo de Declaración XHTML debe seguir el siguiente proceso:
Es posible que se desee tener un módulo XHTML que sirva también como DTD interna. Un buen ejemplo puede ser un módulo que defina las partes de un inventario. Éstas partes deben poder ser incluidas en un documento XHTML, pero tambiñen deben estar disponibles como archivos independientes en, por ejemplo, una base de datos. La manera más fácil de conseguirlo es definiendo un archivo DTD que introduzca los componentes del módulo. Una DTD de este tipo deberá tener la siguiente estructura:
Sólo pueden hacer referencia a esta DTD los documentos que usen sólo los elementos de tu módulo.
Una vez hayas definido tu/s módulo/s, querrás combinarlos con XHTML y con otros módulos para crear un nuevo lenguaje de marcas. Lo único que debes hacer para construir un lenguaje de marcas mediante DTDs, es definir una DTD que refleje el lenguaje de marcas. Respecto a este tema, vamos a explorar el proceso para crear un "lenguaje de marcas híbrido".
Un Módulo Modelo es un Módulo XHTML que define el modelo de contenido para tu nuevo lenguaje de marcas. Este módulo puede ser extremadamente complejo, o tan simple como la declaración de una entidad parámetro y la inclusión de otros Módulos Modelo. De todas maneras, el objetivo es el mismo: definir la estructura de todos los elementos en tu lenguaje de marcas.
Tu lenguaje de marcas puede incluir uno o más Módulos de la familia XHTML. Cada uno de estos módulos tendrá un Módulo Qname. La colección de nombres calificados es un módulo en el que se introducen todos los Módulos Qname, y se definen todos los atributos prefijados. Específicamente, una colección de nombres calificados contiene:
El driver es el archivo al que hacen referencia los documentos escritos en tu lenguaje de marcas. El driver puede ser simple o complejo, dependiendo del lenguaje de marcas. De todas formas, el driver de cada lenguaje de marcas de la familia XHTML debe contener los siguientes elementos ordenados para funcionar correctamente:
Ahora ya está todo listo. Puedes hacer referencia a tu nuevo lenguaje de marcas definido mediante DTDs en la declaración DOCTYPE (de tipo de documento) en un documento, y éste puede ser validado según tu DTD mediante herramientas comerciales o de libre distribución.
En los siguientes apartados, veremos ejemplos de cada tipo de módulo mencionado en este documento, así como los componentes que forman dos definiciones distintas de lenguaje de marcas.
El primero de los módulos qname que veremos a continuación corresponde a un módulo inventario. El segundo corresponde a algunas extensiones del módulo inventario.
<!-- ...................................................................... --> <!-- Módulo Qname Inventario ................................................... --> <!-- archivo: inventory-qname-1.mod PUBLIC "-//MI COMPAÑÍA//ELEMENTOS XHTML Qnames de Inventario 1.0//EN" SYSTEM "http://www.my.org/DTDs/inventory-qname-1.mod" xmlns:inventory="http://www.my.org/xmlns/inventory" ...................................................................... --> <!-- Declare el valor por defecto del prefijado en este módulo --> <!-- Nótese que NS.prefixed no será tenido en cuenta por el Marco de Trabajo de XHTML o por una instancia de documento. --> <!ENTITY % NS.prefixed "IGNORE" > <!ENTITY % Inventory.prefixed "%NS.prefixed;" > <!-- Declare el Espacio de Nombre útil para este módulo --> <!ENTITY % Inventory.xmlns "http://www.my.org/xmlns/inventory" > <!-- Declare el prefijo por defecto de este módulo --> <!ENTITY % Inventory.prefix "inventory" > <!-- Declare el prefijo y todos los espacios de nombre con prefijo necesarios para este módulo --> <![%Inventory.prefixed;[ <!ENTITY % Inventory.pfx "%Inventory.prefix;:" > <!ENTITY % Inventory.xmlns.extra.attrib "xmlns:%Inventory.prefix; %URI.datatype; #FIXED '%Inventory.xmlns;'" > ]]> <!ENTITY % Inventory.pfx "" > <!ENTITY % Inventory.xmlns.extra.attrib "" > <!ENTITY % XHTML.xmlns.extra.attrib "%Inventory.xmlns.extra.attrib;" > <!ENTITY % Inventory.shelf.qname "%Inventory.pfx;shelf" > <!ENTITY % Inventory.item.qname "%Inventory.pfx;item" > <!ENTITY % Inventory.desc.qname "%Inventory.pfx;desc" > <!ENTITY % Inventory.sku.qname "%Inventory.pfx;sku" > <!ENTITY % Inventory.price.qname "%Inventory.pfx;price" >
<!-- ...................................................................... --> <!-- Extensiones del Módulo Qname Inventario ............................................... --> <!-- archivo: extension-qname-1.mod xmlns:invext="http://www.my.org/xmlns/invext" ...................................................................... --> <!-- Declare el valor por defecto del prefijado en los elementos de este módulo --> <!-- Nótese que NS.prefixed no será tenido en cuenta por el Marco de Trabajo de XHTML o por una instancia de documento. --> <!ENTITY % NS.prefixed "IGNORE" > <!ENTITY % Extension.prefixed "%NS.prefixed;" > <!-- Declare el Espacio de Nombre útil para este módulo --> <!ENTITY % Extension.xmlns "http://www.my.org/xmlns/invext" > <!-- Declare el prefijo por defecto de este módulo --> <!ENTITY % Extension.prefix "invext" > <!-- Declare el prefijo y todos los espacios de nombre con prefijo necesarios para este módulo --> <![%Extension.prefixed;[ <!ENTITY % Extension.pfx "%Extension.prefix;:" > <!ENTITY % Extension.xmlns.extra.attrib "xmlns:%Extension.prefix; %URI.datatype; #FIXED '%Extension.xmlns;'" > ]]> <!ENTITY % Extension.pfx "" > <!ENTITY % Extension.xmlns.extra.attrib "" > <!ENTITY % Extension.store.qname "%Extension.pfx;store" > <!ENTITY % Extension.aisle.qname "%Extension.pfx;aisle">
El primer módulo de declaración es para los elementos del módulo inventario. El segundo para los elementos de extensión
<!-- ...................................................................... --> <!-- Módulo de Elementos de Inventario ................................................... --> <!-- archivo: inventory-1.mod PUBLIC "-//MI COMPAÑÍA//ELEMENTOS XHTML Elementos de Inventario 1.0//EN" SYSTEM "http://www.my.org/DTDs/inventory-1.mod" xmlns:inventory="http://www.my.org/xmlns/inventory" ...................................................................... --> <!-- Módulo Inventario item sku desc price Este módulo defina la estructura simple de un artículo de inventario --> <!-- Define los atributos generales del espacio de nombre --> <![%Inventory.prefixed;[ <!ENTITY % Inventory.xmlns.attrib "%NS.decl.attrib;" > ]]> <!ENTITY % Inventory.xmlns.attrib "%NS.decl.attrib; xmlns %URI.datatype; #FIXED '%Inventory.xmlns;'" > <!ELEMENT %Inventory.shelf.qname; ( %Inventory.item.qname; )* > <!ATTLIST %Inventory.shelf.qname; location CDATA #IMPLIED %Inventory.xmlns.attrib; > <!ELEMENT %Inventory.item.qname; ( %Inventory.desc.qname;, %Inventory.sku.qname;, %Inventory.price.qname;) > <!ATTLIST %Inventory.item.qname; location CDATA #IMPLIED %Inventory.xmlns.attrib; > <!ELEMENT %Inventory.desc.qname; ( #PCDATA ) > <!ATTLIST %Inventory.desc.qname; %Inventory.xmlns.attrib; > <!ELEMENT %Inventory.sku.qname; ( #PCDATA ) > <!ATTLIST %Inventory.sku.qname; %Inventory.xmlns.attrib; > <!ELEMENT %Inventory.price.qname; ( #PCDATA ) > <!ATTLIST %Inventory.price.qname; %Inventory.xmlns.attrib; > <!-- final de inventory-1.mod -->
<!-- ...................................................................... --> <!-- Extensiones del Módulo de Elementos ................................................... --> <!-- archivo: extension-1.mod SYSTEM "extension-1.mod" xmlns:invext="http://www.my.org/xmlns/invext" ...................................................................... --> <!-- Módulo de Extensión store aisle Este módulo define una extensión para la estructura del inventario --> <!-- Define los atributos generales del espacio de nombre --> <![%Extension.prefixed;[ <!ENTITY % Extension.xmlns.attrib "%NS.decl.attrib;" > ]]> <!ENTITY % Extension.xmlns.attrib "%NS.decl.attrib; xmlns %URI.datatype; #FIXED '%Extension.xmlns;'" > <!ELEMENT %Extension.store.qname; ( %Extension.aisle.qname; )* > <!ATTLIST %Extension.store.qname; name CDATA #IMPLIED %Extension.xmlns.attrib; > <!ELEMENT %Extension.aisle.qname; ( %Inventory.shelf.qname; )* > <!ATTLIST %Extension.aisle.qname; number CDATA #IMPLIED %Extension.xmlns.attrib; > <!-- final de extension-1.mod -->
Este lenguaje de marcas cumple con todos los requisitos para ser un lenguaje de marcas de la familia XHTML. Usa los Módulos Centrales de XHTML, y lo amplia con los módulos Inventario y las extensiones del módulo Inventario definidas anteriormente.
<!-- Introduce los nombres calificados del inventario --> <!ENTITY % Inventory-qname.mod PUBLIC "-//MI COMPAÑÍA//ENTIDADES XHTML Qnames de Inventario 1.0//EN" "inventory-qname-1.mod" > %Inventory-qname.mod; <!-- Introduce el módulo de extensión local --> <!ENTITY % Extension-qname.mod SYSTEM "extension-qname-1.mod" > %Extension-qname.mod; <!-- Define los atributos de extensión de xmlns --> <!ENTITY % XHTML.xmlns.extra.attrib "%Inventory.xmlns.extra.attrib; %Extension.xmlns.extra.attrib;" >
<!-- ...................................................................... --> <!-- Módulo Modelo de Extensión de Inventario .................................... --> <!-- archivo: xhtml-invext-model-1.mod SYSTEM "xhtml-invext-model-1.mod" ...................................................................... --> <!-- Define el contenido modelo para Misc.extra --> <!ENTITY % Misc.class "| %script.qname; | %noscript.qname; | %Extension.store.qname; "> <!-- .................... Elementos Inline (en línea) ...................... --> <!ENTITY % HeadOpts.mix "( %meta.qname; )*" > <!ENTITY % I18n.class "" > <!ENTITY % InlStruct.class "%br.qname; | %span.qname;" > <!ENTITY % InlPhras.class "| %em.qname; | %strong.qname; | %dfn.qname; | %code.qname; | %samp.qname; | %kbd.qname; | %var.qname; | %cite.qname; | %abbr.qname; | %acronym.qname; | %q.qname;" > <!ENTITY % InlPres.class "| %tt.qname; | %i.qname; | %b.qname; | %big.qname; | %small.qname; | %sub.qname; | %sup.qname;" > <!ENTITY % Anchor.class "| %a.qname;" > <!ENTITY % InlSpecial.class "| %img.qname; " > <!ENTITY % Inline.extra "" > <!-- %Inline.class; incluye todos los elementos inline, usados como componentes en una mezcla --> <!ENTITY % Inline.class "%InlStruct.class; %InlPhras.class; %InlPres.class; %Anchor.class; %InlSpecial.class;" > <!-- %InlNoAnchor.class; incluye todos los elementos inline que no son anclas, usados como componentes en una mezcla --> <!ENTITY % InlNoAnchor.class "%InlStruct.class; %InlPhras.class; %InlPres.class; %InlSpecial.class;" > <!-- %InlNoAnchor.mix; incluye todos los inline que no son anclas --> <!ENTITY % InlNoAnchor.mix "%InlNoAnchor.class; %Misc.class;" > <!-- %Inline.mix; incluye todos los elementos inline, incluido %Misc.class; --> <!ENTITY % Inline.mix "%Inline.class; %Misc.class;" > <!-- ..................... Elementos Block (de bloque) ...................... --> <!ENTITY % Heading.class "%h1.qname; | %h2.qname; | %h3.qname; | %h4.qname; | %h5.qname; | %h6.qname;" > <!ENTITY % List.class "%ul.qname; | %ol.qname; | %dl.qname;" > <!ENTITY % Blkstruct.class "%p.qname; | %div.qname;" > <!ENTITY % Blkphras.class "| %pre.qname; | %blockquote.qname; | %address.qname;" > <!ENTITY % Blkpres.class "| %hr.qname;" > <!ENTITY % Block.extra "" > <!-- %Block.class; incluye todos los elementos de bloque, usados como componentes en una mezcla --> <!ENTITY % Block.class "%Blkstruct.class; %Blkphras.class; %Blkpres.class; %Block.extra;" > <!-- %Block.mix; incluye todos los elementos de bloque más %Misc.class; --> <!ENTITY % Block.mix "%Heading.class; | %List.class; | %Block.class; %Misc.class;" > <!-- ................ Todos los Elementos de Contenido .................. --> <!-- %Flow.mix; incluye todo el contenido de texto, de bloque e inline --> <!ENTITY % Flow.mix "%Heading.class; | %List.class; | %Block.class; | %Inline.class; %Misc.class;" > <!-- final de xhtml-invext-model-1.mod -->
<!-- ....................................................................... --> <!-- DTD de Extensión de Inventario .............................................. --> <!-- archivo: xhtml-invext-1.dtd --> <!-- Este es el DTD Driver para la versión 1.0 de inventario. Por favor, use este identificador público formal para identificarlo: "-//MI COMPAÑÍA//DTD XHTML Inventario Extensión 1.0//EN" Y este espacio de nombre para los elementos de extensión: xmlns:inventory="http://www.my.org/xmlns/invext" Se incluyen también otros nombres de espacio. --> <!ENTITY % XHTML.version "-//MI COMPAÑÍA//DTD XHTML Inventario Extensión 1.0//EN" > <!-- Define el módulo de nombres calificados de XHTML para que sean nuestros --> <!ENTITY % xhtml-qname-extra.mod SYSTEM "xhtml-invext-qname-1.mod" > <!-- reservado para su uso en perfiles de documento --> <!ENTITY % XHTML.profile "" > <!-- Define el Contenido Modelo para el marco de trabajo a usar --> <!ENTITY % xhtml-model.mod SYSTEM "xhtml-invext-model-1.mod" > <!-- Desactiva el soporte para texto bidireccional --> <!ENTITY % XHTML.bidi "INCLUDE" > <!-- Introduce el Marco de Trabajo de XHTML --> <!ENTITY % xhtml-framework.mod PUBLIC "-//W3C//ENTITIES XHTML Modular Framework 1.0//EN" "http://www.w3.org/TR/xhtml-modularization/DTD/xhtml-framework-1.mod" > %xhtml-framework.mod; <!-- Módulo Texto (Necesario) ............................... --> <!ENTITY % xhtml-text.mod PUBLIC "-//W3C//ELEMENTS XHTML Text 1.0//EN" "http://www.w3.org/TR/xhtml-modularization/DTD/xhtml-text-1.mod" > %xhtml-text.mod; <!-- Módulo Hypertexto (Necesario) ................................. --> <!ENTITY % xhtml-hypertext.mod PUBLIC "-//W3C//ELEMENTS XHTML Hypertext 1.0//EN" "http://www.w3.org/TR/xhtml-modularization/DTD/xhtml-hypertext-1.mod" > %xhtml-hypertext.mod; <!-- Módulo Listas (Necesario) .................................... --> <!ENTITY % xhtml-list.mod PUBLIC "-//W3C//ELEMENTS XHTML Lists 1.0//EN" "http://www.w3.org/TR/xhtml-modularization/DTD/xhtml-list-1.mod" > %xhtml-list.mod; <!-- Módulo Inventario ........................................ --> <!ENTITY % Inventory-elements.mod SYSTEM "inventory-1.mod" > %Inventory-elements.mod; <!-- Módulo de Extensión de Inventario .............................. --> <!ENTITY % Invext-elements.mod SYSTEM "extension-1.mod" > %Invext-elements.mod; <!-- Módulo Imágenes XHTML ........................................ --> <!ENTITY % xhtml-image.mod PUBLIC "-//W3C//ELEMENTS XHTML Images 1.0//EN" "http://www.w3.org/TR/xhtml-modularization/DTD/xhtml-image-1.mod" > %xhtml-image.mod; <!-- Módulo Metainformación de Documento ............................ --> <!ENTITY % xhtml-meta.mod PUBLIC "-//W3C//ELEMENTS XHTML Metainformation 1.0//EN" "xhtml-meta-1.mod" > %xhtml-meta.mod; <!-- Módulo Estructura de Documento (Necesario) ....................... --> <!ENTITY % xhtml-struct.mod PUBLIC "-//W3C//ELEMENTS XHTML Document Structure 1.0//EN" "http://www.w3.org/TR/xhtml-modularization/DTD/xhtml-struct-1.mod" > %xhtml-struct.mod;
Este ejemplo usa el nuevo lenguaje de marcas en su modo por defecto - sin prefijos definidos por ninguno de los módulos.
<!DOCTYPE html SYSTEM "xhtml-invext-1.dtd" > <html xmlns="http://www.w3.org/1999/xhtml" > <head> <title>Ejemplo usando los valores por defecto</title> </head> <body> <p>Contenido del espacio de nombre XHTML</p> <shelf> <item> <desc> esto es una descripción. </desc> <sku> esto es el sku. </sku> <price> esto es el precio. </price> </item> </shelf> </body> </html>
Este ejemplo usa el nuevo lenguaje de marcas con los prefijos activados sólo para los componentes de inventario y sus extensiones.
<!DOCTYPE html SYSTEM "xhtml-invext-1.dtd" [ <!ENTITY % Inventory.prefixed "INCLUDE"> <!ENTITY % Inventory.prefix "i"> ]> <html xmlns="http://www.w3.org/1999/xhtml" xmlns:i="http://www.my.org/xmlns/inventory" > <head> <title>Ejemplo usando prefijos</title> </head> <body> <p>Contenido del espacio de nombre XHTML</p> <i:shelf> <i:item> <i:desc> esto es una descripción. </i:desc> <i:sku> esto es el sku. </i:sku> <i:price> esto es el precio. </i:price> </i:item> </i:shelf> </body> </html>
Este ejemplo añade un prefijo en cada elemento.
<!DOCTYPE x:html SYSTEM "xhtml-invext-1.dtd" [ <!ENTITY % NS.prefixed "INCLUDE"> <!ENTITY % XHTML.prefix "x" > <!ENTITY % Inventory.prefix "i"> ]> <x:html xmlns:x="http://www.w3.org/1999/xhtml" xmlns:i="http://www.my.org/xmlns/inventory" > <x:head> <x:title>Ejemplo usando prefijos</x:title> </x:head> <x:body> <x:p>Contenido del espacio de nombre XHTML</x:p> <i:shelf> <i:item> <i:desc> esto es una descripción. </i:desc> <i:sku> esto es el sku. </i:sku> <i:price> esto es el precio. </i:price> </i:item> </i:shelf> </x:body> </x:html>