2011-04-04 360 views
38

Digamos que tengo un esquema que define el siguiente código XML:XML esquema XSD - Forzar valores de atributo único en el esquema

<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> 

me gustaría, a un nivel de esquema, para ser capaz de hacer cumplir que los valores de el atributo de clave son únicos, es decir, el ejemplo anterior es válido, pero el siguiente ejemplo no sería válida:

<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> 

cuenta de que hay dos Add elementos con un Key de Key2

Como referencia aquí es el esquema 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> 

Tengo la impresión de que esto no es posible en un nivel de esquema, sin embargo yo soy todo oídos.

Respuesta

49

@BatteryBackupUnit tiene la idea correcta, pero la sintaxis es más como:

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

favor una explicación más detallada, no lo entendía, me refiero sólo hay que poner el código XML producido por este esquema – Tarek

+1

¿Qué tipo de explicación está buscando? Un tutorial de XSD que explica xs: ¿único? Seguramente puede encontrarlo en cualquier libro o tutorial decente en XSD. –

+0

¿Debería ser ? –

6

se puede lograr esto mediante el uso de xs: única

<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> 

el ejemplo anterior se impondrá un único atributo "id" para todos los elementos del instrumento. También ha xs: llave, que se puede utilizar para establecer una clave principal - Extranjero relación clave: http://www.datypic.com/books/defxmlschema/chapter17.html

5

Más sobre Respuesta de Michael Kay: si su esquema (XSD) declara un espacio de nombre, debe incluir esto en su selection.xpath. Si está utilizando Microsoft Visual Studio 2010, puede encontrar un espacio de nombre declarado automáticamente.

<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> 
Cuestiones relacionadas