我正在尝试从导入的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”的定义。我假设它与命名空间有关,但是;我对他们的工作方式仍然有点模糊。
答案 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
名称的实际名称空间。