我有以下 XSD :
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="Sea">
<xs:complexType>
<xs:sequence>
<xs:element ref="FishSubGroup"
minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>
<xs:attribute name="name" type="xs:string" use="optional"/>
</xs:complexType>
</xs:element>
<xs:element name="FishSubGroup" abstract="true"/>
<xs:element name="Tuna" type="FishType" substitutionGroup="FishSubGroup"/>
<xs:element name="Carp" type="FishType" substitutionGroup="FishSubGroup"/>
<xs:element name="Salmon" type="FishType" substitutionGroup="FishSubGroup"/>
<xs:complexType name="FishType">
<xs:attribute name="name" type="xs:string"/>
</xs:complexType>
</xs:schema>
此 XML 表示有效实例:
<?xml version="1.0" encoding="UTF-8"?>
<Sea name="Atlantic Ocean">
<Tuna name="tuna1"/>
<Carp name="carp1"/>
<Carp name="carp2"/>
<Tuna name="tuna2"/>
<Salmon name="salmon1"/>
</Sea>
注意:我从这个post中选取了一个很好的水生示例。
问题:
XSD中是否有一种方法可以定义一个约束,使其仅具有其类别中的单个替换元素?换句话说,我希望最多有1个金枪鱼,1个鲤鱼,1个鲑鱼等,如下所示:
<?xml version="1.0" encoding="UTF-8"?>
<Sea name="Atlantic Ocean">
<Tuna name="tuna1"/>
<Carp name="carp1"/>
<Carp name="carp2"/> <!-- <-- Invalid Carp Already Defined -->
<Tuna name="tuna2"/> <!-- <-- Invalid Tuna Already Defined -->
<Salmon name="salmon1"/>
</Sea>
答案 0 :(得分:1)
在XSD 1.0中,您可以通过确保Carp
元素具有固定值type="Carp"
的属性以及与其他元素类似的属性,然后定义一个xs:unique
约束来要求隐式type
属性在Sea
中是唯一的。
在XSD 1.1中,使用Sea
在test="count(*) = count(distinct-values(*/local-name()))"
元素上定义一个断言。 (用英语,元素的数量必须与不同的元素名称的数量相同。)