使用 <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,人们可以在其中做任何想做的事。
我有以下架构(已简化以删除我们未讨论的类型):
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,人们可以在其中做任何想做的事。