2014-05-19 32 views
1

選擇題,我需要一個像這樣的XML:XSD:沒有重複

<permission> 
    <userType>Root</userType> 
    <userType>Admin</userType> 
</permission> 

和值從一個枚舉這樣的:

<xs:simpleType name="USERS"> 
    <xs:restriction base="xs:string"> 
     <xs:enumeration value="Root"/> 
     <xs:enumeration value="Admin"/> 
     <xs:enumeration value="User"/> 
     <xs:enumeration value="Guest"/> 
    </xs:restriction> 
</xs:simpleType> 

的問題是,如何我已經是正確的現在它接受重複的值。

<xs:element name="permission"> 
      <xs:complexType> 
       <xs:sequence> 
        <xs:element name="userType" minOccurs="0" maxOccurs="unbounded" type="USERS"/> 
       </xs:sequence> 
      </xs:complexType> 
     </xs:element> 

我該怎麼做,以便enum中每個值只有一次出現?

回答

2

您可以添加唯一性約束對於userType內容:

<xs:element name="permission"> 
    <xs:complexType> 
     <xs:sequence> 
      <xs:element name="userType" minOccurs="0" maxOccurs="unbounded" type="USERS"/> 
     </xs:sequence> 
    </xs:complexType> 
    <xs:unique name="uniqueUserType"> 
     <xs:selector xpath="userType"/> 
     <xs:field xpath="."/> 
    </xs:unique> 
</xs:element> 

在此約束下,在userType重複的名稱不會驗證:

<permission> 
    <userType>Root</userType> 
    <userType>Admin</userType> 
    <userType>Admin</userType> 
</permission> 

如果您的架構聲明的目標命名空間,您需要爲其聲明前綴,以便可以通過XPath表達式找到它(它考慮非前綴選擇器屬於無名稱空間),即使您聲明瞭默認名稱空間。例如,你需要有:

<xs:schema ... targetNamespace="my-namespace" xmlns:prefix="mynamespace"> ... 

,並使用該前綴您的位置路徑:

<xs:selector xpath="prefix:userType"/>