<?xml version="1.0" encoding="UTF-8"?>
<schema xmlns="http://www.w3.org/2001/XMLSchema"
    xmlns:xlink="http://www.w3.org/1999/xlink" 
    xmlns:gml="http://www.opengis.net/gml/3.2" 
    version="0.0.2-3.2.1" 
    elementFormDefault="qualified" 
    targetNamespace="http://www.opengis.net/gml/3.2">
    <annotation>
        <documentation>GML 3.2.1 profile for BRO.
        Based on: gml:AbstractFeature, gml:ReferenceType, gml:PointPropertyType, gml:EnvelopeType, gml:MeasureType, gml:TimeInstantPropertyType, (gml:CodeWithAuthorityType)
        0.0.2: anyURI toegevoegd aan TimePositionUnion</documentation>
    </annotation>
    <import namespace="http://www.w3.org/1999/xlink" schemaLocation="https://schema.broservices.nl/profile/xlink/1.0/xlink-profile.xsd"/>
    <!-- ================================================= -->
    <element name="AbstractFeature" type="gml:AbstractFeatureType" abstract="true" substitutionGroup="gml:AbstractGML">
    </element>
    <!-- ================================================= -->
    <complexType name="AbstractFeatureType" abstract="true">
        <complexContent>
            <extension base="gml:AbstractGMLType"/>
        </complexContent>
    </complexType>
    <!-- ================================================= -->
    <complexType name="FeaturePropertyType">
        <sequence minOccurs="0">
            <element ref="gml:AbstractFeature"/>
        </sequence>
        <attributeGroup ref="gml:AssociationAttributeGroup"/>
    </complexType>
    <!-- ================================================= -->
    <complexType name="AbstractGMLType" abstract="true">
        <!-- refers to StandardObjectProperties. Currently not used. Only gml:id is used
        <sequence>
            <group ref="gml:StandardObjectProperties"/>
        </sequence>
        -->
        <attribute ref="gml:id" use="required"/>
    </complexType>
    <!-- ================================================= -->
    <!-- These elements are currently not used.
         gml:identifier might be used in the future, but its usage is currently not foreseen.

    <group name="StandardObjectProperties">
        <sequence>
            <element ref="gml:description" minOccurs="0"/>
            <element ref="gml:descriptionReference" minOccurs="0"/>
            <element ref="gml:identifier" minOccurs="0"/>
            <element ref="gml:name" minOccurs="0" maxOccurs="unbounded"/>
        </sequence>
    </group>
    -->
    <!-- ================================================= -->
    <attribute name="id" type="ID"/>
    <!-- ================================================= -->
    <element name="AbstractObject" abstract="true"/>
    <!-- ================================================= -->
    <attributeGroup name="AssociationAttributeGroup">
        <attributeGroup ref="xlink:simpleAttrs"/>
        <attribute name="nilReason" type="gml:NilReasonType"/>
    </attributeGroup>
    <!-- ================================================= -->
    <simpleType name="NilReasonType">
        <union memberTypes="gml:NilReasonEnumeration anyURI"/>
    </simpleType>
    <!-- ================================================= -->
    <simpleType name="NilReasonEnumeration">
        <union>
            <simpleType>
                <restriction base="string">
                    <enumeration value="inapplicable"/>
                    <enumeration value="missing"/>
                    <enumeration value="template"/>
                    <enumeration value="unknown"/>
                    <enumeration value="withheld"/>
                </restriction>
            </simpleType>
            <simpleType>
                <restriction base="string">
                    <pattern value="other:\w{2,}"/>
                </restriction>
            </simpleType>
        </union>
    </simpleType>
    <!-- ================================================= -->
    <!-- Is being referred to from StandardObjectProperties. Currently not used. Usage not foreseen.  
    <element name="description" type="string"/>
    -->
    <!-- ================================================= -->
    <!-- Is being referred to from StandardObjectProperties. Currently not used. Usage not foreseen.  
    <element name="descriptionReference" type="gml:ReferenceType"/>
    -->
    <!-- ================================================= -->
    <complexType name="ReferenceType">
        <attributeGroup ref="gml:AssociationAttributeGroup"/>
    </complexType>
    <!-- ================================================= -->
    <!-- TODO: currently included to allow validation of current examples
    -->
    <complexType name="CodeType">
        <simpleContent>
            <extension base="string">
                <attribute name="codeSpace" type="anyURI"/>
            </extension>
        </simpleContent>
    </complexType>
    <!-- ================================================= -->
    <!-- Currently not needed
    <element name="identifier" type="gml:CodeWithAuthorityType"/>
    -->
    <!-- ================================================= -->
    <!-- Currently included to allow validation of current examples
    -->
    <complexType name="CodeWithAuthorityType">
        <simpleContent>
            <restriction base="gml:CodeType">
                <attribute name="codeSpace" type="anyURI" use="required"/>
            </restriction>
        </simpleContent>
    </complexType>
    <!-- ================================================= -->
    <!-- Name is currently not needed
    <element name="name" type="gml:CodeType"/>
    --> 
    <!-- ================================================= -->
    <element name="Envelope" type="gml:EnvelopeType" substitutionGroup="gml:AbstractObject"/>
    <!-- ================================================= -->
    <complexType name="EnvelopeType">
        <sequence>
            <element name="lowerCorner" type="gml:DirectPositionType"/>
            <element name="upperCorner" type="gml:DirectPositionType"/>
        </sequence>
        <attributeGroup ref="gml:SRSReferenceGroup"/>
    </complexType>
    <!-- ================================================= -->
    <complexType name="DirectPositionType">
        <simpleContent>
            <extension base="gml:doubleList"/>
        </simpleContent>
    </complexType>
    <!-- ================================================= -->
    <simpleType name="doubleList">
        <list itemType="double"/>
    </simpleType>
    <!-- ================================================= -->
    <attributeGroup name="SRSReferenceGroup">
        <attribute name="srsName" type="anyURI"/>
        <attribute name="srsDimension" type="positiveInteger"/>
    </attributeGroup>
    <!-- ================================================= -->
    <simpleType name="NCNameList">
        <list itemType="NCName"/>
    </simpleType>
    <!-- ================================================= -->
    <element name="pos" type="gml:DirectPositionType"/>
    <!-- ================================================= -->
    <element name="AbstractGeometry" type="gml:AbstractGeometryType" abstract="true" substitutionGroup="gml:AbstractGML"/>
    <!-- ================================================= -->
    <complexType name="AbstractGeometryType" abstract="true">
        <complexContent>
            <extension base="gml:AbstractGMLType">
                <attributeGroup ref="gml:SRSReferenceGroup"/>
            </extension>
        </complexContent>
    </complexType>
    <!-- ================================================= -->
    <element name="AbstractGML" type="gml:AbstractGMLType" abstract="true" substitutionGroup="gml:AbstractObject"/>
    <!-- ================================================= -->
    <complexType name="PointPropertyType">
        <sequence>
            <element ref="gml:Point"/>
        </sequence>
    </complexType>
    <!-- ================================================= -->
    <element name="Point" type="gml:PointType" substitutionGroup="gml:AbstractGeometricPrimitive"/>
    <!-- ================================================= -->
    <complexType name="PointType">
        <complexContent>
            <extension base="gml:AbstractGeometricPrimitiveType">
                <sequence>
                    <element ref="gml:pos"/>
                </sequence>
            </extension>
        </complexContent>
    </complexType>
    <!-- ================================================= -->
    <complexType name="AbstractGeometricPrimitiveType" abstract="true">
        <complexContent>
            <extension base="gml:AbstractGeometryType"/>
        </complexContent>
    </complexType>
    <!-- ================================================= -->
    <element name="AbstractGeometricPrimitive" type="gml:AbstractGeometricPrimitiveType" abstract="true" substitutionGroup="gml:AbstractGeometry"/>
    <!-- ================================================= -->
    <complexType name="MeasureType">
        <simpleContent>
            <extension base="double">
                <attribute name="uom" type="gml:UomIdentifier" use="required"/>
            </extension>
        </simpleContent>
    </complexType>
    <!-- ================================================= -->
    <simpleType name="UomIdentifier">
        <union memberTypes="gml:UomSymbol gml:UomURI"/>
    </simpleType>
    <!-- ================================================= -->
    <simpleType name="UomSymbol">
        <restriction base="string">
            <pattern value="[^: \n\r\t]+"/>
        </restriction>
    </simpleType>
    <!-- ================================================= -->
    <simpleType name="UomURI">
        <restriction base="anyURI">
            <pattern value="([a-zA-Z][a-zA-Z0-9\-\+\.]*:|\.\./|\./|#).*"/>
        </restriction>
    </simpleType>
    <!-- ================================================= -->
    <element name="AbstractTimeObject" type="gml:AbstractTimeObjectType" abstract="true" substitutionGroup="gml:AbstractGML"/>
    <!-- ================================================= -->
    <complexType name="AbstractTimeObjectType" abstract="true">
        <complexContent>
            <extension base="gml:AbstractGMLType"/>
        </complexContent>
    </complexType>
    <!-- ================================================= -->
    <element name="AbstractTimePrimitive" type="gml:AbstractTimePrimitiveType" abstract="true" substitutionGroup="gml:AbstractTimeObject"/>
    <!-- ================================================= -->
    <complexType name="AbstractTimePrimitiveType" abstract="true">
        <complexContent>
            <extension base="gml:AbstractTimeObjectType"/>
        </complexContent>
    </complexType>
    <!-- ================================================= -->
    <complexType name="TimePrimitivePropertyType">
        <sequence>
            <element ref="gml:AbstractTimePrimitive"/>
        </sequence>
    </complexType>
    <!-- ================================================= -->
    <element name="AbstractTimeGeometricPrimitive" type="gml:AbstractTimeGeometricPrimitiveType" abstract="true" substitutionGroup="gml:AbstractTimePrimitive"/>
    <!-- ================================================= -->
    <complexType name="AbstractTimeGeometricPrimitiveType" abstract="true">
        <complexContent>
            <extension base="gml:AbstractTimePrimitiveType">
                <attribute name="frame" type="anyURI" default="#ISO-8601"/>
            </extension>
        </complexContent>
    </complexType>
    <!-- ================================================= -->
    <element name="TimeInstant" type="gml:TimeInstantType" substitutionGroup="gml:AbstractTimeGeometricPrimitive"/>
    <!-- ================================================= -->
    <complexType name="TimeInstantType" final="#all">
        <complexContent>
            <extension base="gml:AbstractTimeGeometricPrimitiveType">
                <sequence>
                    <element ref="gml:timePosition"/>
                </sequence>
            </extension>
        </complexContent>
    </complexType>
    <!-- ================================================= -->
    <complexType name="TimeInstantPropertyType">
        <sequence minOccurs="0">
            <element ref="gml:TimeInstant"/>
        </sequence>
        <attributeGroup ref="gml:AssociationAttributeGroup"/>
    </complexType>
    <!-- ================================================= -->
    <element name="TimePeriod" type="gml:TimePeriodType" substitutionGroup="gml:AbstractTimeGeometricPrimitive"/>
    <!-- ================================================= -->
    <complexType name="TimePeriodType">
        <complexContent>
            <extension base="gml:AbstractTimeGeometricPrimitiveType">
                <sequence>
                    <element name="beginPosition" type="gml:TimePositionType"/>
                    <element name="endPosition" type="gml:TimePositionType"/>
                </sequence>
            </extension>
        </complexContent>
    </complexType>
    <!-- ================================================= -->
    <complexType name="TimePeriodPropertyType">
        <sequence>
            <element ref="gml:TimePeriod"/>
        </sequence>
    </complexType>
    <!-- ================================================= -->
    <complexType name="TimePositionType" final="#all">
        <simpleContent>
            <extension base="gml:TimePositionUnion">
                <attribute name="frame" type="anyURI" default="#ISO-8601"/>
                <!-- Usage not foreseen
                <attribute name="calendarEraName" type="string"/>
                -->
                <attribute name="indeterminatePosition" type="gml:TimeIndeterminateValueType"/>
            </extension>
        </simpleContent>
    </complexType>
    <!-- ================================================= -->
    <simpleType name="TimeIndeterminateValueType">
        <restriction base="string">
            <!-- Only the usage of "unknown" is foreseen for the BRO
            <enumeration value="after"/>
            <enumeration value="before"/>
            <enumeration value="now"/>
            -->
            <enumeration value="unknown"/>
        </restriction>
    </simpleType>
    <!-- ================================================= -->
    <simpleType name="TimePositionUnion">
        <!-- anyURI is added to facilitate an empty value in case the date is unknown
        <union memberTypes="gml:CalDate time dateTime anyURI decimal"/> -->
        <union memberTypes="gml:CalDate time dateTime anyURI "/>
    </simpleType>
    <!-- ================================================= -->
    <simpleType name="CalDate">
        <union memberTypes="date gYearMonth gYear"/>
    </simpleType>
    <!-- ================================================= -->
    <element name="timePosition" type="gml:TimePositionType"/>
    <!-- ================================================= -->
    <complexType name="CurvePropertyType">
        <sequence>
            <element ref="gml:AbstractCurve"/>
        </sequence>
    </complexType>
    <!-- ================================================= -->
    <element name="AbstractCurve" type="gml:AbstractCurveType" abstract="true" substitutionGroup="gml:AbstractGeometricPrimitive"/>
    <!-- ================================================= -->
    <complexType name="AbstractCurveType" abstract="true">
        <complexContent>
            <extension base="gml:AbstractGeometricPrimitiveType"/>
        </complexContent>
    </complexType>
    <!-- ================================================= -->
    <complexType name="SurfacePropertyType">
        <sequence>
            <element ref="gml:AbstractSurface"/>
        </sequence>
    </complexType>
    <!-- ================================================= -->
    <element name="AbstractSurface" type="gml:AbstractSurfaceType" abstract="true" substitutionGroup="gml:AbstractGeometricPrimitive"/>
    <!-- ================================================= -->
    <complexType name="AbstractSurfaceType" abstract="true">
        <complexContent>
            <extension base="gml:AbstractGeometricPrimitiveType"/>
        </complexContent>
    </complexType>
    <!-- ================================================= -->
    <element name="LineString" type="gml:LineStringType" substitutionGroup="gml:AbstractCurve"/>
    <!-- ================================================= -->
    <complexType name="LineStringType">
        <complexContent>
            <extension base="gml:AbstractCurveType">
                <sequence>
                    <element ref="gml:posList"/>
                </sequence>
            </extension>
        </complexContent>
    </complexType>
    <!-- ================================================= -->
    <element name="posList" type="gml:DirectPositionListType"/>
    <!-- ================================================= -->
    <complexType name="DirectPositionListType">
        <simpleContent>
            <extension base="gml:doubleList"/>
        </simpleContent>
    </complexType>
    <!-- ================================================= -->
    <element name="Polygon" type="gml:PolygonType" substitutionGroup="gml:AbstractSurface"/>
    <!-- ================================================= -->
    <complexType name="PolygonType">
        <complexContent>
            <extension base="gml:AbstractSurfaceType">
                <sequence>
                    <element ref="gml:exterior" minOccurs="0"/>
                    <element ref="gml:interior" minOccurs="0" maxOccurs="unbounded"/>
                </sequence>
            </extension>
        </complexContent>
    </complexType>
    <!-- ================================================= -->
    <element name="exterior" type="gml:AbstractRingPropertyType"/>
    <!-- ================================================= -->
    <complexType name="AbstractRingPropertyType">
        <sequence>
            <element ref="gml:AbstractRing"/>
        </sequence>
    </complexType>
    <!-- ================================================= -->
    <element name="AbstractRing" type="gml:AbstractRingType" abstract="true" substitutionGroup="gml:AbstractObject"/>
    <!-- ================================================= -->
    <complexType name="AbstractRingType" abstract="true">
        <sequence/>
    </complexType>
    <!-- ================================================= -->
    <element name="interior" type="gml:AbstractRingPropertyType"/>
    <!-- ================================================= -->
    <element name="LinearRing" type="gml:LinearRingType" substitutionGroup="gml:AbstractRing"/>
    <!-- ================================================= -->
    <complexType name="LinearRingType">
        <complexContent>
            <extension base="gml:AbstractRingType">
                <sequence>
                    <element ref="gml:posList"/>
                </sequence>
            </extension>
        </complexContent>
    </complexType>
    
<!-- BooleanPropertyType was used in earlier versions of CPT, but not used anymore
    <complexType name="BooleanPropertyType">
        <sequence minOccurs="0">
            <element ref="gml:Boolean"/>
        </sequence>
        <attributeGroup ref="gml:AssociationAttributeGroup"/>
    </complexType>
    <element name="Boolean"  substitutionGroup="gml:AbstractScalarValue" nillable="true">
        <complexType>
            <simpleContent>
                <extension base="boolean">
                    <attribute name="nilReason" type="gml:NilReasonType"/>
                </extension>
            </simpleContent>
        </complexType>
    </element>
    <element name="AbstractValue" type="anyType" abstract="true" substitutionGroup="gml:AbstractObject"/>
    <element name="AbstractScalarValue" type="anyType" abstract="true" substitutionGroup="gml:AbstractValue"/>
-->
    
</schema>
