29 votes

Schéma XML XSD - Renforcer les valeurs uniques des attributs dans le schéma

Disons que j'ai un schéma qui définit le XML suivant :

<Values>
    <Add Key="Key1">Value 1</Add>
    <Add Key="Key2">Value 2</Add>
    <Add Key="Key3">Value 3</Add>
    <Add Key="Key4">Value 4</Add>
</Values>

J'aimerais, au niveau du schéma, pouvoir imposer que les valeurs de l'attribut Key soient uniques, c'est-à-dire que l'exemple ci-dessus est valide, mais que l'exemple suivant serait invalide :

<Values>
    <Add Key="Key1">Value 1</Add>
    <Add Key="Key2">Value 2</Add>
    <Add Key="Key2">Value 3</Add>
    <Add Key="Key3">Value 4</Add>
</Values>

Remarquez qu'il y a deux Add avec un Key de Key2

Pour référence, voici le schéma simple :

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified">
    <xs:element name="Values">
        <xs:complexType>
            <xs:sequence>
                <xs:element name="Add" maxOccurs="unbounded">
                    <xs:complexType>
                        <xs:simpleContent>
                            <xs:extension base="xs:string">
                                <xs:attribute name="Key" type="xs:token" use="required"/>
                            </xs:extension>
                        </xs:simpleContent>
                    </xs:complexType>
                </xs:element>
            </xs:sequence>
        </xs:complexType>
    </xs:element>
</xs:schema>

J'ai l'impression que ce n'est pas possible au niveau du schéma, mais je suis tout ouïe.

40voto

Michael Kay Points 52194

@BatteryBackupUnit a la bonne idée, mais la syntaxe est plus du genre :

<xs:element name="Values">
  <xs:complexType>
    <xs:sequence>
      <xs:element ref="Key" maxOccurs="unbounded"/>
    </xs:sequence>
  </xs:complexType>
  <xs:unique name="UniqueAddKey">
    <xs:selector xpath="Add" /> 
    <xs:field xpath="@Key" /> 
  </xs:unique>
</xs:element>

3voto

BatteryBackupUnit Points 2509

Vous pouvez y parvenir en utilisant xs:unique

<xs:element name="Instrument">
  <xs:complexType>
   <xs:all>
    <xs:unique name="ModuleId">
      <xs:selector xpath="./*" /> 
      <xs:field xpath="@id" /> 
    </xs:unique>
   </xs:all>
  </xs:complexType>
</xs:element>

L'exemple ci-dessus imposera un attribut unique "id" pour tous les éléments de l'instrument. Il y a aussi xs:key, qui peut être utilisé pour établir une relation Clé primaire - Clé étrangère : http://www.datypic.com/books/defxmlschema/chapter17.html

2voto

kevinarpe Points 2902

Plus d'informations sur la réponse de Michael Kay : Si votre schéma (XSD) déclare un espace de noms, vous devez l'inclure dans votre sélection.xpath. Si vous utilisez Microsoft Visual Studio 2010, il se peut qu'un espace de noms soit déclaré automatiquement.

<xs:schema id="MyData"
    targetNamespace="http://tempuri.org/MyData.xsd"
    elementFormDefault="qualified"
    xmlns="http://tempuri.org/MyData.xsd"
    xmlns:mstns="http://tempuri.org/MyData.xsd"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
>
    ...
    <xs:unique name="UniqueAddKey">
        <xs:selector xpath="mstns:Add" /> 
        <xs:field xpath="@Key" /> 
    </xs:unique>
</xs:schema>

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X