kusor.net - Principal 

Nota de Traducción

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/


Módulos y Lenguajes de Marcas XHTML

Cómo crear módulos y lenguajes de marcas de la familia XHTML para diversión y provecho

Última actualización: 2001/08/01 19:26:28

Editor:
Shane McCarron, Applied Testing and Technology

Tabla Completa de Contenidos

1. Introducción

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.

2. Terminología

Lenguaje de Marcas
Gramática (en este caso, una gramática XML) que puede ser usada para estructurar información. Una vez estructurada, la información puede ser procesada en el contexto del lenguaje de marcas. Dicho procesamiento puede incluir presentación a un usuario, extracción de la información clave, transformación en otras formas, etc.
Lenguaje de Marcas Híbrido
Lenguaje de Marcas hecho a partir de Módulos de múltiples Espacios de Nombre.
Espacio de Nombre
Colección de nombres delimitados de alguna manera. Un Espacio de Nombre XML es un mecanismo definido por el W3C para delimitar los elementos y atributos de XML. Todos los módulos definidos por XHTML están incluidos en el Espacio de Nombre de XHTML. Los módulos de la Familia XHTML deben estar incluidos en su propio Espacio de Nombre XML. La modularización de XHTML define el mecanismo para declarar el Espacio de Nombre XML de un módulo de modo que sea compatible con DTDs de XML y permita su validación XML como documento de la Familia XHTML
Validación XML
La Recomendación XML define la validación asegurándose de que un documento esté bien formado y de que se ajuste al modelo de contenido definido en la DTD asociada al documento. Los documentos de la Familia XHTML deben ser documentos XML Válidos.
Módulo
En XHTML, un módulo es una colección de uno o más archivos que definen entidades parámetro, elementos, y/o atributos. Un módulo puede representar un lenguaje de marcas interno completo. Puede también representar un pequeño cambio o añadidura a cualquier otro lenguaje de marcas o cualquier otro módulo. Aún así, los módulos pueden combinarse con otros módulos usando el Marco de Trabajo de XHTML. Con cuidado, los elementos definidos por éstos módulos pueden ser combinados en un completo modelo de contenido para un lenguaje de marcas.
DTD
DTD es una gramática en la que los lenguajes de marcas basados en XML pueden ser definidos (existen otras, pero ahora nos centraremos en las DTDs). Es también el término común para referirse a los archivos en los que podemos encontrar definiciones de lenguajes de marcas. En el contexto de los Módulos y Lenguajes de Marcas XHTML, una DTD es el archivo que incluye os módulos de la Familia XHTML que forman el lenguaje de marcas (junto con otros archivos de ayuda). En el lenguaje de las DTD, este archivo es también llamado DTD Driver.
Nombre Calificado
La combinación de XML y Espacios de Nombre XML dan origen a un tipo de elementos y atributos con nombres calificados. Un nombre calificado consiste en un nombre de elemento o atributo, posiblemente prefijado mediante un declarador de espacio de nombre (ej: xhtml:p para un parágrafo). En XHTML, los nombres calificados para elementos y atributos se definen en un Módulo Qname.
Módulo Qname
Al definir un Módulo XHTML, se puede crear un sub-módulo en el cual declarar los nombres calificados para el módulo, y en el cual especificar la configuración para espacios de nombre XML. La modularización de XHTML llama a estos sub-módulos Módulos Qname. Una definición completa de un Módulo de la Familia XHTML debe incluir, al menos, un Módulo Qname y un Módulo de Declaración.
Módulo de Declaración
El Módulo de Declaración es un Módulo XHTML que define los elementos y atributos, y que tiene la posibilidad de definir la estructura del Módulo. El Módulo de Declaración cuanta con las entidades parámetro definidas en un Módulo Qname asociado para definir los nombres de elementos y atributos, entonces éstos pueden ser calificados usando prefijos de Espacios de Nombre XML.

3. Construcción de Módulos

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.

3.1. Definir el Módulo Qname

La construcción de un Módulo Qname XHTML debe seguir el siguiente proceso:

  1. Definir una entidad MODULE.prefijada que indica si los elementos del módulo se usan con Espacios de Nombre XML prefijados o no. El valor por defecto de esta entidad parámetro debe ser "%NS.prefixed;". La entidad parámetro NS.prefixed está definida por el marco de trabajo de XHTML para ser IGNORE (ignorada) por defecto, y puede usarse en una instancia de documento para activar los prefijos para todos los espacios de nombre incluidos (para más información, ver ejemplo de prefijo)
  2. Definir una entidad parámetro MODULE.xmlns que contenga el nombre de espacio identificador para este módulo.
  3. Definir una entidad parámetro MODULE.prefix que contenga la cadena de prefijo por defecto que se vaya a usar cuando los prefijos estén activos.
  4. Definir una entidad parámetro MODULE.pfx que será "%MODULE.prefix;:" cuando los prefijos estén activados, y "" cuando éstos no lo estén
  5. Definir una entidad parámetro MODULE.xmlns.extra.attrib que contenga una declaración de cualquier atributo de nombre de espacio XML para nombres de espacio a los que se haga referencia en el módulo (ej: xmlns:xlink). Cuando %MODULE.prefix% tenga el valor INCLUDE (incluir), éste atributo debe incluir también la declaración xmlns:%MODULE.pfx.
  6. Para cada uno de los elementos definidos por el módulo, crear una entidad parámetro del tipo "MODULE.NAME.qname" para conservar su nombre calificado. El valor de esta entidad parámetro ha de ser "%MODULE.pfx;NAME". De esta forma, el valor interpretado será "PREFIX:NAME" cuando los prefijos estén activados y "NAME" cuando no lo estén. Por ejemplo:
