Pergunta

pode apontar-me alguém a respeito de porque o elemento único na minha XSD não está forçando único-ness? Isso deve lançar um erro, porque o último elemento ScreenResult não contém um valor exclusivo para o atributo Type. Gostaria também de salientar que estou verdadeiramente depois de forçar um de cada Type dentro ScreenResults (ScreenResult é necessário para existir 3 vezes, existem 3 tipos de telas e estou requerendo único-ness) por isso, se há uma maneira melhor de conseguir isso , eu sou tudo para isso também.

Obrigado.

Aqui está o meu trecho de XML:

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

Aqui está o meu XSD trecho (note também que meus trechos XSD originais abranger vários arquivos, mas tenho verificado todas as minhas namespaces estão corretas):

<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>
Foi útil?

Solução

Estou postando a minha solução para qualquer pessoa que corre para este problema.
Embora eu tinha afirmado que todos os meus namespaces estavam corretos, que foi, naturalmente o problema. Todos os namespaces estavam corretas exceto no próprio elemento único.
I assumiu erroneamente que o único elemento não precisa prefixar um espaço de nomes como era dentro do contexto. Mas esse não é o caso. Desde que eu fiz declarar um namespace padrão para o arquivo, eu ainda precisava do prefixo.

Assim, a minha única mudança, e a solução, é o seguinte:

<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 em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top