Question

Quelqu'un peut-il m'indiquer pourquoi l'élément unique de mon XSD ne force pas l'unicité? Cela devrait provoquer une erreur car le dernier élément ScreenResult ne contient pas de valeur unique pour l'attribut Type . Je devrais également noter que je suis vraiment après avoir forcé un de chaque Type dans ScreenResults ( ScreenResult doit exister 3 fois, il y a 3 types d’écrans et j’ai besoin d’un caractère unique), donc s’il existe un meilleur moyen de réaliser cela, je suis tout aussi favorable à cela.

Merci.

Voici mon extrait de code XML:

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

Voici mon extrait de code XSD (notez également que mes extraits de code XSD d'origine couvrent plusieurs fichiers mais que tous mes espaces de noms sont corrects):

<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>
Était-ce utile?

La solution

Je publie ma solution pour tous ceux qui rencontrent ce problème.
Bien que j'avais affirmé que tous mes espaces de noms étaient corrects, c'était bien sûr le problème. Tous les espaces de noms étaient corrects sauf sur l'élément unique lui-même.
J'ai supposé à tort que l'élément unique n'aurait pas besoin de préfixer un espace de nom tel qu'il était dans le contexte. Mais ce n'est pas le cas. Puisque j'ai déclaré un espace de noms par défaut pour le fichier, j'avais toujours besoin du préfixe.

Donc, mon seul changement, et la solution, est la suivante:

<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>
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top