<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema targetNamespace="urn:epcglobal:ale:xsd:1" 
    xmlns:ale="urn:epcglobal:ale:xsd:1" 
    xmlns:epcglobal="urn:epcglobal:xsd:1" 
    xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
    elementFormDefault="unqualified" 
    attributeFormDefault="unqualified"
    version="1.0">

    <xsd:annotation>
        <xsd:documentation xml:lang="en">
            <epcglobal:copyright>
             Copyright  (C) 2005, 2004 Epcglobal Inc., All Rights Reserved.
            </epcglobal:copyright>
            <epcglobal:disclaimer>
             EPCglobal Inc., its members, officers, directors, employees, or
             agents shall not be liable for any injury, loss, damages, financial
             or otherwise, arising from, related to, or caused by the use of
             this document.  The use of said document shall constitute your
             express consent to the foregoing exculpation.
            </epcglobal:disclaimer>
            <epcglobal:specification>
             Application Level Events (ALE) version 1.0
            </epcglobal:specification>
        </xsd:documentation>
    </xsd:annotation>

    <xsd:import namespace="urn:epcglobal:xsd:1" schemaLocation="./EPCglobal.xsd"/>

    <!-- ALE ELEMENTS -->

    <xsd:element name="ECSpec" type="ale:ECSpec"/>
    <xsd:element name="ECReports" type="ale:ECReports"/>

    <!-- ALE TYPES -->

    <!-- items listed alphabetically by name -->

    <!-- Some element types accommodate extensibility in the manner of
         "Versioning XML Vocabularies" by David Orchard (see
         http://www.xml.com/pub/a/2003/12/03/versioning.html).

         In this approach, an optional <extension> element is defined
         for each extensible element type, where an <extension> element
         may contain future elements defined in the target namespace.

         In addition to the optional <extension> element, extensible element
         types are declared with a final xsd:any wildcard to accommodate
         future elements defined by third parties (as denoted by the ##other
         namespace).

         Finally, the xsd:anyAttribute facility is used to allow arbitrary
         attributes to be added to extensible element types. -->


    <xsd:complexType name="ECBoundarySpec">
        <xsd:annotation>
            <xsd:documentation xml:lang="en">
             A ECBoundarySpec specifies how the beginning and end of event cycles
             are to be determined.  The startTrigger and repeatPeriod elements
             are mutually exclusive.  One may, however, specify a ECBoundarySpec
             with neither event cycle start condition (i.e., startTrigger nor
             repeatPeriod) present.  At least one event cycle stopping condition
             (stopTrigger, duration, and/or stableSetInterval) must be present.
            </xsd:documentation>
        </xsd:annotation>
        <xsd:sequence>
            <xsd:element name="startTrigger" type="ale:ECTrigger" minOccurs="0"/>
            <xsd:element name="repeatPeriod" type="ale:ECTime" minOccurs="0"/>
            <xsd:element name="stopTrigger" type="ale:ECTrigger" minOccurs="0"/>
            <xsd:element name="duration" type="ale:ECTime" minOccurs="0"/>
            <xsd:element name="stableSetInterval" type="ale:ECTime" minOccurs="0"/>
            <xsd:element name="extension" type="ale:ECBoundarySpecExtension" 
                         minOccurs="0"/>
            <xsd:any processContents="lax" minOccurs="0" maxOccurs="unbounded"
                     namespace="##other"/>
        </xsd:sequence>
        <xsd:anyAttribute processContents="lax"/>
    </xsd:complexType>

    <xsd:complexType name="ECBoundarySpecExtension">
        <xsd:sequence>
            <xsd:any processContents="lax" minOccurs="1" maxOccurs="unbounded"
                     namespace="##local"/>
        </xsd:sequence>
        <xsd:anyAttribute processContents="lax"/>
    </xsd:complexType>


    <xsd:complexType name="ECExcludePatterns">
        <xsd:sequence>
            <xsd:element name="excludePattern" type="xsd:string" minOccurs="0" 
                         maxOccurs="unbounded"/>
        </xsd:sequence>
    </xsd:complexType>

    <xsd:complexType name="ECFilterSpec">
        <xsd:annotation>
            <xsd:documentation xml:lang="en">
             A ECFilterSpec specifies what EPCs are to be included in the final
             report. The ECFilterSpec implements a flexible filtering scheme based on
             pattern lists for inclusion and exclusion.
            </xsd:documentation>
        </xsd:annotation>
        <xsd:sequence>
            <xsd:element name="includePatterns" type="ale:ECIncludePatterns" 
                         minOccurs="0"/>
            <xsd:element name="excludePatterns" type="ale:ECExcludePatterns" 
                         minOccurs="0"/>
            <xsd:element name="extension" type="ale:ECFilterSpecExtension" 
                         minOccurs="0"/>
            <xsd:any processContents="lax" minOccurs="0" maxOccurs="unbounded"
                     namespace="##other"/>
        </xsd:sequence>
        <xsd:anyAttribute processContents="lax"/>
    </xsd:complexType>

    <xsd:complexType name="ECFilterSpecExtension">
        <xsd:sequence>
            <xsd:any processContents="lax" minOccurs="1" maxOccurs="unbounded"
                     namespace="##local"/>
        </xsd:sequence>
        <xsd:anyAttribute processContents="lax"/>
    </xsd:complexType>

    <xsd:complexType name="ECGroupSpec">
       <xsd:sequence>
          <xsd:element name="pattern" type="xsd:string"
                       minOccurs="0" maxOccurs="unbounded"/>
       </xsd:sequence>
    </xsd:complexType>

    <xsd:complexType name="ECIncludePatterns">
        <xsd:sequence>
            <xsd:element name="includePattern" type="xsd:string" minOccurs="0" 
                         maxOccurs="unbounded"/>
        </xsd:sequence>
    </xsd:complexType>

    <xsd:complexType name="ECLogicalReaders">
        <xsd:sequence>
            <xsd:element name="logicalReader" type="xsd:string" maxOccurs="unbounded"/>
        </xsd:sequence>
    </xsd:complexType>

    <xsd:complexType name="ECReport">
        <xsd:sequence>
           <xsd:element name="group" type="ale:ECReportGroup" minOccurs="0" maxOccurs="unbounded"/>
          <xsd:element name="extension" type="ale:ECReportExtension" 
                       minOccurs="0"/>
          <xsd:any processContents="lax" minOccurs="0" maxOccurs="unbounded"
                   namespace="##other"/>
        </xsd:sequence>
        <xsd:attribute name="reportName" type="xsd:string" use="required"/>
        <xsd:anyAttribute processContents="lax"/>
    </xsd:complexType>

    <xsd:complexType name="ECReportExtension">
        <xsd:sequence>
            <xsd:any processContents="lax" minOccurs="1" maxOccurs="unbounded"
                     namespace="##local"/>
        </xsd:sequence>
        <xsd:anyAttribute processContents="lax"/>
    </xsd:complexType>

    <xsd:complexType name="ECReportList">
       <xsd:sequence>
          <xsd:element name="report" type="ale:ECReport" minOccurs="0" maxOccurs="unbounded"/>
       </xsd:sequence>
    </xsd:complexType>

    <xsd:complexType name="ECReportGroup">
       <xsd:sequence>
          <xsd:element name="groupList" type="ale:ECReportGroupList" minOccurs="0"/>
          <xsd:element name="groupCount" type="ale:ECReportGroupCount" minOccurs="0"/>
          <xsd:element name="extension" type="ale:ECReportGroupExtension" 
                       minOccurs="0"/>
          <xsd:any processContents="lax" minOccurs="0" maxOccurs="unbounded"
                   namespace="##other"/>
       </xsd:sequence>
       <!-- The groupName attribute SHALL be omitted to indicate the default group. -->
       <xsd:attribute name="groupName" type="xsd:string" use="optional"/>
       <xsd:anyAttribute processContents="lax"/>
    </xsd:complexType>

    <xsd:complexType name="ECReportGroupExtension">
        <xsd:sequence>
            <xsd:any processContents="lax" minOccurs="1" maxOccurs="unbounded"
                     namespace="##local"/>
        </xsd:sequence>
        <xsd:anyAttribute processContents="lax"/>
    </xsd:complexType>

    <xsd:complexType name="ECReportGroupList">
       <xsd:sequence>
          <xsd:element name="member" type="ale:ECReportGroupListMember"
                       minOccurs="0" maxOccurs="unbounded"/>
          <xsd:element name="extension" type="ale:ECReportGroupListExtension" 
                       minOccurs="0"/>
          <xsd:any processContents="lax" minOccurs="0" maxOccurs="unbounded"
                   namespace="##other"/>
       </xsd:sequence>
    </xsd:complexType>

    <xsd:complexType name="ECReportGroupListExtension">
        <xsd:sequence>
            <xsd:any processContents="lax" minOccurs="1" maxOccurs="unbounded"
                     namespace="##local"/>
        </xsd:sequence>
        <xsd:anyAttribute processContents="lax"/>
    </xsd:complexType>

    <xsd:complexType name="ECReportGroupListMember">
       <xsd:sequence>
          <!-- Each of the following four elements SHALL be omitted if null. -->
          <xsd:element name="epc" type="epcglobal:EPC" minOccurs="0"/>
          <xsd:element name="tag" type="epcglobal:EPC" minOccurs="0"/>
          <xsd:element name="rawHex" type="epcglobal:EPC" minOccurs="0"/>
          <xsd:element name="rawDecimal" type="epcglobal:EPC" minOccurs="0"/>
          <xsd:element name="extension" type="ale:ECReportGroupListMemberExtension" 
                       minOccurs="0"/>
          <xsd:any processContents="lax" minOccurs="0" maxOccurs="unbounded"
                   namespace="##other"/>
       </xsd:sequence>
       <xsd:anyAttribute processContents="lax"/>
    </xsd:complexType>

    <xsd:complexType name="ECReportGroupListMemberExtension">
        <xsd:sequence>
            <xsd:any processContents="lax" minOccurs="1" maxOccurs="unbounded"
                     namespace="##local"/>
        </xsd:sequence>
        <xsd:anyAttribute processContents="lax"/>
    </xsd:complexType>

    <xsd:complexType name="ECReportGroupCount">
        <xsd:sequence>
            <xsd:element name="count" type="xsd:int"/>
            <xsd:element name="extension" type="ale:ECReportGroupCountExtension" 
                         minOccurs="0"/>
            <xsd:any processContents="lax" minOccurs="0" maxOccurs="unbounded"
                     namespace="##other"/>
        </xsd:sequence>
        <xsd:anyAttribute processContents="lax"/>
    </xsd:complexType>

    <xsd:complexType name="ECReportGroupCountExtension">
        <xsd:sequence>
            <xsd:any processContents="lax" minOccurs="1" maxOccurs="unbounded"
                     namespace="##local"/>
        </xsd:sequence>
        <xsd:anyAttribute processContents="lax"/>
    </xsd:complexType>

    <xsd:complexType name="ECReportOutputSpec">
        <xsd:annotation>
            <xsd:documentation xml:lang="en">
             ECReportOutputSpec specifies how the final set of EPCs is to be reported
             with respect to type.
            </xsd:documentation>
        </xsd:annotation>
        <xsd:sequence>
            <xsd:element name="extension" type="ale:ECReportOutputSpecExtension" 
                         minOccurs="0"/>
            <xsd:any processContents="lax" minOccurs="0" maxOccurs="unbounded"
                     namespace="##other"/>
        </xsd:sequence>
        <xsd:attribute name="includeEPC" type="xsd:boolean" default="false"/>
        <xsd:attribute name="includeTag" type="xsd:boolean" default="false"/>
        <xsd:attribute name="includeRawHex" type="xsd:boolean" default="false"/>
        <xsd:attribute name="includeRawDecimal" type="xsd:boolean" default="false"/>
        <xsd:attribute name="includeCount" type="xsd:boolean" default="false"/>
    </xsd:complexType>

    <xsd:complexType name="ECReportOutputSpecExtension">
        <xsd:sequence>
            <xsd:any processContents="lax" minOccurs="1" maxOccurs="unbounded"
                     namespace="##local"/>
        </xsd:sequence>
        <xsd:anyAttribute processContents="lax"/>
    </xsd:complexType>


    <xsd:complexType name="ECReports">
        <xsd:annotation>
            <xsd:documentation xml:lang="en">
             ECReports is the output from an event cycle. The "meat" of an ECReports
             instance is the lists of count report instances and list report
             instances, each corresponding to an ECReportSpec instance in the event
             cycle's ECSpec. In addition to the reports themselves, ECReports contains
             a number of "header" fields that provide useful information about the
             event cycle.
            </xsd:documentation>
        </xsd:annotation>
        <xsd:complexContent>
            <xsd:extension base="epcglobal:Document">
                <xsd:sequence>
                    <xsd:element name="reports" type="ale:ECReportList"/>
                    <xsd:element name="extension" type="ale:ECReportsExtension" 
                                 minOccurs="0"/>
                    <xsd:element name="ECSpec" type="ale:ECSpec" minOccurs="0"/>
                    <xsd:any processContents="lax" minOccurs="0" maxOccurs="unbounded"
                             namespace="##other"/>
                </xsd:sequence>
                <xsd:attribute name="specName" type="xsd:string" use="required"/>
                <xsd:attribute name="date" type="xsd:dateTime" use="required"/>
                <xsd:attribute name="ALEID" type="xsd:string" use="required"/>
                <xsd:attribute name="totalMilliseconds" type="xsd:long" use="required"/>
                <xsd:attribute name="terminationCondition" 
                               type="ale:ECTerminationCondition" use="required"/>
	         <xsd:attribute name="schemaURL" type="xsd:string" use="optional"/>
                <xsd:anyAttribute processContents="lax"/>
            </xsd:extension>
        </xsd:complexContent>
    </xsd:complexType>

    <xsd:complexType name="ECReportsExtension">
        <xsd:sequence>
            <xsd:any processContents="lax" minOccurs="1" maxOccurs="unbounded"
                     namespace="##local"/>
        </xsd:sequence>
        <xsd:anyAttribute processContents="lax"/>
    </xsd:complexType>


    <xsd:complexType name="ECReportSetSpec">
        <xsd:annotation>
            <xsd:documentation xml:lang="en">
             ECReportSetSpec specifies which set of EPCs is to be considered for
             filtering and output.
            </xsd:documentation>
        </xsd:annotation>
        <xsd:attribute name="set" type="ale:ECReportSetEnum"/>
    </xsd:complexType>

    <xsd:simpleType name="ECReportSetEnum">
        <xsd:annotation>
            <xsd:documentation xml:lang="en">
             ECReportSetEnum is an enumerated type denoting what set of EPCs is to be
             considered for filtering and output: all EPCs read in the current event
             cycle, additions from the previous event cycle, or deletions from the
             previous event cycle.
            </xsd:documentation>
        </xsd:annotation>
        <xsd:restriction base="xsd:NCName">
            <xsd:enumeration value="CURRENT"/>
            <xsd:enumeration value="ADDITIONS"/>
            <xsd:enumeration value="DELETIONS"/>
        </xsd:restriction>
    </xsd:simpleType>

    <xsd:complexType name="ECReportSpec">
        <xsd:annotation>
            <xsd:documentation xml:lang="en">
             A ReportSpec specifies one report to be returned from executing an event
             cycle. An ECSpec may contain one or more ECReportSpec instances.
            </xsd:documentation>
        </xsd:annotation>
        <xsd:sequence>
            <xsd:element name="reportSet" type="ale:ECReportSetSpec"/>
            <xsd:element name="filterSpec" type="ale:ECFilterSpec" minOccurs="0"/>
            <xsd:element name="groupSpec" type="ale:ECGroupSpec" minOccurs="0"/>
            <xsd:element name="output" type="ale:ECReportOutputSpec"/>
            <xsd:element name="extension" type="ale:ECReportSpecExtension" 
                         minOccurs="0"/>
            <xsd:any processContents="lax" minOccurs="0" maxOccurs="unbounded"
                     namespace="##other"/>
        </xsd:sequence>
        <xsd:attribute name="reportName" type="xsd:string" use="required"/>
        <xsd:attribute name="reportIfEmpty" type="xsd:boolean" default="false"/>
	<xsd:attribute name="reportOnlyOnChange" type="xsd:boolean" default="false"/>
        <xsd:anyAttribute processContents="lax"/>
    </xsd:complexType>

    <xsd:complexType name="ECReportSpecExtension">
        <xsd:sequence>
            <xsd:any processContents="lax" minOccurs="1" maxOccurs="unbounded"
                     namespace="##local"/>
        </xsd:sequence>
        <xsd:anyAttribute processContents="lax"/>
    </xsd:complexType>


    <xsd:complexType name="ECReportSpecs">
        <xsd:sequence>
            <xsd:element name="reportSpec" type="ale:ECReportSpec" 
                         maxOccurs="unbounded"/>
        </xsd:sequence>
    </xsd:complexType>

    <xsd:complexType name="ECSpec">
        <xsd:annotation>
            <xsd:documentation xml:lang="en">
             An ECSpec describes an event cycle and one or more reports that are to
             be generated from it. It contains a list of logical readers whose reader
             cycles are to be included in the event cycle, a specification of read
             cycle timing, a specification of how the boundaries of event cycles are
             to be determined, and list of specifications each of which describes a
             report to be generated from this event cycle.
            </xsd:documentation>
        </xsd:annotation>
        <xsd:complexContent>
            <xsd:extension base="epcglobal:Document">
                <xsd:sequence>
                    <xsd:element name="logicalReaders" type="ale:ECLogicalReaders"/>
                    <xsd:element name="boundarySpec" type="ale:ECBoundarySpec"/>
                    <xsd:element name="reportSpecs" type="ale:ECReportSpecs"/>
                    <xsd:element name="extension" type="ale:ECSpecExtension" 
                                 minOccurs="0"/>
                    <xsd:any processContents="lax" minOccurs="0" maxOccurs="unbounded"
                             namespace="##other"/>
                </xsd:sequence>
                <xsd:attribute name="includeSpecInReports" type="xsd:boolean"
                               default="false"/>
                <xsd:anyAttribute processContents="lax"/>
            </xsd:extension>
        </xsd:complexContent>
    </xsd:complexType>

    <xsd:complexType name="ECSpecExtension">
        <xsd:sequence>
            <xsd:any processContents="lax" minOccurs="1" maxOccurs="unbounded"
                     namespace="##local"/>
        </xsd:sequence>
        <xsd:anyAttribute processContents="lax"/>
    </xsd:complexType>


    <xsd:simpleType name="ECTerminationCondition">
        <xsd:restriction base="xsd:NCName">
            <xsd:enumeration value="TRIGGER"/>
            <xsd:enumeration value="DURATION"/>
            <xsd:enumeration value="STABLE_SET"/>
            <xsd:enumeration value="UNREQUEST"/>
        </xsd:restriction>
    </xsd:simpleType>

    <xsd:complexType name="ECTime">
        <xsd:annotation>
            <xsd:documentation xml:lang="en">
             An ECTime specifies a time duration in physical units.
            </xsd:documentation>
        </xsd:annotation>
        <xsd:simpleContent>
            <xsd:extension base="xsd:long">
                <xsd:attribute name="unit" type="ale:ECTimeUnit"/>
            </xsd:extension>
        </xsd:simpleContent>
    </xsd:complexType>

    <xsd:simpleType name="ECTimeUnit">
        <xsd:annotation>
            <xsd:documentation xml:lang="en">
             ECTimeUnit represents the supported physical time unit: millisecond
            </xsd:documentation>
        </xsd:annotation>
        <xsd:restriction base="xsd:NCName">
            <xsd:enumeration value="MS"/>
        </xsd:restriction>
    </xsd:simpleType>

    <xsd:complexType name="ECTrigger">
        <xsd:annotation>
            <xsd:documentation xml:lang="en">
             A trigger is a URI that is used to specify a start or stop trigger for
             an event cycle.
            </xsd:documentation>
        </xsd:annotation>
        <xsd:simpleContent>
            <xsd:extension base="xsd:string"/>
        </xsd:simpleContent>
    </xsd:complexType>
</xsd:schema>

