with validator validate validar online archivo xml schema xml-validation

validator - Esquema XML XSD: imponer valores de atributos únicos en el esquema



xml validator xsd (3)

Digamos que tengo un esquema que define el siguiente XML:

<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 nivel de esquema, poder imponer que los valores para el atributo Clave son únicos, es decir, el ejemplo anterior es válido, pero el siguiente ejemplo no sería válido:

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

Observe que hay dos elementos Add con una Key de Key2

Para 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 a nivel de esquema, sin embargo, soy todo oídos.


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


Más información sobre la respuesta de Michael Kay: Si su esquema (XSD) declara un espacio de nombres, debe incluir esto en su selection.xpath. Si está utilizando Microsoft Visual Studio 2010, puede encontrar un espacio de nombres 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>


Puedes lograr esto usando 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>

El ejemplo anterior impondrá un atributo único "id" para todos los elementos del instrumento. también hay xs: key, que se puede utilizar para establecer una relación de clave principal - clave externa: http://www.datypic.com/books/defxmlschema/chapter17.html