2012-11-24 195 views
0

我有一個像下面這樣的輸入XML模式,我希望我的模式能做2件事情,因爲我不確定如何編碼下面2個約束。XML模式唯一約束

  1. 當一個元件「成立」的存在,在另一元件「planToEstablish」絕不能occured.Vice反之亦然如果元素「planToEstablish」存在,則「已建立」元素不能exists.And兩個元件的可能不也存在。
  2. Farm元素需要通過「farmOwnerName」和「produce」屬性進行驗證。例如,如果farmOwnerName =「Jerry」produce =「apple」,那麼我們不能允許存儲具有相同farmOwnerName =「Jerry」produce =「apple」的另一個農場。但是,只要「農產品」或「farmOwnerName」不同,我們仍然可以存儲其他農場元素。例如farmOwnerName =「Jerry」produce =「orange」仍然可以存儲。

下面是輸入的XML文件。

<Country> 
<farm farmOwnerName="Jerry" produce="apple"> 
    <established>1974</established> 
    <totalWorker>30</totalWorker> 
</farm> 
<farm farmOwnerName="Ronald" produce="apple"> 
    <totalWorker>15</totalWorker> 
</farm> 
<farm farmOwnerName="Richard" produce="lemon"> 
    <planToEstablish>1970</planToEstablish> 
    <totalWorker>20</totalWorker> 
</farm> 
</Country> 

下面是我現在使用的XML架構代碼。

<?xml version="1.0" encoding="UTF-8"?> 
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" > 
<xs:element name="established" type="xs:integer"/> 
<xs:element name="planToEstablish" type="xs:integer"/> 
<xs:element name="totalWorker" type="xs:integer"/> 

<xs:element name="Country"> 

<xs:complexType name="farm"> 
<xs:sequence maxOccurs="unbounded"> 
    <xs:element ref="established" use="optional"/> 
    <xs:element ref="planToEstablish" use="optional"/> 
    <xs:element ref="totalWorker"/> 
</xs:sequence> 
<xs:attribute name="farmOwnerName" use="required"/> 
<xs:attribute name="produce" use="required"/> 
<xs:attribute name="quality" use="optional"> 
    <xs:simpleType> 
     <xs:restriction base="xs:token"> 
      <xs:enumeration value="best"/> 
      <xs:enumeration value="normal"/> 
      <xs:enumeration value="low"/> 
     </xs:restriction> 
    </xs:simpleType> 
</xs:attribute> 
</xs:complexType> 
</xs:element> 
</xs:schema> 

回答

0

你先約束achived一個選擇:

<xs:choice minOccurs="0"> 
    <xs:element ref="established" use="optional"/> 
    <xs:element ref="planToEstablish" use="optional"/> 
</xs:choice> 

第二個制約因素與一個xs實現:唯一約束與選擇國元設置爲「農場」,和田地上@farmOwnerName和@produce。