使用 <xs:redefine> 从复杂类型的模式中删除元素

remove element from complex type of schema with <xs:redefine>

我有以下架构(已简化以删除我们未讨论的类型):

baseGUIconfig.xsd

<?xml version="1.0"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">

  <!-- Types -->
  <xs:complexType name="defaultsType">   
      <xs:sequence>
          <xs:element name="dataDirectory"              type="xs:string"/>
          <xs:element name="UpstreamDataFileExtension"  type="xs:string"/>
          <xs:element name="LocalDataFileExtension"     type="xs:string"/>
          <xs:element name="connectionTimeoutMs"        type="xs:decimal"/>
          <xs:element name="connectionMaxRetry"         type="xs:decimal"/>
      </xs:sequence>
      <xs:attribute name="os" use="required">
          <xs:simpleType>
              <xs:restriction base="xs:string">
                  <xs:enumeration value="linux"/>
                  <xs:enumeration value="windows"/>
              </xs:restriction> 
          </xs:simpleType>
      </xs:attribute>
  </xs:complexType>
  
  <xs:complexType name="baseGuiConfigType">
      <xs:sequence>
          <xs:element name="defaults" type = "defaultsType" minOccurs="1" maxOccurs="2" />
      </xs:sequence>
  </xs:complexType>

  <!-- Elements -->
  <xs:element name="baseGuiConfig" type="baseGuiConfigType" />

</xs:schema>

但是,我有另一个模式重新定义了这个模式。在其中,我想删除 UpstreamDataFileExtension 元素。是否可以删除元素,或者以派生模式不再具有的方式重新定义 defaultsType

这是我尝试过的方法(无效):

重新定义架构

<?xml version="1.0"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <!-- Base Schema w/ connection restrictions -->
    <xs:redefine schemaLocation="qrc:///schema/baseGUIconfig.xsd">  
        <!-- Redefine the defaultsType to remove Upstream -->
        <xs:complexType name="defaultsType">
            <xs:complexContent>
                <xs:restriction base="defaultsType">
                  <xs:sequence>
                    <xs:element name="dataDirectory"            type="xs:string"/>
                    <xs:element name="LocalDataFileExtension"   type="xs:string"/>
                    <xs:element name="connectionTimeoutMs"      type="xs:decimal"/>
                    <xs:element name="connectionMaxRetry"       type="xs:decimal"/>
                  </xs:sequence>        
                </xs:restriction>
            </xs:complexContent>
        </xs:complexType>
    </xs:redefine>  
</xs:schema>

您不能在 XSD 1.0 中执行此操作,因为您尝试删除的元素是强制性的。限制机制的设计使得新类型的有效 XML 在与原始(受限)类型匹配时必须仍然有效。新的 XSD 1.1 引入了一种新结构,override,人们可以在其中做任何想做的事。