我想禁止使用从基础架构(BaseSchema.xsd)继承的属性(下划线),如果可能的话,不按照以下示例中演示的方式重新定义整个元素TextType:
基本架构(BaseSchema.xsd)
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">
<xs:element name="Text" type="TextType"/>
<xs:complexType name="TextType"> <!-- Actual example is much longer -->
<xs:attribute name="bold" type="xs:boolean"/>
<xs:attribute name="italics" type="xs:boolean"/>
<xs:attribute name="underline" type="xs:boolean"/>
</xs:complexType>
</xs:schema>
派生架构(DerivedSchema.xsd)
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">
<xs:override schemaLocation="BaseSchema.xsd">
<xs:complexType name="TextType">
<xs:simpleContent>
<xs:extension base="TextType">
<xs:attribute name="underline" type="xs:boolean" use="prohibited"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
</xs:override>
</xs:schema>
这里的问题是TextType
中的<xs:extension base="TextType">
相当于循环定义,我想将其标识为基本模式中定义的TextType
。
解决方案,基于xs:redefine 感谢迈克尔
基本架构(已编辑)
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">
<xs:element name="Text" type="TextType"/>
<xs:complexType name="TextType">
<xs:simpleContent>
<xs:extension base="xs:string">
<xs:attribute name="bold" type="xs:boolean"/>
<xs:attribute name="italics" type="xs:boolean"/>
<xs:attribute name="underline" type="xs:boolean"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
</xs:schema>
派生架构(已编辑)
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">
<xs:redefine schemaLocation="BaseSchema.xsd">
<xs:complexType name="TextType">
<xs:simpleContent>
<xs:restriction base="TextType">
<xs:attribute name="underline" type="xs:boolean" use="prohibited"/>
</xs:restriction>
</xs:simpleContent>
</xs:complexType>
</xs:redefine>
</xs:schema>
答案 0 :(得分:3)
xs:override(与xs:redefine不同)不允许您通过派生从旧类型定义新类型,而是“从头开始”定义原始类型的替换。如果要减少在新定义中不必要地复制的内容量,请使用较小粒度的组件,例如:将每个属性定义为全局属性组,因此您只需要覆盖其中一个属性。 (但我觉得在属性组中将属性定义为禁用属性是无效的,因此可能无效。)