【问题标题】:XSD element substitution group example?XSD 元素替换组示例?
【发布时间】:2017-02-13 14:12:10
【问题描述】:

我希望能够为多个扩展类型指定单选类型。

比如说我们有海,海里有很多种鱼。所以我会在 XML 中写:

<Sea name="Atlantic Ocean">
 <Tuna name="tuna1" />
 <Carp name="carp1" />
 <Carp name="carp2" />
 <Tuna name="tuna2" />
 <Salmon name="salmon1" />
</Sea>

XSD

  <xs:complexType name="Fish">
  </xs:complexType>

  <xs:complexType name="Salmon">
    <xs:complexContent>
      <xs:extension base="Fish">
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>

  <xs:complexType name="Carp">
    <xs:complexContent>
      <xs:extension base="Fish">
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>

  <xs:complexType name="Tuna">
    <xs:complexContent>
      <xs:extension base="Fish">
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>

  <xs:complexType name="Sea">
    <xs:complexContent>
      <xs:extension base="GeoZone">
        <xs:sequence minOccurs="0" maxOccurs="unbounded">
          <xs:choice>
            <xs:element type="Fish" name="Fish" minOccurs="0" 
                        maxOccurs="unbounded"/>
          </xs:choice>
        </xs:sequence>
        <xs:attribute name="Name" type="xs:string" use="optional" />
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>

不幸的是,这是无效的,因为我只能添加类型 Fish 本身而不是它的扩展类型。

【问题讨论】:

    标签: xml xsd xsd-validation xml-validation


    【解决方案1】:

    使用element substitution group...

    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>
    

    【讨论】:

      猜你喜欢
      • 2020-01-07
      • 1970-01-01
      • 1970-01-01
      • 2014-10-25
      • 2017-04-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-06
      相关资源
      最近更新 更多