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
www.sidar.org:
<http://www.sidar.org/traduc/tutxhtml/>
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: 2001/08/01 19:26:28
Copyright © 1999 W3C (MIT, INRIA, Keio), Todos los Derechos Reservados. Son aplicables las normas del W3C sobre: responsabilidad, marca registrada, uso del documento y licencia de software.
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.
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 nombre de espacio 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.
<!-- .........................................................-->
<!-- Módulo Qname Inventario ........................................... -->
<!-- archivo: inventory-qname-1.mod
PUBLIC "-//MI COMPAÑÍA//ELEMENTOS XHTML Qnames de Inventario 1.0//EN"
SYSTEM "http://www.mi.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">
<!-- ...............................................................-->
<!-- 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.mi.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 nombre de espacio -->
<![%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 nombre de espacio -->
<![%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 -->
<!-- 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; includes all inline elements,
used as a component in mixes
-->
<!ENTITY % Inline.class
"%InlStruct.class;
%InlPhras.class;
%InlPres.class;
%Anchor.class;
%InlSpecial.class;"
>
<!-- %InlNoAnchor.class; incluye todos los 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 nombre de espacio para los elementos de extensión:
xmlns:inventory="http://www.mi.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;
<!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 nombre de espacio 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>
<!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.mi.org/xmlns/inventory" >
<head>
<title>Ejemplo usando prefijos</title>
</head>
<body>
<p>Contenido del nombre de espacio 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>
<!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.mi.org/xmlns/inventory" >
<x:head>
<x:title>Ejemplo usando prefijos</x:title>
</x:head>
<x:body>
<x:p>Contenido del nombre de espacio 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>