使用自定义元素扩展XML架构

时间:2012-03-09 17:35:49

标签: xml xsd

我正在尝试执行以下操作:

<myNamespace:foo>
    <myNamespace:bar>hello</myNamespace:bar>
    <myNamespace:extended>
        <yourNamespace:anything>
        ....
        </yourNamespace:anything>
    </myNamespace:extended>
</myNamespace:foo>

基本上,我想设计一个模式,允许使用来自另一个名称空间的元素覆盖特定元素。

我试过这个:

<!-- mySchema.xsd -->
<schema xmlns="http://www.w3.org/2001/XMLSchema" 
    targetNamespace="http://www.example.org/mySchema" 
    xmlns:myNamespace="http://www.example.org/mySchema" 
    elementFormDefault="qualified">

    <complexType name="extendedType">
        <sequence>
            <any/>
        </sequence>
    </complexType>

    <element name="foo">
        <complexType>
            <sequence>
                <element name="bar" type="string"/>
                <element name="extended" type="myNamespace:extendedType"/>
            </sequence>
        </complexType>
    </element>

<!-- yourSchema.xsd -->
<schema xmlns="http://www.w3.org/2001/XMLSchema" 
    targetNamespace="http://www.example.org/yourSchema" 
    xmlns:yourNamespace="http://www.example.org/yourSchema"
    xmlns:myNamespace="http://www.example.org/mySchema" 
    elementFormDefault="qualified">

    <import namespace="http://www.example.org/mySchema" schemaLocation="mySchema.xsd"/>

    <redefine schemaLocation="mySchema.xsd">
        <complexType name="extendedType">
                <complexContent>
                <extension base="myNamespace:extendedType">
                    <sequence>
                        <element name="anything"></element>
                    </sequence>
                </extension>
            </complexContent>
        </complexType>
    </redefine>
</schema>

但是当我尝试从yourSchema.xsd创建一个新文档时,我在eclipse中得到以下内容:“由于提供的模式没有全局元素,因此不存在根元素”。 yourSchema.xsd不应该从mySchema.xsd继承root元素吗?

1 个答案:

答案 0 :(得分:0)

我认为你要找的是用<extended>类型定义anyType元素。试试这个架构:

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified"     attributeFormDefault="unqualified">
    <xs:element name="foo">
        <xs:complexType>
            <xs:sequence>
                <xs:element name="bar" type="xs:string"/>
                <xs:element name="extended" type="xs:anyType"/>
            </xs:sequence>
        </xs:complexType>
    </xs:element>
</xs:schema>