<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">
    <xs:element name="model">
        <xs:complexType>
            <xs:sequence>
                <xs:element minOccurs="0" maxOccurs="unbounded" ref="type"/>
                <xs:element minOccurs="0" maxOccurs="unbounded" ref="entity"/>
                <xs:element minOccurs="0" maxOccurs="unbounded" ref="relationship"/>
                <xs:element minOccurs="0" maxOccurs="unbounded" ref="subtype"/>
                <xs:element minOccurs="0" ref="rule"/>
                <xs:element minOccurs="0" ref="comment"/>
            </xs:sequence>
            <xs:attribute name="name" type="xs:string"/>
            <xs:attribute ref="datatype"/>
            <xs:attribute name="quotenames" type="xs:boolean">
                <xs:annotation>
                    <xs:documentation xml:lang="en"> 
                    If this attribute is present, names of tables and attributes will be quoted in the generated DDL</xs:documentation>
                </xs:annotation>
            </xs:attribute>
        </xs:complexType>
    </xs:element>
    <xs:element name="type">
        <xs:complexType>
            <xs:sequence>
                <xs:element ref="enum" minOccurs="0" maxOccurs="unbounded"/>
                <xs:element minOccurs="0" ref="comment"/>
            </xs:sequence>
            <xs:attribute name="datatype"/>
            <xs:attribute name="name" use="required" type="xs:string"/>
            <xs:attribute name="pattern" type="xs:string"/>
        </xs:complexType>
    </xs:element>
    <xs:element name="entity">
        <xs:complexType>
            <xs:sequence>
                <xs:element minOccurs="0" maxOccurs="unbounded" ref="attribute"/>
                <xs:element minOccurs="0" ref="rule"/>
                <xs:element minOccurs="0" ref="comment"/>
            </xs:sequence>
            <xs:attribute name="name" use="required" type="xs:string"/>
            <xs:attribute ref="datatype"/>
            <xs:attribute name="derived" type="xs:boolean"/>
            <xs:attribute name="cardinality" type="xs:integer"/>
        </xs:complexType>
    </xs:element>
    <xs:element name="attribute">
        <xs:complexType>
            <xs:sequence>
                <xs:element minOccurs="0" ref="rule"/>
                <xs:element minOccurs="0" ref="comment"/>
            </xs:sequence>
            <xs:attribute ref="datatype"/>
            <xs:attribute ref="min"/>
            <xs:attribute ref="max"/>
            <xs:attribute name="name" use="required" type="xs:string"/>
            <xs:attribute name="primarykey" type="xs:boolean"/>
            <xs:attribute name="type" type="xs:string"/>
            <xs:attribute name="autoincrement" type="xs:boolean"/>
            <xs:attribute name="derived" type="xs:boolean"/>
            <xs:attribute name="unique" type="xs:boolean"/>
        </xs:complexType>
    </xs:element>
    <xs:element name="relationship">
        <xs:complexType>
            <xs:sequence>
                <xs:element maxOccurs="unbounded" ref="role"/>
                <xs:element minOccurs="0" maxOccurs="unbounded" ref="attribute"/>
                <xs:element minOccurs="0" ref="rule"/>
                <xs:element minOccurs="0" ref="comment"/>
            </xs:sequence>
            <xs:attribute name="name" type="xs:string"/>
            <xs:attribute name="inverse" type="xs:string"/>
            <xs:attribute name="derived" type="xs:boolean"/>
        </xs:complexType>
    </xs:element>
    <xs:element name="subtype">
        <xs:complexType>
            <xs:sequence>
                <xs:element minOccurs="0" ref="comment"/>
            </xs:sequence>
            <xs:attribute name="name" type="xs:string"/>
            <xs:attribute name="type" type="xs:string"/>
            <xs:attribute name="super" type="xs:string"/>
        </xs:complexType>
    </xs:element>
    <xs:element name="role">
        <xs:complexType>
            <xs:sequence>
                <xs:element minOccurs="0" ref="comment"/>
            </xs:sequence>
            <xs:attribute name="entity" use="required" type="xs:string"/>
            <xs:attribute name="name" type="xs:string"/>
            <xs:attribute ref="min"/>
            <xs:attribute ref="max"/>
            <xs:attribute name="dependent" type="xs:boolean"/>
        </xs:complexType>
    </xs:element>
    <xs:element name="comment">
        <xs:complexType mixed="true">
            <xs:sequence>
                <xs:any processContents="skip" minOccurs="0" maxOccurs="unbounded"/>
            </xs:sequence>
        </xs:complexType>
    </xs:element>
    <xs:element name="rule" type="xs:string"/>
    <xs:attribute name="datatype" type="xs:string"/>
    <xs:element name="enum">
        <xs:complexType>
            <xs:sequence>
                <xs:element minOccurs="0" ref="comment"/>
            </xs:sequence>
            <xs:attribute name="value" type="xs:string"/>
            <xs:attribute name="title" type="xs:string"/>
        </xs:complexType>
    </xs:element>
    <xs:attribute name="min">
        <xs:simpleType>
            <xs:restriction base="xs:string">
                <xs:enumeration value="0"/>
                <xs:enumeration value="1"/>
            </xs:restriction>
        </xs:simpleType>
    </xs:attribute>
    <xs:attribute name="max">
        <xs:simpleType>
            <xs:restriction base="xs:string">
                <xs:enumeration value="1"/>
                <xs:enumeration value="N"/>
            </xs:restriction>
        </xs:simpleType>
    </xs:attribute>
</xs:schema>
