2011-04-04 104 views
38

可以说我有一个架构定义以下XML:XML XSD架构 - 强制使用唯一的属性值在架构

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

我想,在架构层面,要能够强制执行的价值观关键属性是唯一的,即上面的例子中是有效的,但下面的例子将是无效的:

<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元件与KeyKey2

仅供参考下面是简单的模式:

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

我的印象是,这是不可能在一个模式下的水平,但是我所有的耳朵。

回答

49

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

请更多的解释,并没有得到它,我的意思只是把这个模式 – Tarek 2013-08-17 13:52:58

+1

你在找什么样的解释生成的XML?解释xs:unique的XSD教程?你一定可以在任何一本像样的书或XSD教程中找到它。 – 2013-08-17 16:46:25

+0

应该是? – 2016-03-02 02:44:50

6

您可以通过使用XS实现这一点:独特

<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:键,可以用来建立主键 - 外键关系: http://www.datypic.com/books/defxmlschema/chapter17.html

5

更多迈克尔凯的回答:如果您的模式(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>