Pregunta

¿Alguien puede señalarme por qué el elemento único en mi XSD no está forzando la unicidad? Esto debería generar un error porque el último elemento ScreenResult no contiene un valor único para el atributo Tipo . También debo tener en cuenta que estoy realmente después de forzar uno de cada Type dentro de ScreenResults ( ScreenResult debe existir 3 veces, hay 3 tipos de pantallas y estoy requiriendo unicidad) así que si hay una mejor manera de lograrlo, también estoy a favor de eso.

Gracias.

Aquí está mi fragmento XML:

<ScreenResults>
    <ScreenResult Type="Screen Type A">1</ScreenResult>
    <ScreenResult Type="Screen Type B">1</ScreenResult>
    <ScreenResult Type="Screen Type B">2</ScreenResult>
</ScreenResults>

Aquí está mi fragmento XSD (también tenga en cuenta que mis fragmentos XSD originales abarcan varios archivos pero he verificado que todos mis espacios de nombres son correctos):

<xs:element name="ScreenResults" type="import:ScreenResults" minOccurs="0" maxOccurs="1">
    <xs:unique name="UniqueScreenResults">
        <xs:selector xpath="ScreenResult" />
        <xs:field xpath="@Type" />
    </xs:unique>
</xs:element>

<!--============  ScreenResults  =============-->
<xs:complexType name="ScreenResults">
    <xs:sequence minOccurs="1" maxOccurs="1">
        <xs:element name="ScreenResult" minOccurs="3" maxOccurs="3">
            <xs:complexType>
                <xs:simpleContent>
                    <xs:extension base="enum:ScreenResult">
                        <xs:attribute name="Type" type="enum:ScreenType" use="required" />
                    </xs:extension>
                </xs:simpleContent>
            </xs:complexType>
        </xs:element>
    </xs:sequence>
</xs:complexType>

<!--=============  ScreenType  =============-->
<xs:simpleType name="ScreenType">
    <xs:restriction base='xs:token'>
        <xs:enumeration value='Screen Type A' >
            <xs:annotation>
                <xs:documentation>1</xs:documentation>
            </xs:annotation>
        </xs:enumeration>
        <xs:enumeration value='Screen Type B' >
            <xs:annotation>
                <xs:documentation>2</xs:documentation>
            </xs:annotation>
        </xs:enumeration>
        <xs:enumeration value='Screen Type C' >
            <xs:annotation>
                <xs:documentation>3</xs:documentation>
            </xs:annotation>
        </xs:enumeration>
    </xs:restriction>
</xs:simpleType>

<!--============  ScreenResult  ============-->
<xs:simpleType name="ScreenResult">
    <xs:restriction base='xs:token'>
        <xs:enumeration value='1' >
            <xs:annotation>
                <xs:documentation>Positive</xs:documentation>
            </xs:annotation>
        </xs:enumeration>
        <xs:enumeration value='2' >
            <xs:annotation>
                <xs:documentation>Negative</xs:documentation>
            </xs:annotation>
        </xs:enumeration>
        <xs:enumeration value='3' >
            <xs:annotation>
                <xs:documentation>Not administered</xs:documentation>
            </xs:annotation>
        </xs:enumeration>
    </xs:restriction>
</xs:simpleType>
¿Fue útil?

Solución

Estoy publicando mi solución para cualquier persona que se encuentre con este problema.
Aunque había afirmado que todos mis espacios de nombres eran correctos, ese era, por supuesto, el problema. Todos los espacios de nombres eran correctos excepto en el elemento único en sí.
Asumí erróneamente que el elemento único no necesitaría prefijar un espacio de nombres tal como estaba dentro del contexto. Pero ese no es el caso. Como sí declaró un espacio de nombres predeterminado para el archivo, todavía necesitaba el prefijo.

Entonces, mi único cambio, y la solución, es la siguiente:

<xs:element name="ScreenResults" type="import:ScreenResults" minOccurs="0" maxOccurs="1">
    <xs:unique name="UniqueScreenResults">
        <xs:selector xpath="import:ScreenResult" />
        <xs:field xpath="@Type" />
    </xs:unique>
</xs:element>
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top