XSD元素替换组强制约束

时间:2019-09-04 16:12:12

标签: xml xsd xsd-validation

我有以下 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>

1 个答案:

答案 0 :(得分:1)

在XSD 1.0中,您可以通过确保Carp元素具有固定值type="Carp"的属性以及与其他元素类似的属性,然后定义一个xs:unique约束来要求隐式type属性在Sea中是唯一的。

在XSD 1.1中,使用Seatest="count(*) = count(distinct-values(*/local-name()))"元素上定义一个断言。 (用英语,元素的数量必须与不同的元素名称的数量相同。)