Ответ 1
Нет, я не думаю, что вы можете сделать это с атрибутами. Вы можете обернуть два <xs:element>
в <xs:choice>
но я боюсь, что для атрибутов не существует эквивалентной конструкции.
Есть ли способ указать, что в XSD требуется один из 2 атрибутов?
например, у меня есть такое определение:
<xs:attribute name="Name" type="xs:string" use="optional" />
<xs:attribute name="Id" type="xs:string" use="optional" />
Я хочу быть в состоянии определить, что по крайней мере один из них требуется. Это возможно?
Нет, я не думаю, что вы можете сделать это с атрибутами. Вы можете обернуть два <xs:element>
в <xs:choice>
но я боюсь, что для атрибутов не существует эквивалентной конструкции.
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>
Марк совершенно прав... У вас не может быть xs: атрибут дочерних элементов внутри элемента xs: choice parent в XSD.
Логика, похоже, состоит в том, что если два экземпляра элемента имеют взаимоисключающий набор атрибутов, то они логически представляют собой два разных элемента.
Обходной путь для этого был представлен Jeni Tennison здесь.
Вы должны взглянуть на эти страницы в W3C Wiki: Простое использование атрибутов и атрибут Muttex.
В примере определяется элемент с именем "человек", который должен содержать элемент "сотрудник" или элемент "член".
<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>