使用<xs:redefine>

时间:2015-11-12 18:28:29

标签: xml xsd

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

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>

1 个答案:

答案 0 :(得分:1)

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