Вы не можете сделать это в XML Schema 1.0. В XML Schema 1.1 вы сможете использовать для этого элемент <xs:assert>
, но я предполагаю, что вы хотите что-то, что вы можете использовать сейчас.
Вы можете использовать Schematron в качестве второго уровня проверки, который позволит вам проверить произвольные утверждения XPath относительно вашего XML-документа. Есть довольно старая статья о встраивании Schematron в XSD , которая может оказаться вам полезной.
Вы бы сделали что-то вроде:
<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>
Или, конечно, вы можете переключиться на RELAX NG , который делает это во сне:
<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>