Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

xsd: How to extend a type with an unordered list of elements

Tags:

xsd

This is a part of my xml schema

<xs:complexType name="Friend">
    <xs:all>
        <xs:element name="name" type="xs:string" />
        <xs:element name="phone" type="xs:string" />
        <xs:element name="address" type="xs:string" />
    </xs:all>
</xs:complexType>

<xs:complexType name="Coworker">
    <xs:all>
        <xs:element name="name" type="xs:string" />
        <xs:element name="phone" type="xs:string" />
        <xs:element name="office" type="xs:string" />
    </xs:all>
</xs:complexType>

For better maintainability, I would like to have the shared attributes in an (abstract) super type or something like that. But more important, I want that all elements are unordered and also optional.

Is this possible, and what is the best way to do it?

like image 568
Cephalopod Avatar asked Sep 27 '10 21:09

Cephalopod


People also ask

What is extension in XSD?

The extension element extends an existing simpleType or complexType element.

How do you make attributes mandatory in XSD?

Attributes are either optional or mandatory (by default they are optional). The "use" property in the XSD definition is used to specify if the attribute is optional or mandatory. To specify that an attribute must be present, use="required" (Note: use may also be set to "prohibited", but we'll come to that later).

What is XSI type in XML?

The prefix "xsi" is the namespace prefix used by convention for the XML Schema instance namespace. XML documents can contain elements that have an xsi:type attribute. This behavior provides an explicit data type for the element. The MRM XML parser in sensitive to xsi:type attributes in the XML document.

What is XSD choice element?

<xsd:choice> ElementAllows one and only one of the elements contained in the selected group to be present within the containing element.


1 Answers

One-and-half year after this question and the accepted answer were posted, XSD 1.1 was published. In this version it is possible to specify what the OP asked for because a number of restriction on xs:all were lifted. One of them is that it is now possible to extend an xs:all.

Using XSD 1.1 you can specify the following:

<xs:complexType name="Person" abstract="true">
    <xs:all>
        <xs:element name="name" type="xs:string" minOccurs="0" />
        <xs:element name="phone" type="xs:string" minOccurs="0" />
    </xs:all>
</xs:complexType>
<xs:complexType name="Friend">
    <xs:complexContent>
        <xs:extension base="Person">
            <xs:all>
                <xs:element name="address" type="xs:string" minOccurs="0" />
            </xs:all>
        </xs:extension>
    </xs:complexContent>
</xs:complexType>
<xs:complexType name="Coworker">
    <xs:complexContent>
        <xs:extension base="Person">
            <xs:all>
                <xs:element name="office" type="xs:string" minOccurs="0" />
            </xs:all>
        </xs:extension>
    </xs:complexContent>
</xs:complexType>

This defines the following types:

  • Person: an abstract type with optional unordered name and phone elements;
  • Friend: extends Person adding an optional address element to the list of unordered elements;
  • Coworker: extends Coworker adding an optional office element to the list of unordered elements.

Note that this solution does not work for every XML processor: even though 8 years have passed since the publication of XSD 1.1, a lot of processors still only support XSD 1.0.

like image 196
Aad Mathijssen Avatar answered Sep 20 '22 05:09

Aad Mathijssen