XSD 1.0 では、唯一の選択肢は、制約を散文で文書化することです。(たとえば、スキーマのスキーマで行われているように、要素の宣言に同様の制約があります。)
XSD 1.1 では、アサーションを使用して制約を文書化し、適用できます。Petru Gardea によって提案されたスキーマ ドキュメントを少し変更すると、次のようになります。
<xs:schema targetNamespace="http://example.com/colors"
xmlns:tns="http://example.com/colors"
elementFormDefault="qualified"
xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:simpleType name="flowerColor">
<xs:restriction base="xs:normalizedString">
<xs:minLength value="1"/>
</xs:restriction>
</xs:simpleType>
<xs:complexType name="flowerVariantC">
<xs:sequence>
<xs:element name="color"
type="tns:flowerColor"
minOccurs="0"/>
</xs:sequence>
<xs:attribute name="color"
type="tns:flowerColor"
use="optional"/>
<xs:assert test="(./tns:color or ./@color)
and not(./tns:color and ./@color)"/>
</xs:complexType>
<xs:element name="flower" type="tns:flowerVariantC"/>
<xs:element name="test"/>
</xs:schema>
先ほど示したスキーマ ドキュメントと次の例を考えると、Saxon は最初と 4 番目の花要素を無効として拒否します。
<test xmlns="http://example.com/colors"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://example.com/colors colors.xsd">
<flower/>
<flower color="red"/>
<flower><color>blue</color></flower>
<flower color="blue"><color>blue</color></flower>
</test>
(とは言っても、私の本能は、このデザインを不必要に複雑にすることはしないようにアドバイスすることです。色を属性にするか、それを子にするかを選択してください。それぞれがもっともらしいデザインであるという事実は、ドキュメント内での変更を許可することを意味するものではありません。納得のデザインです。)