Convertir DTD en esquema
El comando DTD/Esquema | Convertir DTD en esquema... se habilita cuando el documento activo es una DTD y convierte el archivo DTD en un esquema XML (XSD).
Al hacer clic en este comando se abre el cuadro de diálogo "Convertir DTD en esquema del W3C" (imagen siguiente). En este diálogo puede seleccionar si los elementos complejos se convierten en elementos o en tipos complejos. Al hacer clic en Aceptar aparece otro diálogo donde debe elegir la ubicación donde se guarda el archivo XSD generado. Haga clic en Guardar para realizar la conversión. El archivo XSD se genera y se abre en XMLSpy.
Cuando convierta una DTD en un esquema XML, XMLSpy hace varias suposiciones, ya que la información disponible es limitada. En particular, los valores de ciertos componentes DTD se tratan de forma literal, en lugar de analizarse su semántica. Esto se debe a que el programa no puede saber cuál de todos los usos posibles es el uso deseado. En estos casos, recomendamos que realice los cambios necesarios en el esquema XML generado.
Sea como fuere, recomendamos que examine detenidamente el esquema XML o documento DTD generado por si fuera necesario corregirlo. A continuación mencionamos algunos aspectos del documento generado que quizás puedan mejorarse.
Tipos de datos de los atributos
Las DTD admiten solamente 10 tipos de datos de atributos, mientras que los esquemas XML admiten más de 40 tipos de datos además de los tipos de datos derivados. Quizás sea buena idea mejorar el esquema XML generado usando un tipo de datos más restrictivo, por ejemplo. Recuerde que, cuando un esquema XML se convierte en una DTD, se pierde la información de tipos de datos.
Espacios de nombres
Las DTD no distinguen los espacios de nombres. Por tanto, si desea especificar espacios de nombre en una DTD debe codificarlos de forma rígida en el nombre de los elementos o atributos. Esto puede presentar problemas a la hora de convertir un esquema en otro esquema.
Entidades
La especificación XML Schema no tiene equivalentes para las declaraciones de entidad generales de las DTD. Cuando XMLSpy convierte una DTD en un esquema XML, omite las declaraciones de entidad.
Declaraciones de datos sin analizar
Las DTD y los esquemas XML usan mecanismos distintos a la hora de tratar datos sin analizar.
Las DTD usan este mecanismo:
•Se declara una notación compuesta por un nombre y un identificador, como por ejemplo:
<!NOTATION gif SYSTEM "image/gif">
•Usted declara la entidad, por ejemplo:
<!ENTITY cover_img SYSTEM "graphics/cover_img.gif" NDATA gif>
•Y después, por lo general, especifica un tipo de atributo de ENTITY en el atributo pertinente, por ejemplo:
<!ELEMENT img EMPTY>
<!ATTLIST img format ENTITY #REQUIRED>
Por el contrario, los esquemas XML usan este mecanismo:
•Declare una notación. La notación funciona igual que en la DTD.
<xs:notation name="gif" public="image/gif"/>
Recuerde que es obligatorio usar el atributo public que almacena el identificador. Puede usar el atributo opcional system, que almacena el identificador de sistema y suele ser un ejecutable que se encarga de los recursos del tipo de la notación.
•Puede asociar la declaración de notación con un valor de atributo dado usando el tipo de datos NOTATION.
No obstante, no puede usar el tipo de datos NOTATION directamente, sino que debe derivar otro tipo de datos del tipo de datos NOTATION.
<xs:simpleType name="formatType">
<xs:restriction base="xs:NOTATION">
<xs:enumeration value="gif"/>
<xs:enumeration value="jpeg"/>
</xs:restriction>
</xs:simpleType>
Asocie el atributo con el tipo de datos derivado del tipo de datos NOTATION, por ejemplo:
<xs:complexType name="imgType">
<xs:attribute name="height"/>
<xs:attribute name="width"/>
<xs:attribute name="location"/>
<xs:attribute name="format" type="formatType" use="required"/>
</xs:complexType>
<xs:element name="img" type="imgType"/>
Cuando convierta una DTD en un esquema XML esto es lo que hace XMLSpy:
•Algo parecido a esto
<!ATTLIST image format ENTITY #REQUIRED
...>
se convierte en
<xs:attribute name="format" type="xs:ENTITY" use="required"/>
•Y algo como esto
<!NOTATION gif SYSTEM "image/gif">
se convierte en
<xs:notation name="gif" system="image/gif"/>
Por tanto, recomendamos que haga estos cambios:
1. | En las notaciones de tipo <xs:notation name="gif" system="image/gif"/> sustituya system con public y añada un identificador de sistema opcional si es necesario. |
2. | Derive un tipo de datos del tipo de datos NOTATION tal y como explicamos más arriba para formatType. |
3. | Asocie el tipo de datos derivado al atributo correspondiente. |
Nota importante: según la especificación XML Schema, no es necesario (o no es posible, según como se mire) declarar una entidad externa.