2008-10-08 7 views

Répondre

6

Vous ne pouvez pas le faire dans le schéma XML 1.0. Dans XML Schema 1.1, vous pouvez utiliser le <xs:assert> element pour le faire, mais je suppose que vous voulez quelque chose que vous pouvez utiliser maintenant.

Vous pouvez utiliser Schematron comme deuxième couche de validation qui vous permettra de tester des assertions XPath arbitraires sur votre document XML. Il y a un article assez ancien sur embedding Schematron in XSD que vous pourriez trouver utile.

Tu ferais quelque chose comme:

<rule context="element"> 
    <report test="@attribute = 'foo' and *[not(self::bar)]"> 
    This element's attribute is 'foo' but it holds an element that isn't a bar. 
    </report> 
    <report test="@attribute = 'hello' and *[not(self::world)]"> 
    This element's attribute is 'hello' but it holds an element that isn't a world. 
    </report> 
</rule> 

Ou bien sûr, vous pouvez passer à RELAX NG, qui fait cela dans son sommeil:

<element name="element"> 
    <choice> 
    <group> 
     <attribute name="attribute"><value>foo</value></attribute> 
     <element name="bar"><empty /></element> 
    </group> 
    <group> 
     <attribute name="attribute"><value>hello</value></attribute> 
     <element name="world"><empty /></element> 
    </group> 
    </choice> 
</element> 
Questions connexes