从导入的XSD扩展复杂类型

时间:2014-10-03 23:16:03

标签: xml xsd

我正在尝试从导入的XSD扩展复杂类型。这是为了模仿基类/继承的类结构。现在我的基础xsd是:

<?xml version="1.0" encoding="utf-8"?>
<xs:schema id="BaseGrammar"
           targetNamespace="http://tempuri.org/BaseGrammar.xsd"
           elementFormDefault="qualified"
           xmlns="http://tempuri.org/BaseGrammar.xsd"
           xmlns:mstns="http://tempuri.org/BaseGrammar.xsd"
           xmlns:xs="http://www.w3.org/2001/XMLSchema">

    <xs:complexType name="BaseGrammar">
        <xs:all>
            <xs:element name="Grammar">
                <xs:complexType>
                    <xs:sequence>
                        <xs:element name="name" type="xs:string" />
                        <xs:element name="author" type="xs:string" />
                        <xs:element name="description" type="xs:string" />
                        <xs:element name="category" type="xs:string" />
                    </xs:sequence>
                </xs:complexType>
            </xs:element>
        </xs:all>
    </xs:complexType>
</xs:schema>

我的孩子xsd是:

<?xml version="1.0" encoding="utf-8"?>
<xs:schema id="TableGrammar"
               targetNamespace="http://tempuri.org/TableGrammar.xsd"
               elementFormDefault="qualified"
               xmlns="http://tempuri.org/TableGrammar.xsd"
               xmlns:mstns="http://tempuri.org/TableGrammar.xsd"
               xmlns:xs="http://www.w3.org/2001/XMLSchema">


    <xs:import namespace="http://tempuri.org/BaseGrammar.xsd" schemaLocation="BaseGrammar.xsd" />    

    <xs:complexType name="TableGrammar">
        <xs:complexContent>
            <xs:extension base="BaseGrammar">
                <xs:all>
                    <xs:element name="parameters" type="xs:string" />
                </xs:all>
            </xs:extension>
            </xs:complexContent>
    </xs:complexType>

</xs:schema>

我收到一条错误消息,指出它无法找到“BaseGrammar”的定义。我假设它与命名空间有关,但是;我对他们的工作方式仍然有点模糊。

1 个答案:

答案 0 :(得分:1)

这是因为名称空间。 您可以在命名空间中定义TableGrammar类型:

http://tempuri.org/BaseGrammar.xsd

是第一个模式的目标名称空间,但在名称空间中引用它:

http://tempuri.org/TableGrammar.xsd

它不仅被声明为第二个模式的目标命名空间,而且还被声明为整个XSD文档的默认命名空间(XSD也是一个XML文档)。你通过这个设置做到了:

xmlns="http://tempuri.org/TableGrammar.xsd"

但根据XSD语言,base属性的值是限定名称。这意味着当没有明确指定名称空间(带前缀)时,它将根据该位置的默认名称空间实际解析。

您的第二个架构可以像这样修复:

<?xml version="1.0" encoding="utf-8"?>
<xs:schema id="TableGrammar"
               targetNamespace="http://tempuri.org/TableGrammar.xsd"
               elementFormDefault="qualified"
               xmlns="http://tempuri.org/TableGrammar.xsd"
               xmlns:mstns="http://tempuri.org/TableGrammar.xsd"
               xmlns:xs="http://www.w3.org/2001/XMLSchema"
               xmlns:bg="http://tempuri.org/BaseGrammar.xsd">

    <xs:import namespace="http://tempuri.org/BaseGrammar.xsd" schemaLocation="BaseGrammar.xsd" />    

    <xs:complexType name="TableGrammar">
        <xs:complexContent>
            <xs:extension base="bg:BaseGrammar">
                <xs:all>
                    <xs:element name="parameters" type="xs:string" />
                </xs:all>
            </xs:extension>
        </xs:complexContent>
    </xs:complexType>
</xs:schema>

此处,在bg中声明<xs:schema>前缀以引用http://tempuri.org/BaseGrammar.xsd命名空间。然后,它在base属性中用于明确指定BaseGrammar名称的实际名称空间。