1

I need to extend an element in an XSD schema. In the original schema, the element is defined as:

   <xsd:element name="RemarkText">
      <xsd:complexType>
         <xsd:simpleContent>
            <xsd:extension base="C-Infinite">
               <xsd:attribute name="IdRef" type="IDREF" use="required"/>
            </xsd:extension>
         </xsd:simpleContent>
      </xsd:complexType>
   </xsd:element>

All the examples I have seem regarding extensions seem to deal with extending types. If this was originally defined as:

      <xsd:complexType name="RemarkText_Type">
         <xsd:simpleContent>
            <xsd:extension base="C-Infinite">
               <xsd:attribute name="IdRef" type="IDREF" use="required"/>
            </xsd:extension>
         </xsd:simpleContent>
      </xsd:complexType>
      <xsd:element name="RemarkText" type="RemarkText_Type"/>

Then, I think I would know what to do.

But is it possible to extend an element, rather than a type?

pkaeding
  • 36,513
  • 30
  • 103
  • 141

2 Answers2

5

The redefine tag can only be used with group, attributeGroup, complexType and simpleType. Its not possible to use it on an element.

It is not possible to extend or restrict an element either. You can extend or restrict the complexType it is based on. You can then use the new type without modifying the original element definition by adding the xs:type attribute in the xml to indicate the type complexType being used.

alt text
(source: liquid-technologies.com)

<?xml version="1.0" encoding="utf-8" ?>
<!--Created with Liquid XML Studio - Developer Pro Edition 7.1.1.1206 (http://www.liquid-technologies.com)-->
<xs:schema elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:complexType name="NameType">
    <xs:sequence>
      <xs:element name="FirstName" type="xs:string" />
      <xs:element name="Surname" type="xs:string" />
    </xs:sequence>
  </xs:complexType>
  <xs:complexType name="NameExType">
    <xs:complexContent mixed="false">
      <xs:extension base="NameType">
        <xs:sequence>
          <xs:element name="MiddleName" type="xs:string" />
        </xs:sequence>
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>
  <xs:element name="MyName" type="NameType" />
</xs:schema>

But then the XML needs to use the xsi:type="NameExType" if you want to use the extended NameExType.

<?xml version="1.0" encoding="utf-8"?>
<!-- Created with Liquid XML Studio - Developer Pro Edition 7.1.1.1206 (http://www.liquid-technologies.com) -->
<MyName xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
        xsi:type="NameExType">
    <FirstName>string</FirstName>
    <Surname>string</Surname>
    <MiddleName></MiddleName>
</MyName>

Using a graphical editor like Liquid XML Studio makes things a lot easier though.

Glorfindel
  • 21,988
  • 13
  • 81
  • 109
Colin
  • 586
  • 3
  • 6
  • 1
    Well, that wasn't the answer I was hoping for, but thank you for writing such a complete answer (and with such pretty pictures)! – pkaeding May 05 '09 at 05:40
0

The "any" element exists to help with such issues. A nice example on how to do this can be found here.

Dillie-O
  • 29,277
  • 14
  • 101
  • 140
  • 2
    Wouldn't I need to add that to the original schema? I can't change the original schema (if I could, I probably wouldn't need to extend it). – pkaeding May 04 '09 at 18:31
  • Essentially what you're doing is creating a new schema that will extend the original, since you can't change it. – Dillie-O May 04 '09 at 19:05