<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <!--  -->
    <!--  -->
    <!-- ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ -->
    <!--       specialized basic data types        -->
    <!-- ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ -->
    <!--  -->
    <xsd:simpleType name="nonnullTokenType">
        <xsd:annotation>
            <xsd:documentation>Surprisingly, an empty string is a valid token.
                This type is used for tokens that must have at least one
                character in them.</xsd:documentation>
        </xsd:annotation>
        <xsd:restriction base="xsd:token">
            <xsd:minLength value="1"/>
        </xsd:restriction>
    </xsd:simpleType>
    <!-- ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ -->
    <xsd:complexType name="nameAttrNonnullTokenType">
        <xsd:annotation>
            <xsd:documentation>This type is used for non-null tokens that have a
                required 'name' attribute.</xsd:documentation>
        </xsd:annotation>
        <xsd:simpleContent>
            <xsd:extension base="nonnullTokenType">
                <xsd:attribute name="name" type="nonnullTokenType" 
                    use="required"/>
            </xsd:extension>
        </xsd:simpleContent>
    </xsd:complexType>
    <!-- ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ -->
    <xsd:complexType name="attrCidType">
        <xsd:annotation>
            <xsd:documentation>This type is used for non-null tokens that have
                and optional 'custom1' and 'custom2' attributes, the value of
                which must be a cid.</xsd:documentation>
        </xsd:annotation>
        <xsd:simpleContent>
            <xsd:extension base="cidType">
                <xsd:attribute name="custom1" type="xsd:string" use="optional"/>
                <xsd:attribute name="custom2" type="xsd:string" use="optional"/>
            </xsd:extension>
        </xsd:simpleContent>
    </xsd:complexType>
    <!-- ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ -->
    <xsd:complexType name="typeAttrNonnullTokenType">
        <xsd:annotation>
            <xsd:documentation>This type is used for non-null tokens that have a
                required 'type' attribute.</xsd:documentation>
        </xsd:annotation>
        <xsd:simpleContent>
            <xsd:extension base="nonnullTokenType">
                <xsd:attribute name="type" type="nonnullTokenType" 
                    use="required"/>
                <xsd:attribute name="custom1" type="xsd:string" use="optional"/>
                <xsd:attribute name="custom2" type="xsd:string" use="optional"/>
            </xsd:extension>
        </xsd:simpleContent>
    </xsd:complexType>
    <!-- ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ -->
    <xsd:simpleType name="dateType">
        <xsd:union>
            <xsd:simpleType>
                <xsd:restriction base="xsd:date"/>
            </xsd:simpleType>
            <xsd:simpleType>
                <xsd:restriction base="xsd:gYearMonth"/>
            </xsd:simpleType>
            <xsd:simpleType>
                <xsd:restriction base="xsd:gYear"/>
            </xsd:simpleType>
            <xsd:simpleType>
                <xsd:restriction base="xsd:dateTime"/>
            </xsd:simpleType>
            <xsd:simpleType>
                <xsd:restriction base="nonnullTokenType">
                    <xsd:enumeration value="none"/>
                </xsd:restriction>
            </xsd:simpleType>
        </xsd:union>
    </xsd:simpleType>
    <!-- ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ -->
    <!-- NOTE: end of pattern line is ...[a-zA-Z0-9\.\-]+)?"/>  -->
    <xsd:simpleType name="cidType">
        <xsd:restriction base="nonnullTokenType">
            <xsd:pattern value=
