XSD属性限制失败

时间:2014-03-20 18:56:03

标签: xml xsd

我们遇到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'的限制派生的。“

1 个答案:

答案 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>