Otra opción: RELAX NG
Relax NG
Al igual que surgió XML Schema como una mejora necesaria sobre la idea en la que se fundamentaban las DTDs, han surgido distintas propuestas al margen de los Schemas, de estas ideas no vamos a quedar con una, RELAX NG, que es, a su vez, la fusión de otras dos iniciativas TREX y RELAX que para conseguir un mayor avance han decidido aunar fuerzas.
Básicamente, RELAX NG maneja documentos XML que representan esquemas e instancias a través de un modelo abstracto de datos, esto que suena un poco oscuro viene a querer expresar que, para RELAX NG, un documento XML es la representación de un elemento y que a su vez un elemento está formado por una serie de "partes" como son: un nombre, un contexto, un conjunto de atributos y una secuencia ordenada de cero o más hijos. Y así con cada una de estas partes.
Aunque la especificación completa se puede encontrar en OASIS, vamos a mostrar cuales son la principales diferencias, no tanto conceptuales si no de uso, de RELAX NG con respecto a XML Schema. En primer lugar es importante resaltar que RELAX NG, y sus precursores RELAX y TREX, son intentos de simplificar y/o potenciar la utilidad de las DTDs en general y en particular de XML Schema. También es importante indicar que esta iniciativa no es oficial de W3.ORG, si bien está impulsándose dentro de un nutrido grupo de gente lideradas por James Clark , MURATA Makoto , y aún no está reconocido por el estándar ni tan siquiera como recomendación. En segundo lugar, podemos decir, sin mucho margen de error, que la principal mejora de RELAX NG respecto a XML Schema es la mayor simplicidad en manejo y aprendizaje que requiere. Como consecuencia de esta simplificación renunciamos al uso de los <simpleType> y <complexType> a favor del uso de, únicamente, elementos y ciertas etiquetas especiales para marcar número requerido de apariciones, tipo de dato de un elemento, etc.
Ejemplo de documento de RELAX NG
<grammar>
<start>
<element name=”Cabecera”>
<ref name=”Cabecera.class”>
</element>
<zeroOrMore>
<element name=”Articulo”>
<ref name=”Articulo.class”>
</element>
</zeroOrMore>
</start>
<define name=”Cabecera.class”>
<element name=”Titulo”>
…………………