XSD - 覆盖元素

时间:2011-06-10 08:36:22

标签: xsd

我有一个基类,标记为抽象:

<!-- TYPE: BASE CLASS -->
<xs:complexType name="BaseClass" abstract="true">
    <xs:sequence>
        <xs:element name="name" type="xs:string" minOccurs="1" maxOccurs="1"/>
        <xs:element name="implementation" type="BaseClass" minOccurs="0" maxOccurs="1"/>
    </xs:sequence>
</xs:complexType>

现在继承BaseClass并使用null覆盖'implementation'的类:

<xs:complexType name="MyClass">
    <xs:complexContent>
        <xs:extension base="BaseClass"/>
    </xs:complexContent>
</xs:complexType>

我试过这个但是无效:

<xs:complexType name="MyClass">
    <xs:complexContent>
        <xs:extension base="BaseClass">
            <xs:sequence>
                <xs:element name="implementation" fixed="xs:nil"/>
            </xs:sequence>
        </xs:extension>
    </xs:complexContent>
</xs:complexType>

有办法做到这一点吗?

1 个答案:

答案 0 :(得分:1)

在XSD架构中将某些内容标记为抽象基本上意味着它不能出现在实例文档中。它应该与substitutionGroup属性一起使用。

例如

<xs:element name="replaceme" abstract="true" /> 
<xs:element name="replacement1" substitutionGroup="replaceme" />
<xs:element name="replacement2" substitutionGroup="replaceme" />

这意味着在实例文档中,您将被强制使用“replacement1”或“replacement2”元素,即xsd强制您将“replaceme”元素替换为替换组中的一个替换元素。

因此,要实现您想要的功能,您需要创建一个由您要使用的类型而不是基类型组成的替换组。我不确定复杂类型是否可行但是可以试一试。