Compartir a través de


Esquemas determinísticos y no determinísticos

Un esquema determinístico es aquél que no es ambiguo, lo que permite al analizador utilizado por SOM (Schema Object Model, Modelo de objetos de esquemas) determinar la secuencia en la que los elementos se deben producir para que un documento XML sea válido. Un esquema XML puede ser ambiguo, o no determinístico. Un esquema se considera no determinístico si el analizador no puede determinar con claridad la estructura que se debe validar con el esquema. Si se intenta la validación en un esquema no determinístico, el analizador que utiliza SOM genera un error.

Esquema determinístico

Con un esquema determinístico, el analizador puede determinar lo que constituye una secuencia válida de elementos que se debe producir en un documento de instancia en función de la información del esquema.

El siguiente es un ejemplo de esquema XML determinístico en el que se especifica que un documento válido debe contener un elemento root, con un contenido que sea un elemento apple, seguido de un elemento berry, o bien un elemento coffee, seguido de un elemento dairy.

<?xml version="1.0" encoding="utf-8" ?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="root" type="rootTypes" />
<xs:complexType name="myKitchen">
        <xs:choice>
            <xs:sequence>
                <xs:element name="apple"/>
                <xs:element name="berry"/>
            </xs:sequence>
            <xs:sequence>
                <xs:element name="coffee"/>
                <xs:element name="dairy"/>
            </xs:sequence>
        </xs:choice>
    </xs:complexType>
</xs:schema>

Al utilizar el esquema anterior, durante el procesamiento de un documento de instancia, el analizador puede seguir la lógica del esquema, que especifica que si el elemento root va seguido en el documento del elemento apple, el analizador habrá encontrado la primera parte de la secuencia de apple y berry. Igualmente, si se encuentra el elemento coffee después de encontrar el elemento root, el analizador determina que ha encontrado la primera parte de la secuencia de coffee y dairy. Cualquier otro orden de los elementos en el documento de instancia no será válido de acuerdo con este esquema en particular.

Esquema no determinístico

Con un esquema no determinístico, el analizador no puede determinar una secuencia para los elementos en el documento que procesa. El siguiente es un ejemplo de esquema XML no determinístico.

<?xml version="1.0" encoding="utf-8" ?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="root" type="rootTypes" />
<xs:complexType name="myKitchen">
        <xs:choice>
            <xs:sequence>
                <xs:element name="apple"/>
                <xs:element name="berry"/>
            </xs:sequence>
            <xs:sequence>
                <xs:element name="apple"/>
                <xs:element name="coffee"/>
            </xs:sequence>
        </xs:choice>
    </xs:complexType>
</xs:schema>

Durante el procesamiento de un documento de instancia con el esquema no determinístico anterior, cuando el analizador encuentra el elemento root seguido de un elemento apple, no puede determinar, sin examinar el elemento siguiente, si el elemento apple es la primera parte de la secuencia de apple y berry, o la primera parte de la secuencia de apple y coffee. Como el analizador utilizado por SOM (Schema Object Model, Modelo de objetos de esquemas) no realiza comprobación hacia adelante, el analizador genera el mensaje de error Content model must be deterministic cuando se intenta llevar a cabo la validación mediante un esquema no determinístico.

Vea también

Modelo de objetos de esquemas XML (SOM) | Referencia de esquemas XML (XSD)