2011-04-27 3 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> 
Смежные вопросы