XSD - требуется один из 2 атрибутов? - PullRequest
55 голосов
/ 18 апреля 2009

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

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

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

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

Ответы [ 5 ]

42 голосов
/ 18 апреля 2009

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

22 голосов
/ 01 августа 2013

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>
9 голосов
/ 18 апреля 2009

Марк совершенно прав ... Вы не можете иметь дочерние элементы xs: attribute внутри родительского элемента xs: choice в XSD.

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

Обходной путь для этого был представлен Джени Теннисон здесь .

5 голосов
/ 13 августа 2012

Вы должны посмотреть на эти страницы в W3C Wiki: Простые атрибуты и Атрибут muttex

0 голосов
/ 24 марта 2015

В этом примере определяется элемент с именем person, который должен содержать либо элемент employee, либо элемент member.

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