<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" targetNamespace="http://filmfestapp.com/schema/festival/v1" xmlns:v1="http://filmfestapp.com/schema/festival/v1">
  <xs:element name="festival">
    <xs:annotation>
      <xs:documentation>Flat Xml Schema for http://filmfestapp.com festival catalogues.

This is a http://relaxng.org/ compact schema, to convert to RelaxNG regular or w3c-xsd use
http://www.thaiopensource.com/relaxng/trang.html

To validate use e.g. http://xmlsoft.org/xmllint.html
$ xmllint --relaxng filmfest.flatv1.rng document.xml</xs:documentation>
    </xs:annotation>
    <xs:complexType>
      <xs:sequence>
        <xs:element ref="v1:creatorUrl"/>
        <xs:element minOccurs="0" ref="v1:geo"/>
        <xs:element ref="v1:homepage"/>
        <xs:element ref="v1:iconUrl"/>
        <xs:element maxOccurs="unbounded" ref="v1:section"/>
        <xs:element ref="v1:shortName"/>
        <xs:element ref="v1:title"/>
        <xs:element ref="v1:uuid"/>
        <xs:element maxOccurs="unbounded" ref="v1:venue"/>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
  <xs:element name="creatorUrl">
    <xs:simpleType>
      <xs:restriction base="xs:anyURI">
        <xs:minLength value="1"/>
      </xs:restriction>
    </xs:simpleType>
  </xs:element>
  <xs:element name="homepage">
    <xs:simpleType>
      <xs:restriction base="xs:anyURI">
        <xs:minLength value="1"/>
      </xs:restriction>
    </xs:simpleType>
  </xs:element>
  <xs:element name="iconUrl">
    <xs:simpleType>
      <xs:restriction base="xs:anyURI">
        <xs:minLength value="1"/>
      </xs:restriction>
    </xs:simpleType>
  </xs:element>
  <xs:element name="section">
    <xs:complexType>
      <xs:sequence>
        <xs:element maxOccurs="unbounded" ref="v1:movie"/>
        <xs:element ref="v1:title"/>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
  <xs:element name="movie">
    <xs:complexType>
      <xs:sequence>
        <xs:element minOccurs="0" maxOccurs="unbounded" ref="v1:actor"/>
        <xs:element minOccurs="0" ref="v1:contact"/>
        <xs:element maxOccurs="unbounded" name="country">
          <xs:simpleType>
            <xs:restriction base="xs:string">
              <xs:pattern value="[A-Z]{3}">
                <xs:annotation>
                  <xs:documentation>subset of "ISO country code"</xs:documentation>
                </xs:annotation>
              </xs:pattern>
            </xs:restriction>
          </xs:simpleType>
        </xs:element>
        <xs:element ref="v1:synopsis"/>
        <xs:element maxOccurs="unbounded" ref="v1:director"/>
        <xs:element minOccurs="0" ref="v1:distributor"/>
        <xs:element ref="v1:festivalUrl"/>
        <xs:element minOccurs="0" ref="v1:footage"/>
        <xs:element ref="v1:iconUrl"/>
        <xs:element ref="v1:imdbUrl"/>
        <xs:element minOccurs="0" maxOccurs="unbounded" ref="v1:language"/>
        <xs:element minOccurs="0" ref="v1:otitle"/>
        <xs:element minOccurs="0" maxOccurs="unbounded" ref="v1:producer"/>
        <xs:element minOccurs="0" maxOccurs="unbounded" ref="v1:screening"/>
        <xs:element minOccurs="0" maxOccurs="unbounded" ref="v1:scriptwriter"/>
        <xs:element minOccurs="0" ref="v1:subtitle"/>
        <xs:element ref="v1:title"/>
        <xs:element minOccurs="0" ref="v1:trailerUrl"/>
        <xs:element ref="v1:year"/>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
  <xs:element name="actor">
    <xs:simpleType>
      <xs:restriction base="xs:string">
        <xs:pattern value="\S(.*\S)?"/>
      </xs:restriction>
    </xs:simpleType>
  </xs:element>
  <xs:element name="contact">
    <xs:simpleType>
      <xs:restriction base="xs:string">
        <xs:pattern value="\S(.*\S)?"/>
      </xs:restriction>
    </xs:simpleType>
  </xs:element>
  <xs:element name="synopsis" type="xs:string"/>
  <xs:element name="director">
    <xs:simpleType>
      <xs:restriction base="xs:string">
        <xs:pattern value="\S(.*\S)?"/>
      </xs:restriction>
    </xs:simpleType>
  </xs:element>
  <xs:element name="distributor">
    <xs:simpleType>
      <xs:restriction base="xs:string">
        <xs:pattern value="\S(.*\S)?"/>
      </xs:restriction>
    </xs:simpleType>
  </xs:element>
  <xs:element name="festivalUrl">
    <xs:simpleType>
      <xs:restriction base="xs:anyURI">
        <xs:minLength value="0"/>
      </xs:restriction>
    </xs:simpleType>
  </xs:element>
  <xs:element name="footage">
    <xs:simpleType>
      <xs:restriction base="xs:string">
        <xs:pattern value="\S(.*\S)?"/>
      </xs:restriction>
    </xs:simpleType>
  </xs:element>
  <xs:element name="imdbUrl">
    <xs:simpleType>
      <xs:restriction base="xs:anyURI">
        <xs:minLength value="1"/>
      </xs:restriction>
    </xs:simpleType>
  </xs:element>
  <xs:element name="language">
    <xs:simpleType>
      <xs:restriction base="xs:string">
        <xs:pattern value="[a-z]{2}">
          <xs:annotation>
            <xs:documentation>A ISO 2-letter language code</xs:documentation>
          </xs:annotation>
        </xs:pattern>
      </xs:restriction>
    </xs:simpleType>
  </xs:element>
  <xs:element name="otitle">
    <xs:simpleType>
      <xs:restriction base="xs:string">
        <xs:pattern value="\S(.*\S)?"/>
      </xs:restriction>
    </xs:simpleType>
  </xs:element>
  <xs:element name="producer">
    <xs:simpleType>
      <xs:restriction base="xs:string">
        <xs:pattern value="\S(.*\S)?"/>
      </xs:restriction>
    </xs:simpleType>
  </xs:element>
  <xs:element name="screening">
    <xs:complexType>
      <xs:sequence>
        <xs:element ref="v1:minutes"/>
        <xs:element ref="v1:dtstart"/>
        <xs:element ref="v1:uuid"/>
        <xs:element ref="v1:venueref"/>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
  <xs:element name="minutes">
    <xs:simpleType>
      <xs:restriction base="xs:integer">
        <xs:minInclusive value="1"/>
        <xs:maxInclusive value="1440"/>
      </xs:restriction>
    </xs:simpleType>
  </xs:element>
  <xs:element name="dtstart">
    <xs:simpleType>
      <xs:restriction base="xs:dateTime">
        <xs:pattern value="[0-9]{4}-[0-9]{2}-[0-9]{2}T[0-9]{2}:[0-9]{2}:[0-9]{2}Z"/>
      </xs:restriction>
    </xs:simpleType>
  </xs:element>
  <xs:element name="venueref">
    <xs:complexType>
      <xs:attribute name="idref" use="required" type="xs:NCName"/>
    </xs:complexType>
  </xs:element>
  <xs:element name="scriptwriter">
    <xs:simpleType>
      <xs:restriction base="xs:string">
        <xs:pattern value="\S(.*\S)?"/>
      </xs:restriction>
    </xs:simpleType>
  </xs:element>
  <xs:element name="subtitle">
    <xs:simpleType>
      <xs:restriction base="xs:string">
        <xs:pattern value="\S(.*\S)?"/>
      </xs:restriction>
    </xs:simpleType>
  </xs:element>
  <xs:element name="trailerUrl">
    <xs:simpleType>
      <xs:restriction base="xs:anyURI">
        <xs:pattern value="http.+\.youtube\.com/(v/|watch\?v=)([A-Za-z0-9._%\-]+)">
          <xs:annotation>
            <xs:documentation>youtube only</xs:documentation>
          </xs:annotation>
        </xs:pattern>
      </xs:restriction>
    </xs:simpleType>
  </xs:element>
  <xs:element name="year">
    <xs:simpleType>
      <xs:restriction base="xs:integer">
        <xs:minInclusive value="1900"/>
        <xs:maxInclusive value="2100"/>
      </xs:restriction>
    </xs:simpleType>
  </xs:element>
  <xs:element name="shortName">
    <xs:simpleType>
      <xs:restriction base="xs:string">
        <xs:pattern value="\S(.*\S)?"/>
      </xs:restriction>
    </xs:simpleType>
  </xs:element>
  <xs:element name="venue">
    <xs:complexType>
      <xs:sequence>
        <xs:element ref="v1:address"/>
        <xs:element ref="v1:geo"/>
        <xs:element ref="v1:phone"/>
        <xs:element ref="v1:title"/>
      </xs:sequence>
      <xs:attribute name="id" use="required" type="xs:NCName"/>
    </xs:complexType>
  </xs:element>
  <xs:element name="address">
    <xs:complexType>
      <xs:sequence>
        <xs:element ref="v1:city"/>
        <xs:element name="country">
          <xs:simpleType>
            <xs:restriction base="xs:string">
              <xs:pattern value="\S(.*\S)?"/>
            </xs:restriction>
          </xs:simpleType>
        </xs:element>
        <xs:element ref="v1:street"/>
        <xs:element ref="v1:zip"/>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
  <xs:element name="city">
    <xs:simpleType>
      <xs:restriction base="xs:string">
        <xs:pattern value="\S(.*\S)?"/>
      </xs:restriction>
    </xs:simpleType>
  </xs:element>
  <xs:element name="street">
    <xs:simpleType>
      <xs:restriction base="xs:string">
        <xs:pattern value="\S(.*\S)?"/>
      </xs:restriction>
    </xs:simpleType>
  </xs:element>
  <xs:element name="zip">
    <xs:simpleType>
      <xs:restriction base="xs:string">
        <xs:pattern value="\S(.*\S)?"/>
      </xs:restriction>
    </xs:simpleType>
  </xs:element>
  <xs:element name="phone">
    <xs:simpleType>
      <xs:restriction base="xs:string">
        <xs:pattern value="\S(.*\S)?"/>
      </xs:restriction>
    </xs:simpleType>
  </xs:element>
  <xs:element name="geo">
    <xs:simpleType>
      <xs:restriction base="xs:string">
        <xs:pattern value="(-?[0-9]+\.[0-9]+)[,;](-?[0-9]+\.[0-9]+)">
          <xs:annotation>
            <xs:documentation>A geo location</xs:documentation>
          </xs:annotation>
        </xs:pattern>
      </xs:restriction>
    </xs:simpleType>
  </xs:element>
  <xs:element name="uuid">
    <xs:simpleType>
      <xs:restriction base="xs:string">
        <xs:pattern value="[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}">
          <xs:annotation>
            <xs:documentation>A UUID</xs:documentation>
          </xs:annotation>
        </xs:pattern>
      </xs:restriction>
    </xs:simpleType>
  </xs:element>
  <xs:element name="title">
    <xs:simpleType>
      <xs:restriction base="xs:string">
        <xs:pattern value="\S(.*\S)?"/>
      </xs:restriction>
    </xs:simpleType>
  </xs:element>
</xs:schema>

