XML XSD架构 – 在架构中强制使用唯一的属性值

比方说,我有一个架构,定义了以下的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> 

我希望在模式层次上能够强制Key属性的值是唯一的,即上面的例子是有效的,但下面的例子是无效的:

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

请注意,有两个Add元素和一个Key2Key

这里的参考是简单的模式:

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

我的印象是,在模式层面这是不可能的,但是我都听过。

@BatteryBackupUnit有正确的想法,但语法更像是:

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

你可以通过使用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> 

上面的例子将强制所有工具元素的唯一属性“id”。 还有xs:key,可以用来build立主键 – 外键关系: http : //www.datypic.com/books/defxmlschema/chapter17.html

更多关于Michael Kay的回答:如果您的模式(XSD)声明了一个名称空间,则必须将其包含在您的selection.xpath中。 如果您使用的是Microsoft Visual Studio 2010,则可能会自动声明一个名称空间。

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