Подтвердить что ты не робот

XSD - требуется один из двух атрибутов?

Есть ли способ указать, что в XSD требуется один из 2 атрибутов?

например, у меня есть такое определение:

<xs:attribute name="Name" type="xs:string" use="optional" />
<xs:attribute name="Id" type="xs:string" use="optional" />

Я хочу быть в состоянии определить, что по крайней мере один из них требуется. Это возможно?

4b9b3361

Ответ 1

Нет, я не думаю, что вы можете сделать это с атрибутами. Вы можете обернуть два <xs:element> в <xs:choice> но я боюсь, что для атрибутов не существует эквивалентной конструкции.

Ответ 2

XSD 1.1 позволит вам сделать это с помощью утверждений.

<xsd:element name="remove">
    <xsd:complexType>                        
        <xsd:attribute name="ref" use="optional"/>
        <xsd:attribute name="uri" use="optional"/>
        <xsd:assert test="(@ref and not(@uri)) or (not(@ref) and @uri)"/>            
    </xsd:complexType>
</xsd:element>

Ответ 3

Марк совершенно прав... У вас не может быть xs: атрибут дочерних элементов внутри элемента xs: choice parent в XSD.

Логика, похоже, состоит в том, что если два экземпляра элемента имеют взаимоисключающий набор атрибутов, то они логически представляют собой два разных элемента.

Обходной путь для этого был представлен Jeni Tennison здесь.

Ответ 5

В примере определяется элемент с именем "человек", который должен содержать элемент "сотрудник" или элемент "член".

<xs:element name="person">
  <xs:complexType>
    <xs:choice>
      <xs:element name="employee" type="employee"/>
      <xs:element name="member" type="member"/>
    </xs:choice>
  </xs:complexType>
</xs:element>