Duda sobre XML Schemas
Buenos días,
Realizando cambios sobre unos XML Schemas que me pasaron, surgió el siguiente caso:
-Tenemos un fichero "elementoscomunes.xsd" que definen el tipo de dato "edad".
-Posteriormente, tenemos un fichero "alumnos.xsd" que contiene un alumno, a su vez, un alumno tiene un "profesor" y una "edad".
-A su vez, definimos el fichero "profesor.xsd" que contiene un profesor, a su vez, un profesor tiene n "alumnos" y una "edad".
Parece claro que profesor.xsd debe importar alumnos.xsd y elementoscomunes.xsd, y alumnos.xsd, a su vez, profesor.xsd y elementoscomunes.xsd....
Pero, ¿no véis cierta redundancia, (alumnos.xsd importa elementoscomunes.xsd dos veces, una de manera directa, y una segunda, a través de profesor.xsd), además de una posible redundancia cíclica (alumnos.xsd importa profesor.xsd y viceversa)?
¿Cómo resolverías este caso?
Muchas gracias por vuestra participación.
Un saludo,
Reader Comments (3)
Vemos una solución, que es la siguiente:
ElementosComunes.xsd
<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<xsd:simpleType name="edadType">
<xs:restriction base="xs:integer">
<xs:minInclusive value="0"/>
<xs:maxInclusive value="120"/>
</xs:restriction>
</xsd:simpleType>
</xsd:schema>
Alumnos.xsd
<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<xsd:include schemaLocation="elementosComunes.xsd"/>
<xsd:include schemaLocation="profesor.xsd"/>
<xsd:complexType name="alumnoType">
<xsd:sequence>
<xsd:element name="profesor" type="profesorType" maxOccurs="1"/>
</xsd:sequence>
<xsd:attribute name="edad" type="edadType"/>
</xsd:complexType>
</xsd:element>
</xsd:schema>
Profesor.xsd
<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<xsd:include schemaLocation="alumnos.xsd"/>
<xsd:complexType name="profesorType">
<xsd:sequence>
<xsd:element name="alumno" type="alumnoType" maxOccurs="1"/>
</xsd:sequence>
<xsd:attribute name="edad" type="edadType"/>
</xsd:complexType>
</xsd:element>
</xsd:schema>
La línea: <xsd:include schemaLocation="elementosComunes.xsd"/> puede ser incluida en cualquiera de los dos ficheros (profesor.xsd o alumno.xsd), vemos que sólo es necesario que esté definida una vez). La redundancia cíclica parece inevitable, entiendo que el compilador de XSD tiene en cuenta estos casos.
¿Más feedback por favor?
No quiero entrar en polémica, pero esa esquematización no responde al mundo real, y de ahí los problemas de dependencias cíclicas.
Si modelamos usuario y profesor sin incluir dependencias entre ellos, y luego modelamos clase, donde los incluímos a ambos resolvemos el problema (eliminando la dependencia cíclica) y reflejamos algo mejor la relación del mundo real: los alumnos asisten a una asignatura que se imparte en una clase (yo he buscado simplificar, eliminando la asignatura del modelo para mostrar lo que quería mostrar).
Además, que dos esquemas importen otro esquema no es un problema, también lo están haciendo con el del root: http://www.w3.org/2001/XMLSchema.
Muchas gracias por el aporte Ramón, estoy de acuerdo en lo que dices.
El esquema, inicialmente, no es completamente correcto, sin embargo, en entornos productivos se observa que muchas veces las cosas no están hecho del todo correctas (normalizadas) y, por no permitirse cambios "grandes", es necesario en ocasiones conocer el modo de funcionamiento "interno" de las tecnologías para poder sobrevivir.
En cualquier caso, comparto 100% lo que dices.
¡Un saludo!