XSD 元素替换组强制约束

XSD element substitution group enforce constraint

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

注意:我从这个 中获取了很好的水生示例。

问题:

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>

您可以在 XSD 1.0 中做到这一点,方法是确保 Carp 元素具有固定值 type="Carp" 的属性,对于其他元素也类似,然后定义一个 xs:unique 约束要求隐式 type 属性在 Sea.

中是唯一的

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