2011-01-02 11 views
1

Je suis en train de faire un XSD qui spécifie qu'un élément <a> doit avoir 4 éléments enfants <b>, qui contiennent les c attributs 1 à 4, comme suit:XSD: exiger des attributs à des valeurs spécifiques

valide:

<a> 
    <b c="1" d="valueof1" /> 
    <b c="2" d="valueof2" /> 
    <b c="3" d="valueof3" /> 
    <b c="4" d="valueof4" /> 
</a> 

Non valide:

<a> 
    <b c="1" d="valueof1" /> 
    <b c="1" d="valueof1_other" /> 
    <b c="3" d="valueof3" /> 
    <b c="4" d="valueof4" /> 
</a> 

Non valide:

<a> 
    <b c="1" d="valueof1" /> 
    <b c="2" d="valueof2" /> 
    <b c="3" d="valueof3" /> 
    <b c="4" d="valueof4" /> 
    <b c="5" d="valueof5" /> 
</a> 

Est-ce possible? La chose la plus proche que j'ai pu trouver est l'élément all, mais cela ne semble fonctionner que pour spécifier des éléments uniques, pas des valeurs d'attributs.

+0

Vous voudrez peut-être regarder Schematron http://www.schematron.com/ pour ce genre de restriction/validation. –

Répondre

0

Vous pouvez appliquer la première règle en déclarant comme si l'élément b avec minOccurs=4 et maxOccurs=4,:

<xs:element name="a"> 
    <xs:complexType> 
    <xs:sequence> 
     <xs:element name="b" minOccurs="4" maxOccurs="4"/> 
    </xs:sequence> 
    </xs:complexType> 
</xs:element> 

Cependant, vous ne pouvez pas utiliser XSD pour appliquer la deuxième règle. Si vous voulez vraiment faire cela, vous pouvez, par exemple, remplacer les 4 b éléments par les éléments b1, b2, b3, et b4, dont chacun représenterait implicitement les attributs c 1 à 4, respectivement.

+0

Vous pouvez faire de 'a/b/@ c' une clé avec une contrainte d'unicité globale, puis donner un type entier avec des facettes pour min = 1 et max = 4. Toujours ne pas interdire '1, 3, 2, 4' si ... – xan

Questions connexes