"[a-zA-Z][a-zA-Z0-9\-]*(\.[a-zA-Z0-9\-]+){0,2}_[a-zA-Z0-9\.\-]+(_[a-zA-Z0-9\.\-]+)?"/>
        </xsd:restriction>
    </xsd:simpleType>
    <!-- ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ -->
    <!-- ########################## -->
    <!-- ##   MAJOR DATA TYPES   ## -->
    <!-- ########################## -->
    <!--  -->
    <!-- ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ -->
    <!-- bodyType -->
    <!-- ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ -->
    <xsd:complexType name="emType" mixed="true">
        <xsd:choice minOccurs="0" maxOccurs="unbounded">
            <xsd:element name="em" type="emType"/>
            <xsd:element name="strong" type="strongType"/>
            <xsd:element name="code" type="codeType"/>
            <xsd:element name="a" type="aType"/>
            <xsd:element name="pre" type="preType"/>
        </xsd:choice>
    </xsd:complexType>
    <!-- -->
    <xsd:complexType name="strongType" mixed="true">
        <xsd:choice minOccurs="0" maxOccurs="unbounded">
            <xsd:element name="em" type="emType"/>
            <xsd:element name="strong" type="strongType"/>
            <xsd:element name="code" type="codeType"/>
            <xsd:element name="a" type="aType"/>
            <xsd:element name="pre" type="preType"/>
        </xsd:choice>
    </xsd:complexType>
    <!-- -->
    <xsd:complexType name="codeType" mixed="true">
        <xsd:choice minOccurs="0" maxOccurs="unbounded">
            <xsd:element name="em" type="emType"/>
            <xsd:element name="strong" type="strongType"/>
            <xsd:element name="code" type="codeType"/>
            <xsd:element name="a" type="aType"/>
            <xsd:element name="pre" type="preType"/>
        </xsd:choice>
    </xsd:complexType>
    <!-- -->
    <xsd:complexType name="aType" mixed="true">
        <xsd:choice minOccurs="0" maxOccurs="unbounded">
            <xsd:element name="em" type="emType"/>
            <xsd:element name="strong" type="strongType"/>
            <xsd:element name="code" type="codeType"/>
            <xsd:element name="pre" type="preType"/>
        </xsd:choice>
        <xsd:attribute name="href" type="nonnullTokenType" use="optional"/>
    </xsd:complexType>
    <!-- -->
    <xsd:complexType name="preType" mixed="true">
        <xsd:choice minOccurs="0" maxOccurs="unbounded">
            <xsd:element name="em" type="emType"/>
            <xsd:element name="strong" type="strongType"/>
            <xsd:element name="code" type="codeType"/>
            <xsd:element name="a" type="aType"/>
            <xsd:element name="pre" type="preType"/>
        </xsd:choice>
    </xsd:complexType>
    <!-- -->
    <!-- -->
    <xsd:complexType name="pType" mixed="true">
        <xsd:choice minOccurs="0" maxOccurs="unbounded">
            <xsd:element name="em" type="emType"/>
            <xsd:element name="strong" type="strongType"/>
            <xsd:element name="code" type="codeType"/>
            <xsd:element name="a" type="aType"/>
            <xsd:element name="pre" type="preType"/>
        </xsd:choice>
    </xsd:complexType>
    <!-- -->
    <!-- ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ -->
    <xsd:complexType name="bodyContents">
        <xsd:choice maxOccurs="unbounded">
            <xsd:element name="p" type="pType"/>
        </xsd:choice>
    </xsd:complexType>
    <!-- ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ -->
    <xsd:complexType name="bodyType">
        <xsd:complexContent>
            <xsd:extension base="bodyContents">
                <xsd:attribute name="name" type="nonnullTokenType"
                    use="required"/>
                <xsd:attribute name="exact" default="true" type="xsd:boolean"/>
                <xsd:attribute name="custom1" type="xsd:string" use="optional"/>
                <xsd:attribute name="custom2" type="xsd:string" use="optional"/>
            </xsd:extension>
        </xsd:complexContent>
    </xsd:complexType>
    <!-- ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ -->
    <!-- contextType -->
    <!-- ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ -->
    <xsd:complexType name="contactInfoType">
        <xsd:sequence>
            <xsd:element name="local-address" minOccurs="0"
                maxOccurs="unbounded" type="nonnullTokenType"/>
            <xsd:element name="city" minOccurs="0" type=
                "nonnullTokenType"/>
            <xsd:element name="state-or-province" minOccurs="0"
                maxOccurs="unbounded" type="nonnullTokenType"/>
            <xsd:element name="postal-code" minOccurs="0" maxOccurs= "unbounded" 
                type="nonnullTokenType"/>
            <xsd:element name="country" minOccurs="0" maxOccurs="unbounded" 
                type="nonnullTokenType"/>
            <xsd:element name="email" minOccurs="0" maxOccurs="unbounded" 
                type="nonnullTokenType"/>
            <xsd:element name="phone" minOccurs="0" maxOccurs="unbounded" 
                type="nonnullTokenType"/>
            <xsd:element name="other" minOccurs="0" maxOccurs="unbounded" 
                type="nameAttrNonnullTokenType"/>
        </xsd:sequence>
    </xsd:complexType>
    <!--  -->
    <xsd:complexType name="agentType">
        <xsd:sequence>
            <xsd:element name="prefix" minOccurs="0" maxOccurs="unbounded" 
                type="nonnullTokenType"/>
            <xsd:element name="first" minOccurs="0" type="nonnullTokenType"/>
            <xsd:element name="middle" minOccurs="0" maxOccurs="unbounded" 
                type="nonnullTokenType"/>
            <xsd:element name="last" minOccurs="0" type="nonnullTokenType"/>
            <xsd:element name="suffix" minOccurs="0" maxOccurs="unbounded" 
                type="nonnullTokenType"/>
            <xsd:element name="contact-info" minOccurs="0" 
                type="contactInfoType"/>
        </xsd:sequence>
        <xsd:attribute name="role" type="nonnullTokenType"/>
    </xsd:complexType>
    <!--  -->
    <!--  -->
    <xsd:complexType name="titlePartType">
        <xsd:simpleContent>
            <xsd:extension base="nonnullTokenType">
                <xsd:attribute name="separator" type="nonnullTokenType" 
                    use="optional"/>
            </xsd:extension>
        </xsd:simpleContent>
    </xsd:complexType>
    <!--  -->
    <xsd:complexType name="containerType">
        <xsd:sequence>
            <xsd:element name="name-part" minOccurs="0" maxOccurs="unbounded" 
                type="titlePartType"/>
            <xsd:element name="name" minOccurs="0" maxOccurs="unbounded" 
                type="typeAttrNonnullTokenType"/>
            <xsd:element name="date" minOccurs="0" maxOccurs="unbounded" 
                type="typeAttrNonnullTokenType"/>
            <xsd:element name="contact-info" minOccurs="0" 
                type="contactInfoType"/>
        </xsd:sequence>
        <xsd:attribute name="type" use="optional"/>
        <xsd:attribute name="style" use="optional"/>
    </xsd:complexType>
    <!--  -->
    <!--  -->
    <xsd:complexType name="idPartType">
        <xsd:simpleContent>
            <xsd:extension base="nonnullTokenType">
                <xsd:attribute name="unit" type="nonnullTokenType" 
                    use="optional"/>
            </xsd:extension>
        </xsd:simpleContent>
    </xsd:complexType>
    <!--  -->
    <xsd:complexType name="rangeType">
        <xsd:sequence>
            <xsd:element name="begin" type="nonnullTokenType"/>
            <xsd:element name="end" type="nonnullTokenType"/>
        </xsd:sequence>
        <xsd:attribute name="unit" type="nonnullTokenType" use="optional"/>
    </xsd:complexType>
    <!--  -->
    <xsd:complexType name="pointType">
        <xsd:simpleContent>
            <xsd:extension base="nonnullTokenType">
                <xsd:attribute name="unit" type="nonnullTokenType" 
                    use="optional"/>
            </xsd:extension>
        </xsd:simpleContent>
    </xsd:complexType>
    <!--  -->
    <xsd:complexType name="locationType">
        <xsd:sequence>
            <xsd:element name="id-part" minOccurs="0" maxOccurs="unbounded" 
                type="idPartType"/>
            <xsd:choice maxOccurs="unbounded">
                <xsd:element name="range" type="rangeType"/>
                <xsd:element name="point" type="pointType"/>
            </xsd:choice>
        </xsd:sequence>
        <xsd:attribute name="style" type="nonnullTokenType" use="optional"/>
    </xsd:complexType>
    <!--  -->
    <!--  -->
    <xsd:complexType name="contextType">
        <xsd:sequence>
            <xsd:element name="agent" minOccurs="0" maxOccurs=
                "unbounded" type="agentType"/>
            <xsd:element name="date-created" minOccurs="0" type="dateType"/>
            <xsd:element name="date-modified" minOccurs="0"
                maxOccurs="unbounded" type="dateType"/>
            <xsd:element name="container" minOccurs="0" maxOccurs=
                "unbounded" type="containerType"/>
            <xsd:element name="location" minOccurs="0" type="locationType"/>
        </xsd:sequence>
        <xsd:attribute name="name" type="nonnullTokenType" use="required"/>
        <xsd:attribute name="custom1" type="xsd:string" use="optional"/>
        <xsd:attribute name="custom2" type="xsd:string" use="optional"/>
    </xsd:complexType>
    <!-- ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ -->
    <!-- ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ -->
    <!-- pointersType -->
    <!-- ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ -->
    <xsd:complexType name="ptrType">
        <xsd:sequence>
            <xsd:element name="card-id" type="cidType"/>
            <xsd:element name="pnotes" minOccurs="0" type="bodyContents"/>
        </xsd:sequence>
    </xsd:complexType>
    <!-- ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ -->
    <xsd:complexType name="pointersType">
        <xsd:sequence maxOccurs="unbounded">
            <xsd:element name="ptr" type="ptrType"/>
        </xsd:sequence>
        <xsd:attribute name="name" type="nonnullTokenType" use="required"/>
        <xsd:attribute name="quality" type="nonnullTokenType" use="optional"/>
        <xsd:attribute name="notes" type="nonnullTokenType" use="optional"/>
        <xsd:attribute name="custom1" type="xsd:string" use="optional"/>
        <xsd:attribute name="custom2" type="xsd:string" use="optional"/>
    </xsd:complexType>
    <!-- ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ -->
    <xsd:complexType name="commentOnType">
        <xsd:sequence maxOccurs="unbounded">
            <xsd:element name="ptr" type="ptrType"/>
        </xsd:sequence>
        <xsd:attribute name="notes" type="nonnullTokenType" use="optional"/>
        <xsd:attribute name="custom1" type="xsd:string" use="optional"/>
        <xsd:attribute name="custom2" type="xsd:string" use="optional"/>
    </xsd:complexType>
    <!-- ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ -->
    <!-- ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ -->
    <!-- specialType -->
    <!-- ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ -->
    <xsd:complexType name="specialType">
        <xsd:simpleContent>
            <xsd:extension base="xsd:string">
                <xsd:attribute name="name" type="nonnullTokenType" 
                    use="required"/>
                <xsd:attribute name="major-delimiter" type="nonnullTokenType" 
                    use="optional"/>
                <xsd:attribute name="minor-delimiter" type="nonnullTokenType"
                    use="optional"/>
                <xsd:attribute name="tertiary-delimiter" type="nonnullTokenType" 
                    use="optional"/>
                <xsd:attribute name="table-type" type="nonnullTokenType" 
                    use="optional"/>
                <xsd:attribute name="custom1" type="xsd:string" use="optional"/>
                <xsd:attribute name="custom2" type="xsd:string" use="optional"/>
            </xsd:extension>
        </xsd:simpleContent>
    </xsd:complexType>
    <!-- ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ -->
    <!-- ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ -->
    <!-- infoml element -->
    <!-- ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ -->
    <xsd:simpleType name="versionType">
        <xsd:restriction base="xsd:decimal">
            <xsd:minInclusive value="0.83"/>
            <xsd:maxInclusive value="0.83"/>
        </xsd:restriction>
    </xsd:simpleType>
    <!-- ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ -->
    <xsd:complexType name="infomlType">
        <xsd:sequence>
            <xsd:element name="cid" type="attrCidType"/>
            <xsd:element name="pid" minOccurs="0" maxOccurs=
                "unbounded" 
                type="nameAttrNonnullTokenType"/>
            <xsd:element name="selector" minOccurs="0" maxOccurs=
                "unbounded" 
                type="nameAttrNonnullTokenType"/>
            <xsd:element name="tag" minOccurs="0" maxOccurs=
                "unbounded" 
                type="nameAttrNonnullTokenType"/>
            <xsd:element name="body" maxOccurs="unbounded" type=
                "bodyType"/>
            <xsd:element name="context" minOccurs="0" maxOccurs=
                "unbounded" 
                type="contextType"/>
            <xsd:element name="comment-on" minOccurs="0" type=
                "commentOnType"/>
            <xsd:element name="pointers" minOccurs="0" maxOccurs=
                "unbounded" 
                type="pointersType"/>
            <xsd:element name="special" minOccurs="0" maxOccurs=
                "unbounded" 
                type="specialType"/>
        </xsd:sequence>
        <xsd:attribute name="signature" type="xsd:string" use="optional"/>
        <xsd:attribute name="encoding" type="nonnullTokenType" 
            use="required"/>
        <xsd:attribute name="version" type="versionType" use="required"/>
        <xsd:attribute name="based-on" type="cidType" use="optional"/>
        <xsd:attribute name="custom1" type="xsd:string" use="optional"/>
        <xsd:attribute name="custom2" type="xsd:string" use="optional"/>
    </xsd:complexType>
    <!-- ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ -->
    <!-- infoml-file -->
    <!-- ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ -->
    <xsd:element name="infoml-file">
        <xsd:complexType>
            <xsd:sequence maxOccurs="unbounded">
                <xsd:element name="infoml" type="infomlType"/>
            </xsd:sequence>
            <xsd:attribute name="title" type="nonnullTokenType" use="optional"/>
            <xsd:attribute name="custom1" type="xsd:string" use="optional"/>
            <xsd:attribute name="custom2" type="xsd:string" use="optional"/>
        </xsd:complexType>
    </xsd:element>
    <!-- ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ -->
</xsd:schema>
<!--  -->
<!--
CHANGE LOG:

0.83: Major restructuring, including: new comments element; combined
the group and content standard infocards into one kind of infocard;
added  contactInfoType; added features to agentType, containerType,
locationType, and contextType; converted many global elements to
complexTypes, leaving infoml-file as the only global element.

0.80: Changed the author element to an agent element; added type attribute
to agent element; removed more-authors element in favor of multiple
agent elements.

-->
