2011-04-27 90 views
3

我有這樣一個xml:限制屬性值子屬性(參考現有值)

<userCredentials default="user1" > 
    <userCredential username="user1" password="pwd" /> 
    <userCredential username="user2" password="pwd" /> 
    <userCredential username="user3" password="pwd" /> 
</userCredentials> 

我怎樣才能resrict屬性default的值是唯一//userCredential[@username]價值之一嗎?

下面我xsd原理:

<xs:complexType name="userCredential"> 
    <xs:attribute name="username" type="xs:string" use="required" /> 
    <xs:attribute name="password" type="xs:string" use="required" /> 
</xs:complexType>  

<xs:complexType name="userCredentials"> 
    <xs:sequence> 
    <xs:element name="userCredential" type="tns:userCredential" minOccurs="1" 
       maxOccurs="unbounded" /> 
    </xs:sequence> 
    <xs:attribute name="default" use="required" > 
     <xs:simpleType> 
     <xs:restriction> 
      <xs:pattern value="" /> 
     </xs:restriction> 
     </xs:simpleType> 
    </xs:attribute>   
</xs:complexType> 

回答

8

這是完全有可能的。下面是一個示例XSD,它強制塊內所有用戶名的唯一性,並且還要求default屬性引用其中一個值:

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
    <xs:element name="userCredentials" type="CredsType"> 

    <!-- ensure all user names are unique --> 
    <xs:unique name="uniqueUserNames"> 
     <xs:selector xpath="userCredential"/> 
     <xs:field xpath="@username"/> 
    </xs:unique> 

    <!-- ensure that the `default` attribute references existing username --> 
    <xs:keyref name="defaultNameRef" refer="userNames"> 
     <xs:selector xpath="."/> 
     <xs:field xpath="@default"/> 
    </xs:keyref> 
    <xs:key name="userNames"> 
     <xs:selector xpath="./userCredential"/> 
     <xs:field xpath="@username"/> 
    </xs:key> 
    </xs:element> 

    <xs:complexType name="CredsType"> 
    <xs:sequence> 
     <xs:element name="userCredential" type="UserCredentialType" 
        maxOccurs="unbounded" /> 
    </xs:sequence> 
    <xs:attribute name="default" type="xs:NCName" /> 
    </xs:complexType> 

    <xs:complexType name="UserCredentialType"> 
    <xs:attribute name="username" type="xs:NCName"/> 
    <xs:attribute name="password" type="xs:string"/> 
    </xs:complexType> 
</xs:schema>