<?xml version="1.0" encoding="UTF-8" ?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<!-- define a faculty_members element -->
<xs:element name="faculty_members" type="faculty_members_type"/>
<!-- faculty_members_type -->
<xs:complexType name="faculty_members_type">
<xs:sequence>
<xs:element name="faculty_member" type="faculty_member_type" minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
<!-- faculty_member_type -->
<xs:complexType name="faculty_member_type">
<xs:all>
<xs:element name="name" type="name_type"/>
<xs:element name="faculty_types" type="faculty_types_type"/>
<xs:element name="office" type="location_type"/>
<xs:element name="email_addresses" type="email_addresses_type"/>
<xs:element name="websites" type="websites_type" minOccurs="0"/>
<xs:element name="phone_numbers" type="phone_numbers_type" minOccurs="0"/>
<xs:element name="research_areas" type="research_areas_type" minOccurs="0"/>
<xs:element name="degrees" type="degrees_type" minOccurs="0"/>
<xs:element name="awards" type="awards_type" minOccurs="0"/>
<xs:element name="office_hours" type="meeting_times_and_places_type" minOccurs="0"/>
<xs:element name="classes" type="classes_type" minOccurs="0"/>
<xs:element name="published_books" type="published_books_type" minOccurs="0"/>
<xs:element name="journal_articles" type="journal_articles_type" minOccurs="0"/>
<xs:element name="conferences" type="conferences_type" minOccurs="0"/>
<xs:element name="grad_students" type="grad_students_type" minOccurs="0"/>
</xs:all>
</xs:complexType>
<!-- first_name_type -->
<xs:simpleType name="first_name_type">
<xs:restriction base="xs:normalizedString">
<xs:pattern value="[\w'-]+"/>
</xs:restriction>
</xs:simpleType>
<!-- last_name_type -->
<xs:simpleType name="last_name_type">
<xs:restriction base="xs:normalizedString">
<xs:pattern value="[\w'-]+"/>
</xs:restriction>
</xs:simpleType>
<!-- middle_name_type -->
<xs:simpleType name="middle_name_type">
<xs:restriction base="xs:normalizedString">
<xs:pattern value="[\w'-]+"/>
</xs:restriction>
</xs:simpleType>
<!-- name_type -->
<xs:complexType name="name_type">
<xs:all>
<xs:element name="first_name" type="first_name_type"/>
<xs:element name="middle_name" type="middle_name_type" minOccurs="0"/>
<xs:element name="last_name" type="last_name_type"/>
</xs:all>
</xs:complexType>
<!-- faculty_type_type -->
<xs:simpleType name="faculty_type_type">
<xs:restriction base="xs:normalizedString">
<xs:enumeration value="lecturer"/>
<xs:enumeration value="professor"/>
<xs:enumeration value="researcher"/>
<xs:enumeration value="adjunct"/>
<xs:enumeration value="associate"/>
<xs:enumeration value="assistant"/>
<xs:enumeration value="visiting"/>
</xs:restriction>
</xs:simpleType>
<!-- faculty_types_type -->
<xs:complexType name="faculty_types_type">
<xs:sequence>
<xs:element name="faculty_type" type="faculty_type_type" minOccurs="1" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
<!-- building_abbreviation_type -->
<xs:simpleType name="building_abbreviation_type">
<xs:restriction base="xs:normalizedString">
<xs:pattern value="[A-Z]{2,5}" />
</xs:restriction>
</xs:simpleType>
<!-- building_type -->
<xs:complexType name="building_type">
<xs:all>
<xs:element name="abbreviation" type="building_abbreviation_type"/>
<xs:element name="long_name" type="xs:normalizedString"/>
</xs:all>
</xs:complexType>
<!-- room_type -->
<xs:simpleType name="room_type">
<xs:restriction base="xs:normalizedString">
<!-- TODO: we could add some restrictions here -->
</xs:restriction>
</xs:simpleType>
<!-- location_type -->
<xs:complexType name="location_type">
<xs:all>
<xs:element name="building" type="building_type" />
<xs:element name="room" type="room_type" />
</xs:all>
</xs:complexType>
<!-- email_type -->
<xs:simpleType name="email_type">
<xs:restriction base="xs:normalizedString">
<!-- pattern is taken and modified from the example at http://www.regular-expressions.info/email.html -->
<xs:pattern value="[a-z0-9!#$%&'*+/=?^_`{|}~-]+(\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@([a-z0-9]([a-z0-9-]*[a-z0-9])?\.)+([A-Za-z]{2}|edu|com|org|net|gov|mil|biz|info|mobi|name|aero|jobs|museum|arpa|asia|cat|coop|int|pro|tel|travel)"/>
</xs:restriction>
</xs:simpleType>
<!-- email_addresses_type -->
<xs:complexType name="email_addresses_type">
<xs:sequence>
<xs:element name="email" type="email_type" minOccurs="1" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
<!-- website_type -->
<!-- NOTE: this might be too restrictive. Are there any other ways to specify a webpage? -->
<xs:simpleType name="website_type">
<xs:restriction base="xs:anyURI">
<xs:pattern value="http://.*|https://.*|shttp://.*"/>
</xs:restriction>
</xs:simpleType>
<!-- websites_type -->
<xs:complexType name="websites_type">
<xs:sequence>
<xs:element name="website" type="website_type" minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
<!-- country_code_type -->
<xs:simpleType name="country_code_type">
<xs:restriction base="xs:normalizedString">
<xs:pattern value="\d|\d\d|\d\d\d"/>
</xs:restriction>
</xs:simpleType>
<!-- area_code_type -->
<xs:simpleType name="area_code_type">
<xs:restriction base="xs:normalizedString">
<xs:pattern value="\d\d\d"/>
</xs:restriction>
</xs:simpleType>
<!-- number_type -->
<xs:simpleType name="number_type">
<xs:restriction base="xs:normalizedString">
<xs:pattern value="\d+"/>
</xs:restriction>
</xs:simpleType>
<!-- phone_type_type -->
<xs:simpleType name="phone_type_type">
<xs:restriction base="xs:normalizedString">
<xs:enumeration value="home"/>
<xs:enumeration value="work"/>
<xs:enumeration value="cell"/>
<xs:enumeration value="fax"/>
<xs:enumeration value="pager"/>
</xs:restriction>
</xs:simpleType>
<!-- phone_number_type -->
<xs:complexType name="phone_number_type">
<xs:all>
<xs:element name="phone_type" type="phone_type_type"/>
<xs:element name="country_code" type="country_code_type" minOccurs="0"/>
<xs:element name="area_code" type="area_code_type" minOccurs="0"/>
<xs:element name="number" type="number_type"/>
</xs:all>
</xs:complexType>
<!-- phone_numbers_type -->
<xs:complexType name="phone_numbers_type">
<xs:sequence>
<xs:element name="phone_number" type="phone_number_type" minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
<!-- research_area_type -->
<xs:simpleType name="research_area_type">
<xs:restriction base="xs:normalizedString">
</xs:restriction>
</xs:simpleType>
<!-- research_areas_type -->
<xs:complexType name="research_areas_type">
<xs:sequence>
<xs:element name="research_area" type="research_area_type" minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
<!-- degree_type_type -->
<xs:simpleType name="degree_type_type">
<xs:restriction base="xs:normalizedString">
<xs:enumeration value="Certificate of Completion"/>
<xs:enumeration value="Associate's Degree"/>
<xs:enumeration value="Bachelor's Degree"/>
<xs:enumeration value="Master's Degree"/>
<xs:enumeration value="Doctoral Degree"/>
<xs:enumeration value="Honorary Degree"/>
</xs:restriction>
</xs:simpleType>
<!-- degree_type -->
<xs:complexType name="degree_type">
<xs:all>
<xs:element name="year_awarded" type="xs:gYear" />
<xs:element name="institution" type="xs:normalizedString" />
<xs:element name="degree_type" type="degree_type_type" />
<xs:element name="specialization" type="xs:normalizedString"/>
</xs:all>
</xs:complexType>
<!-- degrees_type -->
<xs:complexType name="degrees_type">
<xs:sequence>
<xs:element name="degree" type="degree_type" minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
<!-- award_type -->
<xs:complexType name="award_type">
<xs:all>
<xs:element name="name" type="xs:normalizedString" />
<xs:element name="year_awarded" type="xs:gYear" />
</xs:all>
</xs:complexType>
<!-- awards_type -->
<xs:complexType name="awards_type">
<xs:sequence>
<xs:element name="award" type="award_type" minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
<!-- day_type -->
<xs:simpleType name="day_type">
<xs:restriction base="xs:normalizedString">
<xs:enumeration value="Monday"/>
<xs:enumeration value="Tuesday"/>
<xs:enumeration value="Wednesday"/>
<xs:enumeration value="Thursday"/>
<xs:enumeration value="Friday"/>
<xs:enumeration value="Saturday"/>
<xs:enumeration value="Sunday"/>
</xs:restriction>
</xs:simpleType>
<!-- days_type -->
<xs:complexType name="days_type">
<xs:sequence>
<!-- TODO: it would be nice to find a way to make it so that each day is different -->
<xs:element name="day" type="day_type" maxOccurs="7"/>
</xs:sequence>
</xs:complexType>
<!-- meeting_time_and_place_type -->
<xs:complexType name="meeting_time_and_place_type">
<xs:all>
<xs:element name="start_time" type="xs:time" />
<xs:element name="end_time" type="xs:time" />
<xs:element name="location" type="location_type" />
<xs:element name="days" type="days_type" />
</xs:all>
</xs:complexType>
<!-- meeting_times_and_places_type -->
<xs:complexType name="meeting_times_and_places_type">
<xs:sequence>
<xs:element name="meeting_time_and_place" type="meeting_time_and_place_type" minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
<!-- names_type -->
<xs:complexType name="names_type">
<xs:sequence>
<xs:element name="name" type="name_type" minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
<!-- year_type -->
<xs:simpleType name="year_type">
<xs:restriction base="xs:normalizedString">
<xs:pattern value="\d\d\d\d"/>
</xs:restriction>
</xs:simpleType>
<!-- unique_number_type -->
<xs:simpleType name="unique_number_type">
<xs:restriction base="xs:normalizedString">
<xs:pattern value="\d\d\d\d\d"/>
</xs:restriction>
</xs:simpleType>
<!-- semester_type -->
<xs:simpleType name="semester_type">
<xs:restriction base="xs:normalizedString">
<xs:enumeration value="fall"/>
<xs:enumeration value="spring"/>
<xs:enumeration value="summer"/>
</xs:restriction>
</xs:simpleType>
<!-- field_of_study_type -->
<xs:simpleType name="field_of_study_type">
<xs:restriction base="xs:normalizedString">
<xs:pattern value="[A-Z]{1,3}"/>
</xs:restriction>
</xs:simpleType>
<!-- level_type -->
<xs:simpleType name="level_type">
<xs:restriction base="xs:normalizedString">
<xs:enumeration value="undergrad"/>
<xs:enumeration value="grad"/>
</xs:restriction>
</xs:simpleType>
<!-- course_type -->
<xs:complexType name="course_type">
<xs:all>
<xs:element name="title" type="xs:normalizedString" />
<xs:element name="field_of_study" type="field_of_study_type" />
<xs:element name="number" type="xs:normalizedString"/>
<xs:element name="level" type="level_type"/>
<xs:element name="description" type="xs:normalizedString" />
</xs:all>
</xs:complexType>
<!-- class_type -->
<xs:complexType name="class_type">
<xs:all>
<xs:element name="unique_number" type="unique_number_type" />
<xs:element name="course" type="course_type" />
<xs:element name="semester" type="semester_type" />
<xs:element name="year" type="year_type" />
<xs:element name="meeting_times_and_places" type="meeting_times_and_places_type"/>
</xs:all>
</xs:complexType>
<!-- classes_type -->
<xs:complexType name="classes_type">
<xs:sequence>
<xs:element name="class" type="class_type" minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
<!-- ISBN_type -->
<xs:simpleType name="ISBN_type">
<xs:restriction base="xs:normalizedString">
<!-- NOTE: ISBN numbers can be either 10 or 13 digit versions,
and both versions can have "X" or a numeric digit as the last 'digit' -->
<xs:pattern value="(\d\d\d)?\d\d\d\d\d\d\d\d\d[X0123456789]"/>
</xs:restriction>
</xs:simpleType>
<!-- book_type -->
<xs:complexType name="book_type">
<xs:all>
<xs:element name="ISBN" type="ISBN_type" />
<xs:element name="title" type="xs:normalizedString" />
<xs:element name="publisher" type="xs:normalizedString" />
<xs:element name="year_published" type="xs:gYear" />
</xs:all>
</xs:complexType>
<!-- published_books_type -->
<xs:complexType name="published_books_type">
<xs:sequence>
<xs:element name="book" type="book_type" minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
<!-- article_type -->
<xs:complexType name="article_type">
<xs:all>
<xs:element name="journal" type="xs:normalizedString" />
<xs:element name="title" type="xs:normalizedString" />
<xs:element name="issue_date" type="xs:gYearMonth" />
<xs:element name="issue_number" type="xs:normalizedString" />
</xs:all>
</xs:complexType>
<!-- journal_articles_type -->
<xs:complexType name="journal_articles_type">
<xs:sequence>
<xs:element name="article" type="article_type" minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
<!-- conference_type -->
<xs:complexType name="conference_type">
<xs:all>
<xs:element name="year" type="xs:gYear" />
<xs:element name="name" type="xs:string" />
<xs:element name="location" type="xs:string" />
<xs:element name="presentation_title" type="xs:string" />
</xs:all>
</xs:complexType>
<!-- conferences_type -->
<xs:complexType name="conferences_type">
<xs:sequence>
<xs:element name="conference" type="conference_type" minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
<!-- grad_student_type -->
<xs:complexType name="grad_student_type">
<xs:all>
<xs:element name="name" type="name_type" />
<xs:element name="type" type="grad_degree_type" />
<xs:element name="thesis_title" type="xs:normalizedString" />
<xs:element name="thesis_date" type="xs:gYearMonth" />
</xs:all>
</xs:complexType>
<!-- grad_students_type -->
<xs:complexType name="grad_students_type">
<xs:sequence>
<xs:element name="grad_student" type="grad_student_type" minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
<!-- grad_degree_type -->
<xs:simpleType name="grad_degree_type">
<xs:restriction base="xs:normalizedString">
<xs:enumeration value="Master's Degree"/>
<xs:enumeration value="Doctoral Degree"/>
</xs:restriction>
</xs:simpleType>
</xs:schema>