我们遇到XSD(XML Scheme)和验证问题。基本上,我们需要限制在一个复杂类型中定义的属性值:
<xsd:element name="Modeling" type="CTypeRestric"/>
<xsd:complexType name="CTypeRestric">
<xsd:complexContent>
<xsd:restriction base="CType">
<xsd:sequence>
<xsd:element name="code" type="xsd:string"/>
</xsd:sequence>
<xsd:attribute name="c2">
<xsd:simpleType>
<xsd:restriction base="C2BaseRest"/>
</xsd:simpleType>
</xsd:attribute>
<xsd:attribute name="c3">
<xsd:simpleType>
<xsd:restriction base="C3BaseRest"/>
</xsd:simpleType>
</xsd:attribute>
</xsd:restriction>
</xsd:complexContent>
</xsd:complexType>
<xsd:simpleType name="C2BaseRest">
<xsd:restriction base="C2Base">
<xsd:enumeration value="p3"/>
<xsd:enumeration value="p4"/>
</xsd:restriction>
</xsd:simpleType>
<xsd:simpleType name="C3BaseRest">
<xsd:restriction base="C3Base">
<xsd:enumeration value="r5"/>
<xsd:enumeration value="r6"/>
<xsd:enumeration value="r7"/>
</xsd:restriction>
</xsd:simpleType>
...等...... 上面的代码试图限制这段代码:
<xsd:complexType name="CType">
<xsd:sequence>
<xsd:element name="code" type="xsd:string"/>
</xsd:sequence>
<xsd:attribute name="c2">
<xsd:simpleType>
<xsd:restriction base="C2Base"/>
</xsd:simpleType>
</xsd:attribute>
<xsd:attribute name="c3">
<xsd:simpleType>
<xsd:restriction base="C3Base"/>
</xsd:simpleType>
</xsd:attribute>
</xsd:complexType>
<xsd:simpleType name="C2Base">
<xsd:restriction base="xsd:string">
<xsd:enumeration value="p1"/>
<xsd:enumeration value="p2"/>
<xsd:enumeration value="p3"/>
<xsd:enumeration value="p4"/>
<xsd:enumeration value="p5"/>
</xsd:restriction>
</xsd:simpleType>
<xsd:simpleType name="C3Base">
<xsd:restriction base="xsd:string">
<xsd:enumeration value="r1"/>
<xsd:enumeration value="r2"/>
<xsd:enumeration value="r3"/>
<xsd:enumeration value="r4"/>
<xsd:enumeration value="r5"/>
<xsd:enumeration value="r6"/>
<xsd:enumeration value="r7"/>
</xsd:restriction>
</xsd:simpleType>
错误是:
“类型'CTypeRestric'不是'CType'类型的有效限制。 默认绑定“c2”不包含默认绑定“c2”。 复杂类型定义'CTypeRestric'不是通过类型定义'CType'的限制派生的。“
答案 0 :(得分:1)
您的基本类型中的c2
属性可能看起来不像C2Base
类型。它实际上有一个匿名的简单类型,它是C2Base
的限制:
<xsd:attribute name="c2">
<xsd:simpleType>
<xsd:restriction base="C2Base"/>
</xsd:simpleType>
</xsd:attribute>
要导出CTypeRestrict
,您的c2
必须不是C2Base
的限制,而是您定义的匿名simpleType
的限制,这是不可访问的。我的意思是,如果您的基本类型定义如下:
<xsd:attribute name="c2" type="c2_type"/>
<xsd:simpleType name="c2_type">
<xsd:restriction base="C2Base"/>
</xsd:simpleType>
然后您将能够通过基于c2
的限制来创建实际c2_type
类型的派生。但是,声明基于C2BaseRest
的simpleType(派生自C2Base
)不是有效限制,因为c2
的原始类型不是C2Base
(但源自的{匿名类型}它)。
如果您可以更改基本类型,则可以像这样声明c2
(作为使用空simpleType
的嵌套restriction
的替代方法) :
<xsd:attribute name="c2" type="C2Base"/>
现在,您的C2BaseRest
实际将成为c2
类型的有效限制,您的架构将会验证。
同样适用于c3
。
因此,要使模式验证,您应该将基础模式更改为:
<xsd:complexType name="CType">
<xsd:sequence>
<xsd:element name="code" type="xsd:string"/>
</xsd:sequence>
<xsd:attribute name="c2" type="C2Base"/>
<xsd:attribute name="c3" type="C3Base"/>
</xsd:complexType>
没有必要进行验证,但您可能也想在派生的中进行相同的操作。
<xsd:complexType name="CTypeRestric">
<xsd:complexContent>
<xsd:restriction base="CType">
<xsd:sequence>
<xsd:element name="code" type="xsd:string"/>
</xsd:sequence>
<xsd:attribute name="c2" type="C2BaseRest"/>
<xsd:attribute name="c3" type="C3BaseRest"/>
</xsd:restriction>
</xsd:complexContent>
</xsd:complexType>