2011-04-04 77 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>