Question

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?

Was it helpful?

Solution

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.

OTHER TIPS

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

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top