在 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 拒绝第一和第四朵花元素为无效。
<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>
(也就是说,我的直觉是反对这种设计过于复杂:选择将颜色作为属性,或者选择将其设为子元素。每个都是合理的设计这一事实并不意味着允许它在文档中变化是一个合理的设计。)