0

Here is a simplified example of the problem:

base.xsd:

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">

    <xs:element name="root" type="root" />
    <xs:complexType name="root">
        <xs:sequence>
            <xs:element name="items" minOccurs="0" />
        </xs:sequence>
    </xs:complexType>

    <xs:element name="items" type="items" />
    <xs:complexType name="items">
        <xs:sequence>
            <xs:element name="item" minOccurs="0" maxOccurs="unbounded" />
        </xs:sequence>
    </xs:complexType>

</xs:schema>

derived.xsd:

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">
    <xs:redefine schemaLocation="base.xsd">
        <!-- redefining types from base.xsd ... -->
    </xs:redefine>
</xs:schema>    

I would like to define a key on items in derived.xsd, but not in base.xsd. So the behavior of the base schema should not change, but in the derived schema, it should behave by the following definition:

<xs:element name="root">
    <xs:complexType>
        <xs:sequence>
            <xs:element name="items" minOccurs="0">
                <xs:complexType>
                    <xs:sequence>
                        <xs:element name="item" minOccurs="0" maxOccurs="unbounded" />
                    </xs:sequence>
                </xs:complexType>
                <xs:key name="itemKey">
                    <xs:selector xpath="item" />
                    <xs:field xpath="." />
                </xs:key>
            </xs:element>
        </xs:sequence>
    </xs:complexType>
</xs:element>

Still, I derived.xsd should stay derived from base.xsd, because there are other elements in my real schema which I need to inherit.

Andrej Adamenko
  • 1,650
  • 15
  • 31

1 Answers1

0

The following worked for me.

derived.xsd

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">
    <xs:redefine schemaLocation="base.xsd">
        <xs:complexType name="root">
            <xs:complexContent>
                <xs:restriction base="root">
                    <xs:sequence>
                        <xs:element name="items" type="items" minOccurs="0">
                            <xs:key name="itemKey">
                                <xs:selector xpath="item" />
                                <xs:field xpath="." />
                            </xs:key>
                        </xs:element>
                    </xs:sequence>
                </xs:restriction>
            </xs:complexContent>
        </xs:complexType>
    </xs:redefine>
</xs:schema>
Andrej Adamenko
  • 1,650
  • 15
  • 31