En este apartado vamos a detallar una serie de conceptos empleados durante esta fase de análisis y en general durante toda esta memoria. Algunos son de uso relativamente común en el mundo de XML y XSD (y también en otras tecnologías relacionadas con XML, como XPath [44]), no obstante, conviene detallarlos a fin de que no se produzcan equívocos ni ambigüedades en la interpretación del contenido de los restantes apartados.
XML bien formado (well-formed): Documento que sigue absolutamente todas las reglas dadas en la especificación XML.
Árbol XML: Representación de un documento XML en forma de árbol, que refleja las relaciones jerárquicas existentes entre sus diferentes nodos.
Nodo: Cualquier unidad de información que pueda formar parte de un árbol XML, incluyendo elementos, atributos, texto (tanto texto normal como secciones CDATA), comentarios, instrucciones de procesado…
Espacio de nombres (namespace): Conjunto de nombres de elementos y atributos pertenecientes a un mismo vocabulario XML (por ejemplo, por estar relacionados con una aplicación concreta). Su finalidad es evitar colisiones y ambigüedades entre elementos y atributos homónimos que provengan de vocabularios diferentes. Se identifican unívocamente mediante URIs y se asocian a prefijos, de forma que todos los elementos o atributos con prefijo pertenecen al espacio de nombres asociado a él. También es posible indicar que los elementos sin prefijo pertenecen a un espacio de nombres. Es habitual que la URI apunte a una página web con algún tipo de información sobre el espacio de nombres, aunque se admite cualquier cadena de texto.
Prefijo: Un prefijo permite indicar que un elemento o atributo pertenece a un espacio de nombres concreto, siempre y cuando la URI de dicho espacio de nombres esté asociada a ese prefijo. Las asociaciones URI-prefijo pueden
36
definirse y redefinirse en cualquier elemento de un árbol XML, de manera que cada asociación se aplica al elemento donde fue declarada y todos sus descendientes (salvo si, en alguno de ellos, se redefine).
Espacio de nombres vacío: Espacio de nombres al que se considera que pertenecen todos los atributos y elementos que no pertenecen a un espacio de nombres concreto. Cuando se dice que un elemento o atributo no tiene espacio de nombres, lo que se quiere decir en realidad es que pertenece al espacio de nombres vacío (es correcto expresarlo de las dos maneras). Los atributos sin prefijo solo pueden pertenecer a este espacio. No se puede asociar a ningún prefijo, aunque sí a los elementos sin prefijo.
Nombre cualificado (qualified name o QName [2]): Nombre de un elemento o atributo precedido de un prefijo, que indica su espacio de nombres. El prefijo y el nombre se separan mediante “:”. El nombre de un elemento o atributo sin prefijo también es un nombre cualificado (si es un atributo, no tendrá espacio de nombres; si es un elemento, tendrá el espacio de nombres que le corresponda sin prefijo).
Nombre no cualificado (unqualified name): Nombre de un elemento o atributo sin tener en cuenta su espacio de nombres. El tipo NCName [1] describe qué caracteres se admiten en los nombres no cualificados. Es de gran interés, debido a que se reutiliza en muchas otras especificaciones relacionadas con XML, incluida XSD.
Elemento: Conjunto formado por una etiqueta XML, sus atributos (si los tuviera), su etiqueta de cierre y el contenido presente entre las etiquetas de apertura y cierre. Ejemplos de elemento: <elemento attr=”valor”/>,
<elemento2 attr2=”otro valor”>texto</elemento2>. Se identifica mediante un nombre cualificado.
Contenido de un elemento: Todos aquellos nodos que representen los atributos declarados en la etiqueta de apertura de un elemento y cualquier otro unidad presente entre las etiquetas de apertura y cierre, incluyendo elementos hijo, texto (normal o CDATA) o comentarios.
Atributo: Par nombre-valor incluido en la etiqueta de apertura de un elemento (forma parte del contenido del elemento). Cada elemento solo podrá tener un atributo con un mismo nombre cualificado y el orden en el que aparezcan es irrelevante.
Texto: Contenido textual compuesto de caracteres que se empleen en ningún tipo de marcado XML (o que estén convenientemente escapado) y que se encuentre entre la etiqueta de apertura y de cierre de un elemento, es decir, forme parte de su contenido.
CDATA (Character Data): Texto encerrado en una declaración especial, de manera que ninguno de sus caracteres se interprete como parte de una marca
37
XML, si bien se sigue considerando texto normal a los restantes efectos (es decir, las aplicaciones deben actuar como si fuera texto normal).
Comentario: Texto encerrado entre unas marcas especiales, que puede ubicarse en cualquier parte del documento XML y que las aplicaciones normalmente deberían ignorar (si bien los procesadores XML pueden leerlos y, por tanto, las aplicaciones podrían no ignorarlos si quisieran).
Elemento hijo: Un elemento b es hijo de otro elemento a si b pertenece al contenido de a y no existe ningún elemento c tal que c pertenezca al contenido de a y b se forme parte del contenido de c (es decir, en el fragmento “<d><e><f></f></e></d>”, e es hijo de d, f es hijo de e, pero f no es hijo de d). Se representa en el árbol XML como un nodo hijo de del elemento que lo contiene. Un elemento puede tener cero o varios hijos.
Elemento padre: El elemento padre de otro es aquel que lo contiene entre sus etiquetas de apertura y cierre como elemento hijo. Un elemento hijo solo puede tener un elemento padre.
Descendiente: Un elemento B es descendiente de otro A si partiendo de A podemos alcanzar B descendiendo uno o más niveles en el árbol, es decir, recorriendo el árbol a partir de A, siguiendo por un hijo de A, continuando por otro hijo de ese hijo y así sucesivamente hasta llegar a B. Nótese que todos los hijos de un elemento son descendientes de dicho elemento.
Ancestro: Un elemento A es ancestro de otro B si podemos alcanzar A partiendo de B y subiendo uno o más niveles en el árbol, es decir, recorriendo el árbol desde B, siguiendo por su padre, el padre del padre y así sucesivamente hasta llegar a A. Nótese que el elemento padre siempre es un ancestro.
Elemento raíz: Elemento sin padre del que descienden todos los demás elementos de un documento XML. En un XML bien formado, solo se admite un elemento raíz.
Ruta (path): Camino que debe seguirse desde el elemento raíz hasta un elemento o atributo dado, descrito en una sola línea. Tradicionalmente se emplea una sintaxis igual o similar a la de XPath [44]. Informalmente, puede hablarse de una ruta relativa como aquella que incluye el nombre cualificado del elemento y el de algunos ancestros pero no todos (sin saltarse niveles del árbol, es decir, no podemos incluir al padre del padre sin incluir al padre, por ejemplo).
Elemento simple: Elemento cuyo único contenido es texto, sea texto normal o CDATA (no se tiene en cuenta los comentarios).
Elemento compuesto o complejo: Elemento que no es simple.
Elemento mixto o con contenido mixto: Elemento en cuyo contenido hay tanto hijos como texto (independientemente de los atributos). Un ejemplo sería: “<xhtml:p>Esto es una línea de un párrafo XHTML.<xhtml:br/>Y esto es otra línea</xhtml:p>”.
38
Esquema o documento XSD: documento XML que sigue la especificación XSD. Sirve para establecer una serie de normas sobre el contenido y la estructura de aquellos documentos XML que deban validar contra él. Cada documento XSD solo podrá establecer normas sobre un espacio de nombres, lo que obliga a combinar múltiples ficheros XSD si se desea validar documentos en los que aparezcan varios espacios de nombres.
Tipo simple: tipo declarado en un XSD que permite describir cómo debe ser un determinado texto, bien sea el valor de un atributo o el texto de un elemento simple. Pueden servir también de base de tipos complejos en algunos casos. Tipo complejo: tipo declarado en un XSD que permite describir el contenido de
un elemento no simple. En concreto, permite indicar las listas de atributos admitidos, la estructura de hijos (mediante una serie de estructuras XML que, en rigor, constituyen una expresión regular de elementos) y si se permite texto. En cuanto a esto último, si un tipo complejo no admite hijos, puede declararse como una extensión de un tipo simple, de manera que el texto de los elementos del tipo complejo mantiene las restricciones propias del tipo simple que ha actuado como base. En cambio, si el tipo complejo admite hijos, tan solo podremos indicar si es mixto (admite también texto) o no.
Expresión regular (de elementos): No debe confundirse con el concepto tradicional que se tiene de expresiones regulares, que en rigor son expresiones regulares de caracteres. Al igual que estas, son unas construcciones que describen un conjunto de cadenas mediante símbolos y modificadores específicos. La diferencia es que, en este caso, no describen cadenas de caracteres como se hace en los lenguajes de expresiones regulares habituales sino que describen cadenas de elementos (listas de elementos hijos) admisibles bajo los elementos de un tipo complejo concreto. Para ello emplean construcciones propias del lenguaje de esquema empleado (XSD en nuestro caso). Debe entenderse en el contexto de la teoría de lenguajes formales, donde estas expresiones describen el lenguaje formado por todas las listas de hijos admitidas bajo el tipo complejo.
Validación: Proceso que permite comprobar si un documento XML se ajusta a las restricciones impuestas por uno o más XSDs.