web-dev-qa-db-fra.com

XSD - l'un des 2 attributs est requis?

Existe-t-il un moyen de spécifier que l'un des 2 attributs est requis dans XSD?

par exemple, j'ai une définition comme celle-ci:

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

Je veux pouvoir définir qu'au moins un de ces éléments est requis. Est-ce possible?

57
user92454

Non, je ne pense pas que vous puissiez le faire avec des attributs. Vous pouvez envelopper deux <xs:element> dans une <xs:choice> - mais pour les attributs, il n'y a pas de construction équivalente, je le crains.

42
marc_s

XSD 1.1 vous permettra de le faire en utilisant des assertions.

<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>
23
jeremiah jahn

Marc a tout à fait raison ... Vous ne pouvez pas avoir d'éléments enfants xs: attribute dans un élément parent xs: choice dans XSD.

La logique semble être que si deux instances d'un élément ont un ensemble d'attributs s'excluant mutuellement, alors ce sont logiquement deux éléments différents.

Une solution de contournement a été présentée par Jeni Tennison ici .

9
Cerebrus

Vous devriez regarder ces pages sur le wiki du W3C: Implication d'attribut simple et Muttex d'attribut

5
Ondřej Doněk