<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:fml="http://www.freestyle-markup.org" targetNamespace="http://www.freestyle-markup.org">
    <xs:annotation>
        <xs:documentation>This XSD specifies XML-instances for representing FML-documents.</xs:documentation>
    </xs:annotation>
    <xs:element name="document">
        <xs:complexType mixed="false">
            <xs:sequence>
                <xs:group ref="fml:prolog" minOccurs="0" maxOccurs="1"/>
                <xs:choice minOccurs="0" maxOccurs="unbounded">
                    <xs:element ref="fml:content"/>
                    <xs:element ref="fml:markup"/>
                </xs:choice>
            </xs:sequence>
        </xs:complexType>
    </xs:element>
    <xs:group name="prolog">
        <xs:sequence>
            <xs:element ref="fml:prolog.document" minOccurs="0"/>
            <xs:element ref="fml:prolog.perspective" minOccurs="0"/>
            <xs:element ref="fml:prolog.namespace" minOccurs="0"/>
        </xs:sequence>
    </xs:group>
    <xs:element name="prolog.document">
        <xs:complexType mixed="false">
            <xs:sequence>
                <xs:element name="name" form="qualified"/>
                <xs:element name="uri" minOccurs="0" form="qualified"/>
                <xs:element name="description" minOccurs="0" form="qualified"/>
                <xs:element name="version" minOccurs="0" form="qualified"/>
                <xs:element name="fragment" minOccurs="0" form="qualified"/>
                <xs:element name="schema" minOccurs="0" form="qualified"/>
                <xs:element name="trim" minOccurs="0" form="qualified">
                    <xs:simpleType>
                        <xs:restriction base="xs:string">
                            <xs:enumeration value="true"/>
                            <xs:enumeration value="false"/>
                        </xs:restriction>
                    </xs:simpleType>
                </xs:element>
                <xs:element name="writing-direction" minOccurs="0" form="qualified">
                    <xs:simpleType>
                        <xs:restriction base="xs:string">
                            <xs:enumeration value="lr"/>
                            <xs:enumeration value="rl"/>
                        </xs:restriction>
                    </xs:simpleType>
                </xs:element>
            </xs:sequence>
        </xs:complexType>
    </xs:element>
    <xs:element name="prolog.perspective">
        <xs:complexType mixed="false">
            <xs:sequence>
                <xs:element name="name" form="qualified"/>
                <xs:element name="uri" minOccurs="0" form="qualified"/>
                <xs:element name="description" minOccurs="0" form="qualified"/>
                <xs:element name="schema" minOccurs="0" form="qualified"/>
            </xs:sequence>
        </xs:complexType>
    </xs:element>
    <xs:element name="prolog.namespace">
        <xs:complexType mixed="false">
            <xs:sequence>
                <xs:element name="name" form="qualified"/>
                <xs:element name="uri" minOccurs="0" form="qualified"/>
                <xs:element name="description" minOccurs="0" form="qualified"/>
            </xs:sequence>
        </xs:complexType>
    </xs:element>
    <xs:element name="content">
        <xs:simpleType>
            <xs:restriction base="xs:string"/>
        </xs:simpleType>
    </xs:element>
    <xs:element name="markup" abstract="true"/>
    <xs:element name="tag" abstract="true" substitutionGroup="fml:markup"/>
    <xs:element name="tag.start" substitutionGroup="fml:tag">
        <xs:complexType mixed="false">
            <xs:sequence>
                <xs:element ref="fml:perspective.name" minOccurs="0"/>
                <xs:element ref="fml:namespace.name" minOccurs="0"/>
                <xs:element name="tag.name" type="xs:string" form="qualified"/>
                <xs:element name="tag.id" type="xs:string" form="qualified" minOccurs="0"/>
                <xs:group ref="fml:segment" minOccurs="0"/>
                <xs:element name="attribute" type="fml:attribute" form="qualified" minOccurs="0" maxOccurs="unbounded"/>
            </xs:sequence>
        </xs:complexType>
    </xs:element>
    <xs:element name="tag.end" substitutionGroup="fml:tag">
        <xs:complexType mixed="false">
            <xs:sequence>
                <xs:element ref="fml:perspective.name" minOccurs="0"/>
                <xs:element ref="fml:namespace.name" minOccurs="0"/>
                <xs:element name="tag.name" type="xs:string" form="qualified"/>
                <xs:element name="tag.id" type="xs:string" form="qualified" minOccurs="0"/>
            </xs:sequence>
        </xs:complexType>
    </xs:element>
    <xs:element name="tag.empty" substitutionGroup="fml:tag">
        <xs:complexType mixed="false">
            <xs:sequence>
                <xs:element ref="fml:perspective.name" minOccurs="0"/>
                <xs:element ref="fml:namespace.name" minOccurs="0"/>
                <xs:element name="tag.name" type="xs:string" form="qualified"/>
                <xs:group ref="fml:segment" minOccurs="0"/>
                <xs:element name="attribute" type="fml:attribute" form="qualified" minOccurs="0" maxOccurs="unbounded"/>
            </xs:sequence>
        </xs:complexType>
    </xs:element>
    <xs:element name="tag.multiple" substitutionGroup="fml:tag">
        <xs:complexType mixed="false">
            <xs:choice minOccurs="1" maxOccurs="unbounded">
                <xs:element ref="fml:tag.start"/>
                <xs:element ref="fml:tag.end"/>
                <xs:element ref="fml:tag.empty"/>
            </xs:choice>
        </xs:complexType>
    </xs:element>
    <xs:complexType name="attribute" mixed="false">
        <xs:sequence>
            <xs:element name="attribute.name" type="xs:string" form="qualified"/>
            <xs:element name="attribute.value" type="xs:string" form="qualified" maxOccurs="unbounded"/>
        </xs:sequence>
    </xs:complexType>
    <xs:group name="segment">
        <xs:sequence>
            <xs:element name="segment.id" form="qualified" type="xs:string"/>
            <xs:element name="segment.pos" form="qualified" type="xs:integer"/>
        </xs:sequence>
    </xs:group>
    <xs:element name="comment" substitutionGroup="fml:markup" type="xs:string"/>
    <xs:element name="pi" substitutionGroup="fml:markup">
        <xs:complexType mixed="false">
            <xs:sequence>
                <xs:element ref="fml:perspective.name" minOccurs="0"/>
                <xs:element name="pi.target" type="xs:string" form="qualified"/>
                <xs:element name="pi.instruction" type="xs:string" form="qualified"/>
            </xs:sequence>
        </xs:complexType>
    </xs:element>
    <xs:element name="wildcard" substitutionGroup="fml:markup">
        <xs:complexType mixed="false">
            <xs:sequence>
                <xs:element ref="fml:perspective.name" minOccurs="0"/>
            </xs:sequence>
        </xs:complexType>
    </xs:element>
    <xs:element name="perspective.name" type="xs:string"/>
    <xs:element name="namespace.name" type="xs:string"/>
</xs:schema>

