Ограничить значение атрибута дочерним атрибутом (ссылаться на существующее значение) - PullRequest
3 голосов
/ 27 апреля 2011

У меня есть такой xml-код:

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

Как ограничить значение атрибута 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>  

1 Ответ

8 голосов
/ 29 ноября 2011

Это вполне возможно. Вот пример 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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...