<!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" >

3.2 Definir el Módulo de Declaración

La construcción de un Módulo de Declaración XHTML debe seguir el siguiente proceso:

  1. Definir una entidad parámetro para usarla en la ATTLIST (lista de atributos) de cada elemento declarado. Esta entidad parámetro debe ser %NS.decl.attrib; cuando %MODULE.prefixed; tenga el valor INCLUDE (incluir) y %NS.decl.attrib más "xmlns=%MODULE.xmlns;" cuando %MODULE.prefixed tenga el valor IGNORE (ignorar).
  2. Declarar todos los elementos y atributos para el módulo. En la ATTLIST de cada elemento, incluir la entidad parámetro definida anteriormente para que todos los atributos xmlns requeridos estén disponibles en todos los elementos del módulo

3.3 Uso del módulo como DTD interna (stand-alone DTD)

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:

  1. Incluir el módulo de Tipos de Datos XHTML (probablemente tu mñodulo qname use alguno de estos tipos de datos)
  2. Incluir el módulo Qnames para tu módulo.
  3. Definir la entidad parámetro %NS.prefixed.attrib para que sea MODULE.xmlns.extra.attrib cuando MODULE.prefixed tenga el valor IGNORE, o para ser MODULE.xmlns.extra.attrib y "xmlns:MODULE.prefix=MODULE.xmlns" cuando MODULE.prefixed tenga el valor INCLUDE.
  4. Incluir el/los Módulo/s de Declaración para tu módulo.

Sólo pueden hacer referencia a esta DTD los documentos que usen sólo los elementos de tu módulo.

4. Construcción de DTDs

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.


4.1. Definir el Modelo de Contenido como Módulo Modelo

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.

4.2. Definir la colección de nombres calificados

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:
  1. Una referencia al Módulo Qname de cada módulo no-XHTML incluido
  2. Una definición de la entidad parámetro XHTML.xmlns.extra.attrib que actúe como colección de las entidades parámetro MODULE.xmlns.extra.attrib, una por cada Módulo incluido.

4.3. Definir el Driver

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:
  1. Una definición de la entidad parámetro XHTML.version. Ésta debe ajustarse al Identificador Formal Público (Formal Public Identifier) de tu nuevo lenguaje de marcas.
  2. Una definición de la entidad parámetro xhtml-qname-extra.mod. Ésta debe ajustarse a la colección de nombres calificados definida anteriormente. Es correcto usar un identificador SYSTEM (de sistema) siempre que se encuentre dentro de la DTD.
  3. Una definición de la entidad parámetro xhtml-model.mod. Ésta debe ajustarse al Módulo Modelo definido anteriormente. Es correcto usar un identificador SYSTEM (de sistema) siempre que se encuentre dentro de la DTD.
  4. Una serie de referencias a los módulos que componen la DTD. Ésta puede ser una referencia a otra DTD que se está ampliando, o una lista explícita de los módulos XHTML que se van a usar, o una combinación de ambas. De todas maneras, lo primero que debe introducirse mediante esta referencia es el Módulo del Marco de Trabajo de Modularización XHTML. Este módulo se ocupa de incorporar toda la infraestructura de XHTML, combinándola con tus nombres calificados específicos y tu modelo de contenido a través de las entidades parámetro definidas en los pasos 2 y 3. No olvides incluir tus Módulos de Declaración, ya que es allí donde los elementos y atributos de tu lenguaje de marcas han sido definidos.
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.

5. Ejemplos de Módulos

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.

5.1. Módulos Qname

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.

5.1.1. Módulo Qname 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.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" > 

5.1.2. Extensiones del Módulo Qname Inventario

<!-- ....................................................-->
<!-- 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"> 

5.2. Módulos de Declaración

El primer módulo de declaración es para los elementos del módulo inventario. El segundo para los elementos de extensión

5.2.1. Módulo de Declaración Inventario

<!-- ...............................................................-->
<!-- 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 --> 

5.2.2. Extensiones del Módulo de Declaración Inventario

<!-- ............................................... -->
<!-- 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 --> 

6. Ejemplos de Lenguajes de Marcas

6.1. Extensiones de Inventario-XHTML - un Lenguaje de Marcas de la Familia XHTML

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.

6.1.1 Módulo de Colección de Qname

<!-- 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;" > 

6.1.2. Módulo de Modelo de Contenido

<!-- ............................................................-->
<!-- 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 --> 

6.1.3. DTD Driver

<!-- .......................................................-->
<!-- 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; 

7. Ejemplos de Uso

7.1 Inventario-XHTML sin prefijos

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 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> 

7.2. Inventario-XHTML con prefijos de Inventario

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.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> 

7.3. Inventario-XHTML con todos los prefijos

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.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>