在架构扩展中使用复杂类型

时间:2015-06-03 18:30:37

标签: xml xsd

我想扩展现有模式,以将复杂类型添加到现有复杂类型。这可能吗?我已经尝试过以下代码,但它无效。

<?xml version="1.0"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">

    <!-- Types -->
    <xs:complexType name="plotType">     
        <xs:sequence>
            <xs:element name="bufferSize"   type="xs:decimal"/>
        </xs:sequence>
    </xs:complexType>

    <!-- Base Schema w/ connection restrictions -->
    <xs:redefine schemaLocation="baseConfig.xsd">
        <xs:simpleType name="connectionName">
            <xs:restriction base="connectionName">
                <xs:pattern value="test"/>
            </xs:restriction>
        </xs:simpleType>    

        <!-- Additional default values -->
        <xs:complexType name="baseGuiConfigType">
            <xs:complexContent>
                <xs:extension base="baseGuiConfigType">
                    <xs:sequence>
                        <xs:element name="plot" type="plotType"/>
                    </xs:sequence>
                </xs:extension>
            </xs:complexContent>
        </xs:complexType>
    </xs:redefine>

</xs:schema>

1 个答案:

答案 0 :(得分:0)

是的,正如Michael Kay所说,除了内置类型之外,还可以使用complexTypes扩展架构。

问题是必须在plotType块之后定义redefine。像这样重构代码可以解决问题:

<?xml version="1.0"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">

    <xs:redefine schemaLocation="baseConfig.xsd">
        <xs:simpleType name="connectionName">
            <xs:restriction base="connectionName">
                <xs:pattern value="test"/>
            </xs:restriction>
        </xs:simpleType>    

        <!-- Additional default values -->
        <xs:complexType name="baseGuiConfigType">
            <xs:complexContent>
                <xs:extension base="baseGuiConfigType">
                    <xs:sequence>
                        <xs:element name="plot" type="plotType"/>
                    </xs:sequence>
                </xs:extension>
            </xs:complexContent>
        </xs:complexType>
    </xs:redefine>

    <!-- Types -->
    <xs:complexType name="plotType">     
        <xs:sequence>
            <xs:element name="bufferSize"   type="xs:decimal"/>
        </xs:sequence>
    </xs:complexType>
</xs:schema>