Un esquema XML es una descripción de un tipo de documento XML , expresada normalmente en términos de restricciones sobre la estructura y el contenido de los documentos de ese tipo, más allá de las restricciones sintácticas básicas impuestas por el propio XML. Estas restricciones se expresan generalmente mediante una combinación de reglas gramaticales que rigen el orden de los elementos, predicados booleanos que el contenido debe satisfacer, tipos de datos que rigen el contenido de los elementos y atributos, y reglas más especializadas, como restricciones de unicidad e integridad referencial .
Existen lenguajes desarrollados específicamente para expresar esquemas XML. El lenguaje de definición de tipo de documento (DTD), que es nativo de la especificación XML, es un lenguaje de esquemas con una capacidad relativamente limitada, pero que también tiene otros usos en XML además de la expresión de esquemas. Otros dos lenguajes de esquemas XML expresivos de uso generalizado son XML Schema (con S mayúscula ) y RELAX NG .
El mecanismo para asociar un documento XML con un esquema varía según el lenguaje del esquema. La asociación puede lograrse mediante marcado dentro del propio documento XML o mediante algún medio externo.
La definición de esquema XML se conoce comúnmente como XSD.
El proceso de comprobar si un documento XML se ajusta a un esquema se denomina validación , que es independiente del concepto básico de XML de buena formación sintáctica . Todos los documentos XML deben estar bien formados, pero no es necesario que un documento sea válido a menos que el analizador XML esté "validando", en cuyo caso también se comprueba la conformidad del documento con su esquema asociado. Los analizadores que validan DTD son los más comunes, pero algunos también admiten XML Schema o RELAX NG.
La validación de un documento de instancia con respecto a un esquema puede considerarse una operación conceptualmente independiente del análisis de XML. Sin embargo, en la práctica, muchos validadores de esquemas están integrados con un analizador de XML.
Hay varios lenguajes diferentes disponibles para especificar un esquema XML. Cada lenguaje tiene sus ventajas y desventajas.
El objetivo principal de un lenguaje de esquema es especificar cuál puede ser la estructura de un documento XML. Esto significa qué elementos pueden residir en qué otros elementos, qué atributos son y no son legales para un elemento en particular, etc. Un esquema es análogo a la gramática de un lenguaje; un esquema define cuál puede ser el vocabulario del lenguaje y qué es una "oración" válida.
Existen lenguajes de esquema XML históricos y actuales:
A continuación se describen los principales (ver también los lenguajes aprobados por la norma ISO 19757 ).
Aunque hay varios lenguajes de esquema disponibles, los tres principales son Document Type Definitions , W3C XML Schema y RELAX NG . Cada lenguaje tiene sus propias ventajas y desventajas.
Los DTD son quizás el lenguaje de esquemas más ampliamente admitido para XML. Debido a que los DTD son uno de los primeros lenguajes de esquemas para XML, definidos antes de que XML tuviera soporte para espacios de nombres, son ampliamente admitidos. Los procesadores XML suelen admitir DTD internos; los DTD externos son menos compatibles, pero solo de forma limitada. La mayoría de los analizadores XML grandes, aquellos que admiten múltiples tecnologías XML, también brindarán soporte para DTD.
Las características disponibles en XSD que faltan en los DTD incluyen:
Los esquemas XSD se escriben convencionalmente como documentos XML, por lo que se pueden utilizar herramientas de edición y transformación familiares.
Además de la validación, XSD permite anotar instancias XML con información de tipo (el conjunto de información de validación posterior al esquema (PSVI) ), que está diseñado para facilitar la manipulación de la instancia XML en los programas de aplicación. Esto puede hacerse mediante la asignación de los tipos definidos por XSD a tipos en un lenguaje de programación como Java ("enlace de datos") o enriqueciendo el sistema de tipos de lenguajes de procesamiento XML como XSLT y XQuery (conocido como "conocimiento de esquemas").
RELAX NG y el esquema XML del W3C permiten mecanismos similares de especificidad. Ambos permiten un cierto grado de modularidad en sus lenguajes, incluyendo, por ejemplo, la división del esquema en varios archivos. Y ambos están, o pueden estar, definidos en [ aclaración necesaria ] un lenguaje XML.
RELAX NG no tiene ningún análogo con PSVI . A diferencia del esquema XML del W3C, RELAX NG fue diseñado de modo que la validación y la ampliación (adición de información de tipo y valores predeterminados) sean independientes.
El esquema XML del W3C tiene un mecanismo formal para adjuntar un esquema a un documento XML, mientras que RELAX NG evita intencionalmente dichos mecanismos por razones de seguridad e interoperabilidad.
RELAX NG no tiene la capacidad de aplicar datos de atributos predeterminados a la lista de atributos de un elemento (es decir, cambiar el conjunto de información XML), mientras que el esquema XML W3C sí lo hace. Nuevamente, este diseño es intencional y tiene como objetivo separar la validación y la ampliación. [8]
El esquema XML del W3C tiene incorporado un sistema de "tipos simples" muy completo (xs:number, xs:date, etc., además de la derivación de tipos personalizados), mientras que RELAX NG tiene uno extremadamente simplista porque está pensado para utilizar bibliotecas de tipos desarrolladas independientemente de RELAX NG, en lugar de desarrollar las suyas propias. Algunos consideran que esto es una desventaja. En la práctica, es habitual que un esquema RELAX NG utilice los "tipos simples" y las "restricciones" predefinidos (patrón, maxLength, etc.) del esquema XML del W3C.
En el esquema XML del W3C se puede expresar un número específico o un rango de repeticiones de patrones, mientras que en RELAX NG prácticamente no es posible especificarlo (<oneOrMore> o <zeroOrMore>).
El esquema XML del W3C es complejo y difícil de aprender, aunque eso se debe en parte a que intenta hacer más que una mera validación (ver PSVI ).
Aunque estar escrito en XML es una ventaja, también es una desventaja en algunos aspectos. El lenguaje XML Schema del W3C, en particular, puede ser bastante verboso, mientras que un DTD puede ser conciso y relativamente fácil de editar.
De la misma manera, el mecanismo formal de WXS para asociar un documento con un esquema puede plantear un problema de seguridad potencial. Para los validadores de WXS que seguirán una URL hasta una ubicación en línea arbitraria, existe la posibilidad de leer algo malicioso desde el otro lado de la secuencia. [9]
El esquema XML del W3C no implementa la mayor parte de la capacidad de DTD para proporcionar elementos de datos a un documento.
Aunque la capacidad del esquema XML del W3C para agregar atributos predeterminados a los elementos es una ventaja, también es una desventaja en algunos aspectos. Significa que un archivo XML puede no ser utilizable en ausencia de su esquema, incluso si el documento se validara con ese esquema. En efecto, todos los usuarios de un documento XML de este tipo también deben implementar la especificación del esquema XML del W3C, descartando así los analizadores XML minimalistas o antiguos. También puede ralentizar el procesamiento del documento, ya que el procesador debe potencialmente descargar y procesar un segundo archivo XML (el esquema); sin embargo, un esquema normalmente se almacenaría en caché, por lo que el costo solo se aplica al primer uso.
La compatibilidad con WXS existe en varios paquetes de análisis XML de gran tamaño. Tanto Xerces como la biblioteca de clases base de .NET Framework brindan compatibilidad con la validación WXS.
RELAX NG ofrece la mayoría de las ventajas que ofrece el esquema XML del W3C sobre los DTD.
Si bien el lenguaje de RELAX NG se puede escribir en XML, también tiene una forma equivalente que es mucho más parecida a una DTD, pero con mayor poder de especificación. Esta forma se conoce como sintaxis compacta. Las herramientas pueden convertir fácilmente entre estas formas sin pérdida de características o incluso comentarios. Incluso los elementos arbitrarios especificados entre los elementos XML de RELAX NG se pueden convertir a la forma compacta.
RELAX NG ofrece un soporte muy sólido para contenido no ordenado, es decir, permite que el esquema indique que una secuencia de patrones puede aparecer en cualquier orden.
RELAX NG también permite modelos de contenido no deterministas. Esto significa que RELAX NG permite la especificación de una secuencia como la siguiente:
<zeroOrMore> <ref name= "impar" /> <ref name= "par" /> </zeroOrMore> <opcional> <ref name= "impar" /> </opcional>
Cuando el validador encuentra algo que coincide con el patrón "odd", no se sabe si se trata de la última referencia "odd" opcional o simplemente de una en la secuencia zeroOrMore sin mirar hacia delante en los datos. RELAX NG permite este tipo de especificación. El esquema XML del W3C requiere que todas sus secuencias sean completamente deterministas, por lo que mecanismos como el anterior deben especificarse de una manera diferente o bien omitirse por completo.
RELAX NG permite que los atributos se traten como elementos en los modelos de contenido. En particular, esto significa que se puede proporcionar lo siguiente:
< nombre del elemento= "algún_elemento" > <opción> < nombre del atributo= "tiene_nombre" > <valor> falso </valor> </atributo> <grupo> < nombre del atributo = "tiene_nombre" > <valor> verdadero </valor> </atributo> <nombre del elemento = "nombre" ><texto /></elemento> </grupo> </opción > </elemento>
Este bloque establece que el elemento "some_element" debe tener un atributo llamado "has_name". Este atributo solo puede tomar como valores verdadero o falso y, si es verdadero, el primer elemento secundario del elemento debe ser "name", que almacena texto. Si "name" no necesitara ser el primer elemento, entonces la elección podría incluirse en un elemento "interleave" junto con otros elementos. El orden de especificación de los atributos en RELAX NG no tiene significado, por lo que este bloque no necesita ser el primer bloque en la definición del elemento.
El esquema XML del W3C no puede especificar tal dependencia entre el contenido de un atributo y los elementos secundarios.
La especificación de RELAX NG solo enumera dos tipos integrados (cadena y token), pero permite la definición de muchos más. En teoría, la falta de una lista específica permite que un procesador admita tipos de datos que son muy específicos del dominio del problema.
La mayoría de los esquemas RELAX NG se pueden convertir algorítmicamente en esquemas XML W3C e incluso en DTD (excepto cuando se utilizan funciones RELAX NG que no son compatibles con esos lenguajes, como se indicó anteriormente). Lo contrario no es cierto. Por lo tanto, RELAX NG se puede utilizar como una versión normativa del esquema y el usuario puede convertirlo a otros formatos para herramientas que no son compatibles con RELAX NG.
La mayoría de las desventajas de RELAX NG se tratan en la sección sobre las ventajas del esquema XML del W3C sobre RELAX NG.
Aunque la capacidad de RELAX NG para admitir tipos de datos definidos por el usuario es útil, tiene la desventaja de que solo tiene dos tipos de datos en los que el usuario puede confiar. Lo que, en teoría, significa que el uso de un esquema RELAX NG en varios validadores requiere proporcionar esos tipos de datos definidos por el usuario a ese validador o usar solo los dos tipos básicos. Sin embargo, en la práctica, la mayoría de los procesadores RELAX NG admiten el conjunto de tipos de datos del esquema XML del W3C.
Schematron es un lenguaje de esquemas bastante inusual. A diferencia de los tres principales, define la sintaxis de un archivo XML como una lista de reglas basadas en XPath . Si el documento cumple con estas reglas, entonces es válido.
Debido a su naturaleza basada en reglas, la especificidad de Schematron es muy fuerte. Puede exigir que el contenido de un elemento esté controlado por uno de sus hermanos. También puede solicitar o requerir que el elemento raíz, independientemente de cuál sea, tenga atributos específicos. Incluso puede especificar las relaciones requeridas entre varios archivos XML.
Si bien Schematron es bueno en construcciones relacionales, su capacidad para especificar la estructura básica de un documento, es decir, qué elementos pueden ir en qué lugar, da como resultado un esquema muy detallado.
La forma típica de resolver esto es combinar Schematron con RELAX NG o W3C XML Schema. Hay varios procesadores de esquemas disponibles para ambos lenguajes que admiten esta forma combinada. Esto permite que las reglas de Schematron especifiquen restricciones adicionales a la estructura definida por W3C XML Schema o RELAX NG.
La implementación de referencia de Schematron es en realidad una transformación XSLT que transforma el documento de Schematron en un XSLT que valida el archivo XML. Como tal, el conjunto de herramientas potenciales de Schematron es cualquier procesador XSLT, aunque libxml2 proporciona una implementación que no requiere XSLT. El Validador de esquemas múltiples de Sun Microsystems para Java tiene un complemento que le permite validar esquemas RELAX NG que tienen reglas de Schematron integradas.
Técnicamente, no se trata de un lenguaje de esquemas. Su único propósito es dirigir partes de documentos a esquemas individuales en función del espacio de nombres de los elementos encontrados. Un NRL es simplemente una lista de espacios de nombres XML y una ruta a un esquema al que corresponde cada uno. Esto permite que cada esquema se ocupe únicamente de su propia definición de lenguaje, y el archivo NRL dirige el validador de esquemas al archivo de esquema correcto en función del espacio de nombres de ese elemento.
Este formato XML es independiente del lenguaje de esquema y funciona con prácticamente cualquier lenguaje de esquema.
Capitalización en la palabra esquema : existe cierta confusión sobre cuándo utilizar la ortografía con mayúscula "Schema" y cuándo utilizar la ortografía con minúscula. La forma en minúscula es un término genérico y puede referirse a cualquier tipo de esquema, incluidos DTD, XML Schema (también conocido como XSD), RELAX NG u otros, y siempre debe escribirse en minúscula, excepto cuando aparezca al comienzo de una oración. La forma "Schema" (con mayúscula) de uso común en la comunidad XML siempre hace referencia a W3C XML Schema .
El enfoque de la definición de esquemas es la estructura y cierta semántica de los documentos. Sin embargo, el diseño de esquemas, al igual que el diseño de bases de datos, programas informáticos y otras construcciones formales, también implica muchas consideraciones de estilo, convención y legibilidad. Se pueden encontrar discusiones extensas sobre cuestiones de diseño de esquemas en (por ejemplo) Maler (1995) [10] y DeRose (1997). [11]
include
control de modularización sobre espacios de nombres) y recomiendan la reutilización cuando sea posible. Varias partes de los esquemas extensos y sofisticados de la Iniciativa de Codificación de Texto también se reutilizan en una extraordinaria variedad de otros esquemas.Idiomas: