<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" version="1.0"> 

  <!-- A type that supports some XHTML -->
  <xs:complexType name="xhtmlContentType">
    <xs:choice minOccurs="0" maxOccurs="unbounded">
      <xs:element ref="p"/>
      <xs:element ref="br"/>
      <xs:element ref="hr"/>
      <xs:element ref="ol"/>
      <xs:element ref="ul"/>
      <xs:element ref="table"/>
      <xs:element ref="blockquote"/>
    </xs:choice>
  </xs:complexType>
  
  <!-- A simple XHTML-style paragraph element -->
  <xs:element name="p">
    <xs:complexType mixed="true">
      <xs:choice minOccurs="0" maxOccurs="unbounded">
        <xs:element ref="a"/>
        <xs:element ref="i"/>
        <xs:element ref="b"/>
        <xs:element ref="br"/>
        <xs:element ref="hr"/>
        <xs:element ref="ul"/>
        <xs:element ref="ol"/>
        <xs:element ref="blockquote"/>
      </xs:choice>
    </xs:complexType>
  </xs:element>
  
  <!-- An XHTML-style hyper-link element -->
  <xs:element name="a">
    <xs:complexType mixed="true">
      <xs:attribute name="href" type="xs:string" use="required"/>
    </xs:complexType>
  </xs:element>

  <!-- A simple XHTML-style indented element -->
  <xs:element name="blockquote">
    <xs:complexType mixed="true">
      <xs:choice minOccurs="0" maxOccurs="unbounded">
        <xs:element ref="br"/>
        <xs:element ref="p"/>
	      <xs:element ref="ol"/>
	      <xs:element ref="ul"/>
        <xs:element ref="table"/>
        <xs:element ref="blockquote"/>
      </xs:choice>
    </xs:complexType>
  </xs:element>

  <!-- A simple XHTML-style unordered list element -->
  <xs:element name="ul">
    <xs:complexType>
      <xs:sequence minOccurs="1" maxOccurs="unbounded">
        <xs:element ref="li"/>
      </xs:sequence>
    </xs:complexType>
  </xs:element>

  <!-- A simple XHTML-style ordered list element -->
  <xs:element name="ol">
    <xs:complexType>
      <xs:sequence minOccurs="1" maxOccurs="unbounded">
        <xs:element ref="li"/>
      </xs:sequence>
      <xs:attribute name="type" type="xs:string" use="optional"/>
    </xs:complexType>
  </xs:element>

  <!-- A simple XHTML-style list item element -->
  <xs:element name="li">
    <xs:complexType mixed="true">
      <xs:choice minOccurs="0" maxOccurs="unbounded">
        <xs:element ref="a"/>
        <xs:element ref="p"/>
        <xs:element ref="i"/>
        <xs:element ref="b"/>
	      <xs:element ref="ol"/>
	      <xs:element ref="ul"/>
        <xs:element ref="blockquote"/>
      </xs:choice>
    </xs:complexType>
  </xs:element>

  <!-- An XHTML-style italicized element -->
  <xs:element name="i">
    <xs:complexType mixed="true">
      <xs:choice minOccurs="0" maxOccurs="unbounded">
        <xs:element ref="b"/>
      </xs:choice>
    </xs:complexType>
  </xs:element>

  <!-- An XHTML-style boldface element -->
  <xs:element name="b">
    <xs:complexType mixed="true">
      <xs:choice minOccurs="0" maxOccurs="unbounded">
        <xs:element ref="i"/>
      </xs:choice>
    </xs:complexType>
  </xs:element>

  <!-- An XHTML-style break element -->
  <xs:element name="br"/>

  <!-- An XHTML-style horizontal rule element -->
  <xs:element name="hr"/>

  <!-- A simple XHTML-style table element -->
  <xs:element name="table">
    <xs:complexType>
      <xs:sequence minOccurs="1" maxOccurs="unbounded">
        <xs:element ref="tr"/>
      </xs:sequence>
      <xs:attribute name="border" type="xs:int" use="optional"/>
      <xs:attribute name="cellpadding" type="xs:int" use="optional"/>
      <xs:attribute name="bordercolor" type="xs:string" use="optional"/>
      <xs:attribute name="width" type="xs:string" use="optional"/>
    </xs:complexType>
  </xs:element>

  <!-- A simple XHTML-style table row element -->
  <xs:element name="tr">
    <xs:complexType>
      <xs:choice minOccurs="1" maxOccurs="unbounded">
        <xs:element ref="th"/>
        <xs:element ref="td"/>
      </xs:choice>
    </xs:complexType>
  </xs:element>

  <!-- A simple XHTML-style table column header element -->
  <xs:element name="th">
    <xs:complexType mixed="true">
      <xs:attribute name="scope" type="xs:string" use="optional"/>
    </xs:complexType>
  </xs:element>

  <!-- A simple XHTML-style table cell element -->
  <xs:element name="td">
    <xs:complexType mixed="true">
      <xs:choice minOccurs="0" maxOccurs="unbounded">
        <xs:element ref="div"/>
      </xs:choice>
      <xs:attribute name="colspan" type="xs:int" use="optional"/>
    </xs:complexType>
  </xs:element>

  <!-- A simple XHTML-style division element -->
  <xs:element name="div">
    <xs:complexType mixed="true">
      <xs:attribute name="align" type="xs:string" use="optional"/>
    </xs:complexType>
  </xs:element>


  <!-- A type that can only have the values "yes" or "no" -->
	<xs:simpleType name="yesOrNoType">
		<xs:restriction base="xs:string">
			<xs:enumeration value="yes"/>
			<xs:enumeration value="no"/>
		</xs:restriction>
	</xs:simpleType>

  <!-- A basic section type supporting an Id attribute and a Table of Contents indicator attribute -->
  <xs:complexType name="basicSectionType">
    <xs:attribute name="id" type="xs:string" use="optional"/>
    <xs:attribute name="toc" type="yesOrNoType" use="optional"/>
  </xs:complexType>

  <!-- Extending the previous basic section type to include a title element -->
  <xs:complexType name="basicTitledSectionType">
    <xs:complexContent>
      <xs:extension base="basicSectionType">
        <xs:sequence>
          <xs:element name="title" type="xs:string"/>
        </xs:sequence>
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>

  <!-- Extending the basicSectionType for use in "Routine Uses" front matter section -->
  <xs:complexType name="routineUsesType">
    <xs:complexContent>
      <xs:extension base="basicSectionType">
        <xs:sequence>
          <xs:element name="xhtmlContent" type="xhtmlContentType"/>
        </xs:sequence>
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>

  <!-- Extending the basicSectionType for use in appendices by adding a letter element -->
  <xs:complexType name="appendixType">
    <xs:complexContent>
      <xs:extension base="basicSectionType">
        <xs:sequence>
          <xs:element name="title" type="xs:string" minOccurs="0"/>
          <xs:element name="xhtmlContent" type="xhtmlContentType" minOccurs="0"/>
          <xs:element name="genericSubsection" type="genericSubsectionType" minOccurs="0"/>
        </xs:sequence>
        <xs:attribute name="letter" type="xs:string" use="optional"/>
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>

  <xs:element name="regulationsOther">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="heading" type="xs:string"/>
        <xs:element name="xhtmlContent" type="xhtmlContentType"/>
      </xs:sequence>
    </xs:complexType>
  </xs:element>

  <xs:complexType name="subRegulationsType">
    <xs:sequence>
      <xs:element name="heading" type="xs:string"/>
    </xs:sequence>
    <xs:attribute name="number" type="xs:string" use="required"/>
  </xs:complexType>

  <xs:element name="regulationsAppendix">
    <xs:complexType>
      <xs:complexContent>
        <xs:extension base="subRegulationsType">
		      <xs:sequence>
		        <xs:element name="xhtmlContent" type="xhtmlContentType" minOccurs="0"/>
		        <xs:element ref="regulationsOther" minOccurs="0" maxOccurs="unbounded"/>
		      </xs:sequence>
        </xs:extension>
      </xs:complexContent>
    </xs:complexType>
  </xs:element>
  
  <xs:element name="regulationsSubpart">
    <xs:complexType>
      <xs:complexContent>
        <xs:extension base="subRegulationsType">
          <xs:sequence>
            <xs:element name="xhtmlContent" type="xhtmlContentType" minOccurs="0"/>
            <xs:element ref="regulationsAppendix" minOccurs="0" maxOccurs="unbounded"/>
            <xs:element ref="regulationsOther" minOccurs="0" maxOccurs="unbounded"/>
          </xs:sequence>
        </xs:extension>
      </xs:complexContent>
    </xs:complexType>
  </xs:element>

  <xs:element name="regulationsPart">
    <xs:complexType>
      <xs:complexContent>
        <xs:extension base="subRegulationsType">
          <xs:sequence>
            <xs:element name="xhtmlContent" type="xhtmlContentType" minOccurs="0"/>
            <xs:element ref="regulationsSubpart" minOccurs="0" maxOccurs="unbounded"/>
            <xs:element ref="regulationsAppendix" minOccurs="0" maxOccurs="unbounded"/>
            <xs:element ref="regulationsOther" minOccurs="0" maxOccurs="unbounded"/>
          </xs:sequence>
        </xs:extension>
      </xs:complexContent>
    </xs:complexType>
  </xs:element>

  <xs:element name="regulationsChapter">
    <xs:complexType>
      <xs:complexContent>
        <xs:extension base="subRegulationsType">
          <xs:sequence>
            <xs:element name="xhtmlContent" type="xhtmlContentType" minOccurs="0"/>
            <xs:element ref="regulationsPart" minOccurs="0" maxOccurs="unbounded"/>
            <xs:element ref="regulationsSubpart" minOccurs="0" maxOccurs="unbounded"/>
            <xs:element ref="regulationsAppendix" minOccurs="0" maxOccurs="unbounded"/>
            <xs:element ref="regulationsOther" minOccurs="0" maxOccurs="unbounded"/>
          </xs:sequence>
        </xs:extension>
      </xs:complexContent>
    </xs:complexType>
  </xs:element>

  <xs:element name="regulationsSubtitle">
    <xs:complexType>
      <xs:complexContent>
        <xs:extension base="subRegulationsType">
          <xs:sequence>
            <xs:element name="xhtmlContent" type="xhtmlContentType" minOccurs="0"/>
            <xs:element ref="regulationsChapter" minOccurs="0" maxOccurs="unbounded"/>
            <xs:element ref="regulationsPart" minOccurs="0" maxOccurs="unbounded"/>
            <xs:element ref="regulationsSubpart" minOccurs="0" maxOccurs="unbounded"/>
            <xs:element ref="regulationsAppendix" minOccurs="0" maxOccurs="unbounded"/>
            <xs:element ref="regulationsOther" minOccurs="0" maxOccurs="unbounded"/>
          </xs:sequence>
        </xs:extension>
      </xs:complexContent>
    </xs:complexType>
  </xs:element>

  <xs:element name="regulationsTitle">
    <xs:complexType>
      <xs:complexContent>
        <xs:extension base="subRegulationsType">
          <xs:sequence>
            <xs:element name="xhtmlContent" type="xhtmlContentType" minOccurs="0"/>
            <xs:element ref="regulationsSubtitle" minOccurs="0" maxOccurs="unbounded"/>
            <xs:element ref="regulationsChapter" minOccurs="0" maxOccurs="unbounded"/>
            <xs:element ref="regulationsPart" minOccurs="0" maxOccurs="unbounded"/>
            <xs:element ref="regulationsSubpart" minOccurs="0" maxOccurs="unbounded"/>
            <xs:element ref="regulationsAppendix" minOccurs="0" maxOccurs="unbounded"/>
            <xs:element ref="regulationsOther" minOccurs="0" maxOccurs="unbounded"/>
          </xs:sequence>
        </xs:extension>
      </xs:complexContent>
    </xs:complexType>
  </xs:element>

  <!-- A type for linking to a CFR regulation granule file -->
  <xs:complexType name="regulationsType">
		<xs:complexContent>
			<xs:extension base="basicSectionType">
        <xs:sequence>
          <xs:element name="title" type="xs:string" minOccurs="0"/>
          <xs:element ref="regulationsTitle"/>
				</xs:sequence>
			</xs:extension>
		</xs:complexContent>
  </xs:complexType>

  <!-- A type for listing a previous publication -->
  <xs:complexType name="previouslyPublishedType">
    <xs:sequence>
      <xs:element name="url" type="xs:string"/>
      <xs:element name="title" type="xs:string"/>
      <xs:element name="date">
        <xs:complexType>
          <xs:attribute name="year" type="xs:int" use="required"/>
          <xs:attribute name="month" type="xs:int" use="required"/>
          <xs:attribute name="day" type="xs:int" use="required"/>
        </xs:complexType>
      </xs:element>
    </xs:sequence>
  </xs:complexType>

  <!-- A type for standard subsections found within a standard PAI section -->
  <xs:complexType name="subsectionType" mixed="true">
    <xs:choice maxOccurs="unbounded">
      <xs:element name="xhtmlContent" type="xhtmlContentType" minOccurs="0"/>
    </xs:choice>
    <xs:attribute name="type" use="required">
		  <xs:simpleType>
		    <xs:restriction base="xs:string">
          <xs:enumeration value="systemName"/>
          <xs:enumeration value="securityClassification"/>
          <xs:enumeration value="systemLocation"/>
          <xs:enumeration value="categoriesOfIndividuals"/>
          <xs:enumeration value="categoriesOfRecords"/>
          <xs:enumeration value="authorityForMaintenance"/>
          <xs:enumeration value="purpose"/>
          <xs:enumeration value="routineUsesOfRecords"/>
          <xs:enumeration value="disclosureToConsumer"/>
          <xs:enumeration value="policiesAndPractices"/>
          <xs:enumeration value="storage"/>
          <xs:enumeration value="retrievability"/>
          <xs:enumeration value="safeguards"/>
          <xs:enumeration value="retentionAndDisposal"/>
          <xs:enumeration value="systemManager"/>
          <xs:enumeration value="notificationProcedure"/>
          <xs:enumeration value="recordAccessProcedures"/>
          <xs:enumeration value="contestingRecordProcedures"/>
          <xs:enumeration value="recordSourceCategories"/>
          <xs:enumeration value="exemptionsClaimed"/>
          <xs:enumeration value="systemsExempted"/>
          <xs:enumeration value="history"/>
		    </xs:restriction>
		  </xs:simpleType>
    </xs:attribute>
  </xs:complexType>

  <!-- A type for a generic subsection -->
  <xs:complexType name="genericSubsectionType">
    <xs:sequence>
      <xs:element name="title" type="xs:string"/>
      <xs:element name="xhtmlContent" type="xhtmlContentType" minOccurs="0"/>
    </xs:sequence>
  </xs:complexType>

  <!-- A standard PAI section type -->
  <xs:complexType name="sectionType">
    <xs:complexContent>
      <xs:extension base="basicSectionType">
        <xs:sequence>
          <xs:element name="systemNumber" type="xs:string"/>
          <xs:element name="see" type="xs:string" minOccurs="0"/>
          <xs:element name="formerly" type="xs:string" minOccurs="0"/>
          <xs:element name="subsection" type="subsectionType" minOccurs="0" maxOccurs="unbounded"/>
        </xs:sequence>
        <xs:attribute name="reserved" type="yesOrNoType" use="optional"/>
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>

  <!-- A type for listing an optional sub-agency -->
  <xs:complexType name="subagencyType">
    <xs:sequence>
      <xs:element name="name" type="xs:string"/>
      <xs:element name="abbrev" type="xs:string"/>
      <xs:element name="note" type="xs:string" minOccurs="0"/>
      <xs:element name="previouslyPublished" type="previouslyPublishedType" minOccurs="0" maxOccurs="unbounded"/>
      <xs:element name="routineUses" type="routineUsesType" minOccurs="0"/>
      <xs:element name="section" type="sectionType" minOccurs="0" maxOccurs="unbounded"/>
      <xs:element name="appendix" type="appendixType" minOccurs="0" maxOccurs="unbounded"/>
    </xs:sequence>
    <xs:attribute name="toc" type="yesOrNoType" use="optional"/>
  </xs:complexType>

  <!-- A type for the single agency in a PAI document -->
  <xs:complexType name="agencyType">
    <xs:complexContent>
      <xs:extension base="subagencyType">
        <xs:sequence>
		      <xs:element name="previousPubs" type="basicTitledSectionType" minOccurs="0"/>
          <xs:element name="subagency" type="subagencyType" minOccurs="0" maxOccurs="unbounded"/>
          <xs:element name="regulations" type="regulationsType" minOccurs="0" maxOccurs="unbounded"/>
        </xs:sequence>
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>
  
  <!-- The root PAI document element -->
	<xs:element name="pai">
	  <xs:complexType>
	    <xs:sequence>
        <xs:element name="agency" type="agencyType"/>
	    </xs:sequence>
	  </xs:complexType>
	</xs:element>

</xs:schema>