これは XML スキーマ 1.0 ではできません。XML Schema 1.1 では、<xs:assert>
要素を使用してそれを行うことができますが、今すぐ使用できるものが必要になると思います。
XML ドキュメントに関する任意の XPath アサーションをテストできる検証の 2 番目のレイヤーとしてSchematronを使用できます。XSD への Schematron の埋め込みに関するかなり古い記事が参考になるかもしれません。
次のようにします。
<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>