2

如果可能,我想禁止使用从基本模式 (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感谢 Michael

基本架构(已编辑)

<?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>
4

1 回答 1

3

xs:override(与 xs:redefine 不同)不允许您通过从旧类型派生来定义新类型,而是“从头开始”定义原始类型的替换。如果您想减少在新定义中不必要地复制的东西的数量,请使用粒度更小的组件,例如将每个属性定义为全局属性组,因此您只需覆盖其中一个。(但我有一种感觉,在属性组中将属性定义为禁止是无效的,因此这可能行不通。)

于 2014-02-13T18:27:10.553 回答