如何正确使用XSD文件中的扩展名?

时间:2018-07-12 13:57:04

标签: xml inheritance xsd

就我而言,我有两个非常简单的XSD。第一个是Person.xsd,其元素如:名称,年龄和第二个(Reader.xsd)应该从Person.xsd继承。我将XMLSpy用作验证器,它会引发错误。我是XSD文件的初学者,因此我认为为我的案例找到解决方案并不难。 Person.xsd:

<?xml version="1.0" encoding="utf-8"?>

<xs:schema elementFormDefault="qualified"
xmlns:p="http://www.demo.com"
targetNamespace="http://www.demo.com"
xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:complexType name="PersonType">
    <xs:sequence>
        <xs:element name="firstname" type="xs:string"/>
        <xs:element name="lastname" type="xs:string"/>
        <xs:element name="age" type="xs:int"/>
    </xs:sequence>
    <xs:attribute name="id" type="xs:int"/>
</xs:complexType>

<xs:element name="person" type="p:PersonType"/>

</xs:schema>

Reader.xsd:

   <?xml version="1.0" encoding="utf-8"?>

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"  
xmlns:r="http://www.demo.com"
targetNamespace="http://www.demo.com"
elementFormDefault="qualified">
<xs:include schemaLocation="person.xsd"/>
<!--<xs:element name="person" type="p:PersonType"/>-->
<xs:complexType name="ReaderType">
    <xs:complexContent>
        <xs:extension base="PersonType"> // THERE IS A RED MARKER ('must 
refer to an existing simple or complex type')
            <xs:sequence>
                <xs:element name="bookId" type="xs:int" minOccurs="0" 
maxOccurs="unbounded"/>
            </xs:sequence>
            <xs:attribute name="id" type="xs:int" use="required"/>
        </xs:extension>
    </xs:complexContent>
</xs:complexType>

<xs:element name="reader" type="r:ReaderType"/>

<xs:complexType name="ReadersType">
    <xs:sequence>
        <xs:element ref="r:reader" minOccurs="0" maxOccurs="unbounded"/>
    </xs:sequence>
</xs:complexType>

<xs:element name="readers" type="r:ReadersType"/>
</xs:schema>

2 个答案:

答案 0 :(得分:1)

复杂类型的名称位于包含的架构文档的targetNamespace中,因此复杂类型的名称为{http://www.demo.com}PersonType。由于前缀r已绑定到该命名空间,因此可以使用QName base="r:PersonType"来引用类型。

答案 1 :(得分:1)

我知道了。 reader.xsd应该是:

<?xml version="1.0" encoding="utf-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" 
xmlns:r="http://www.demo.com/reader" xmlns:p="http://www.demo.com/person" 
targetNamespace="http://www.demo.com/reader" elementFormDefault="qualified">

<xs:import namespace="http://www.demo.com/person" schemaLocation="person.xsd"/>

<xs:complexType name="ReaderType">
    <xs:complexContent>
        <xs:extension base="p:PersonType">
            <xs:sequence>
                <xs:element name="bookId" type="xs:int" minOccurs="0" 
maxOccurs="unbounded"/>
            </xs:sequence>
        </xs:extension>
    </xs:complexContent>
</xs:complexType>

<xs:element name="reader" type="r:ReaderType"/>

<xs:complexType name="ReadersType">
    <xs:sequence>
        <xs:element ref="r:reader" minOccurs="0" maxOccurs="unbounded"/>
    </xs:sequence>      
</xs:complexType>

<xs:element name="readers" type="r:ReadersType"/>

</xs:schema>