<?xml version="1.0" encoding="UTF-8"?> 
<xsd:schema targetNamespace="urn:epcglobal:epcis-query:xsd:2" 
   xmlns:epcis="urn:epcglobal:epcis:xsd:2" 
   xmlns:epcismd="urn:epcglobal:epcis-masterdata:xsd:2"
   xmlns:epcisq="urn:epcglobal:epcis-query:xsd:2" 
   xmlns:epcglobal="urn:epcglobal:xsd:1" 
   xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
   elementFormDefault="unqualified" 
   attributeFormDefault="unqualified"
   version="2.0">

  <xsd:annotation>
    <xsd:documentation xml:lang="en">
      <epcglobal:copyright>
         Copyright (C) 2006-2022 GS1 AISBL, All Rights Reserved
      </epcglobal:copyright>
      <epcglobal:disclaimer>
THIS DOCUMENT IS PROVIDED “AS IS” WITH NO WARRANTIES WHATSOEVER, INCLUDING ANY WARRANTY OF MERCHANTABILITY, NONINFRINGMENT, FITNESS FOR PARTICULAR PURPOSE, OR ANY WARRANTY OTHER WISE ARISING OUT OF THIS SPECIFICATION. GS1 disclaims all liability for any damages arising from use or misuse of this Standard, whether special, indirect, consequential, or compensatory damages, and including liability for infringement of any intellectual property rights, relating to use of information in or reliance upon this document.
GS1 retains the right to make changes to this document at any time, without notice. GS1 makes no warranty for the use of this document and assumes no responsibility for any errors which may appear in the document, nor does it make a commitment to update the information contained herein.
      </epcglobal:disclaimer>
      <epcglobal:specification>
         EPCIS Query 2.0
      </epcglobal:specification>
    </xsd:documentation>
  </xsd:annotation>

  <xsd:import namespace="urn:epcglobal:xsd:1" schemaLocation="https://ref.gs1.org/standards/epcis/2.0.1/epcglobal.xsd"/>
  <xsd:import namespace="urn:epcglobal:epcis:xsd:2" schemaLocation="https://ref.gs1.org/standards/epcis/2.0.1/epcglobal-epcis.xsd"/>

  <xsd:element name="EPCISQueryDocument" type="epcisq:EPCISQueryDocumentType"/>
  <xsd:complexType name="EPCISQueryDocumentType">
     <xsd:complexContent>
        <xsd:extension base="epcglobal:Document">
          <xsd:sequence>
            <xsd:element name="EPCISHeader" type="epcis:EPCISHeaderType" minOccurs="0"/>
            <xsd:element name="EPCISBody" type="epcisq:EPCISQueryBodyType"/>
            <xsd:element name="extension" type="epcisq:EPCISQueryDocumentExtensionType" minOccurs="0"/>
            <xsd:any namespace="##other" processContents="lax" minOccurs="0" maxOccurs="unbounded"/>
          </xsd:sequence>
          <xsd:anyAttribute processContents="lax"/>
        </xsd:extension>
     </xsd:complexContent>
  </xsd:complexType>

	<xsd:complexType name="EPCISQueryDocumentExtensionType">
		<xsd:sequence>
			<xsd:any namespace="##local" processContents="lax" maxOccurs="unbounded"/>
		</xsd:sequence>
		<xsd:anyAttribute processContents="lax"/>
	</xsd:complexType>

  <xsd:complexType name="EPCISQueryBodyType">
     <xsd:choice>
        <xsd:element ref="epcisq:GetQueryNames"/>
        <xsd:element ref="epcisq:GetQueryNamesResult"/>
        <xsd:element ref="epcisq:Subscribe"/>
        <xsd:element ref="epcisq:SubscribeResult"/>
        <xsd:element ref="epcisq:Unsubscribe"/>
        <xsd:element ref="epcisq:UnsubscribeResult"/>
        <xsd:element ref="epcisq:GetSubscriptionIDs"/>
        <xsd:element ref="epcisq:GetSubscriptionIDsResult"/>
        <xsd:element ref="epcisq:Poll"/>
        <xsd:element ref="epcisq:GetStandardVersion"/>
        <xsd:element ref="epcisq:GetStandardVersionResult"/>
        <xsd:element ref="epcisq:GetVendorVersion"/>
        <xsd:element ref="epcisq:GetVendorVersionResult"/>
        <xsd:element ref="epcisq:DuplicateNameException"/>
      <!-- queryValidationException unimplemented in EPCIS 1.0
        <xsd:element ref="epcisq:QueryValidationException"/>
      -->
        <xsd:element ref="epcisq:InvalidURIException"/>
        <xsd:element ref="epcisq:NoSuchNameException"/>
        <xsd:element ref="epcisq:NoSuchSubscriptionException"/>
        <xsd:element ref="epcisq:DuplicateSubscriptionException"/>
        <xsd:element ref="epcisq:QueryParameterException"/>
        <xsd:element ref="epcisq:QueryTooLargeException"/>
        <xsd:element ref="epcisq:QueryTooComplexException"/>
        <xsd:element ref="epcisq:SubscriptionControlsException"/>
        <xsd:element ref="epcisq:SubscribeNotPermittedException"/>
        <xsd:element ref="epcisq:SecurityException"/>
        <xsd:element ref="epcisq:ValidationException"/>
        <xsd:element ref="epcisq:ImplementationException"/>
        <xsd:element ref="epcisq:QueryResults"/>
      </xsd:choice>
   </xsd:complexType>

  <!-- EPCISSERVICE MESSAGE WRAPPERS -->

  <xsd:element name="GetQueryNames" type="epcisq:EmptyParms"/>
  <xsd:element name="GetQueryNamesResult" type="epcisq:ArrayOfString"/>

  <xsd:element name="Subscribe" type="epcisq:Subscribe"/>
  <xsd:complexType name="Subscribe">
     <xsd:sequence>
        <xsd:element name="queryName" type="xsd:string"/>
        <xsd:element name="params" type="epcisq:QueryParams"/>
        <xsd:element name="dest" type="xsd:anyURI"/>
        <xsd:element name="controls" type="epcisq:SubscriptionControls"/>
        <xsd:element name="subscriptionID" type="xsd:string"/>
     </xsd:sequence>
  </xsd:complexType>
  <xsd:element name="SubscribeResult" type="epcisq:VoidHolder"/>

  <xsd:element name="Unsubscribe" type="epcisq:Unsubscribe"/>
  <xsd:complexType name="Unsubscribe">
     <xsd:sequence>
        <xsd:element name="subscriptionID" type="xsd:string"/>
     </xsd:sequence>
  </xsd:complexType>
  <xsd:element name="UnsubscribeResult" type="epcisq:VoidHolder"/>

  <xsd:element name="GetSubscriptionIDs" type="epcisq:GetSubscriptionIDs"/>
  <xsd:complexType name="GetSubscriptionIDs">
     <xsd:sequence>
        <xsd:element name="queryName" type="xsd:string"/>
     </xsd:sequence>
  </xsd:complexType>
  <xsd:element name="GetSubscriptionIDsResult" type="epcisq:ArrayOfString"/>

  <xsd:element name="Poll" type="epcisq:Poll"/>
  <xsd:complexType name="Poll">
     <xsd:sequence>
        <xsd:element name="queryName" type="xsd:string"/>
        <xsd:element name="params" type="epcisq:QueryParams"/>
     </xsd:sequence>
  </xsd:complexType>
  <!-- The response from a Poll method is the QueryResults element, defined below.
       The QueryResults element is also used to deliver standing query results
       through the Query Callback Interface -->

  <xsd:element name="GetStandardVersion" type="epcisq:EmptyParms"/>
  <xsd:element name="GetStandardVersionResult" type="xsd:string"/>

  <xsd:element name="GetVendorVersion" type="epcisq:EmptyParms"/>
  <xsd:element name="GetVendorVersionResult" type="xsd:string"/>

  <xsd:element name="VoidHolder" type="epcisq:VoidHolder"/>
  <xsd:complexType name="VoidHolder">
     <xsd:sequence>
     </xsd:sequence>
  </xsd:complexType>

  <xsd:complexType name="EmptyParms"/>

  <xsd:complexType name="ArrayOfString">
     <xsd:sequence>
        <xsd:element name="string" type="xsd:string" minOccurs="0" maxOccurs="unbounded"/>
     </xsd:sequence>
  </xsd:complexType>

  <xsd:complexType name="SubscriptionControls">
    <xsd:sequence>
      <xsd:element name="schedule" type="epcisq:QuerySchedule" minOccurs="0"/>
      <xsd:element name="trigger" type="xsd:anyURI" minOccurs="0"/>
      <xsd:element name="initialRecordTime" type="epcis:DateTimeStamp" minOccurs="0"/>
      <xsd:element name="reportIfEmpty" type="xsd:boolean"/>
      <xsd:element name="extension" type="epcisq:SubscriptionControlsExtensionType" minOccurs="0"/>
      <xsd:any namespace="##other" processContents="lax" minOccurs="0" maxOccurs="unbounded"/>
    </xsd:sequence>
  </xsd:complexType>

  <xsd:complexType name="SubscriptionControlsExtensionType">
    <xsd:sequence>
      <xsd:any namespace="##local" processContents="lax" maxOccurs="unbounded"/>
    </xsd:sequence>
    <xsd:anyAttribute processContents="lax"/>
  </xsd:complexType>

  <xsd:complexType name="QuerySchedule">
    <xsd:sequence>
       <xsd:element name="second" type="xsd:string" minOccurs="0"/>
       <xsd:element name="minute" type="xsd:string" minOccurs="0"/>
       <xsd:element name="hour" type="xsd:string" minOccurs="0"/>
       <xsd:element name="dayOfMonth" type="xsd:string" minOccurs="0"/>
       <xsd:element name="month" type="xsd:string" minOccurs="0"/>
       <xsd:element name="dayOfWeek" type="xsd:string" minOccurs="0"/>
      <xsd:element name="extension" type="epcisq:QueryScheduleExtensionType" minOccurs="0"/>
      <xsd:any namespace="##other" processContents="lax" minOccurs="0" maxOccurs="unbounded"/>
    </xsd:sequence>
  </xsd:complexType>

  <xsd:complexType name="QueryScheduleExtensionType">
    <xsd:sequence>
      <xsd:any namespace="##local" processContents="lax" maxOccurs="unbounded"/>
    </xsd:sequence>
    <xsd:anyAttribute processContents="lax"/>
  </xsd:complexType>

  <xsd:complexType name="QueryParams">
    <xsd:sequence>
      <xsd:element name="param" type="epcisq:QueryParam" minOccurs="0" maxOccurs="unbounded"/>
    </xsd:sequence>
  </xsd:complexType>

  <xsd:complexType name="QueryParam">
    <xsd:sequence>
      <xsd:element name="name" type="xsd:string"/>
      <!-- See note in EPCIS spec text regarding the value for this element -->
      <xsd:element name="value" type="xsd:anyType"/>
    </xsd:sequence>
  </xsd:complexType>

  <xsd:element name="QueryResults" type="epcisq:QueryResults"/>
  <xsd:complexType name="QueryResults">
    <xsd:sequence>
      <xsd:element name="queryName" type="xsd:string"/>
      <xsd:element name="subscriptionID" type="xsd:string" minOccurs="0"/>
      <xsd:element name="resultsBody" type="epcisq:QueryResultsBody"/>
      <xsd:element name="extension" type="epcisq:QueryResultsExtensionType" minOccurs="0"/>
      <xsd:any namespace="##other" processContents="lax" minOccurs="0" maxOccurs="unbounded"/>
    </xsd:sequence>
  </xsd:complexType>

  <xsd:complexType name="QueryResultsExtensionType">
    <xsd:sequence>
      <xsd:any namespace="##local" processContents="lax" maxOccurs="unbounded"/>
    </xsd:sequence>
    <xsd:anyAttribute processContents="lax"/>
  </xsd:complexType>

  <xsd:complexType name="QueryResultsBody">
    <xsd:choice>
      <xsd:element name="EventList" type="epcis:EventListType"/>
      <xsd:element name="VocabularyList" type="epcis:VocabularyListType"/>
    </xsd:choice>
  </xsd:complexType>

  <!-- EPCIS EXCEPTIONS -->

  <xsd:element name="EPCISException" type="epcisq:EPCISException"/>
  <xsd:complexType name="EPCISException">
     <xsd:sequence>
        <xsd:element name="reason" type="xsd:string"/>
     </xsd:sequence>
  </xsd:complexType>

  <xsd:element name="DuplicateNameException" type="epcisq:DuplicateNameException"/>
  <xsd:complexType name="DuplicateNameException">
     <xsd:complexContent>
        <xsd:extension base="epcisq:EPCISException">
           <xsd:sequence/>
        </xsd:extension>
     </xsd:complexContent>
  </xsd:complexType>

  <!-- QueryValidationException not implemented in EPCIS 1.0
  <xsd:element name="QueryValidationException" type="epcisq:QueryValidationException"/>
  <xsd:complexType name="QueryValidationException">
     <xsd:complexContent>
        <xsd:extension base="epcisq:EPCISException">
           <xsd:sequence/>
        </xsd:extension>
     </xsd:complexContent>
  </xsd:complexType>
  -->

  <xsd:element name="InvalidURIException" type="epcisq:InvalidURIException"/>
  <xsd:complexType name="InvalidURIException">
     <xsd:complexContent>
        <xsd:extension base="epcisq:EPCISException">
           <xsd:sequence/>
        </xsd:extension>
     </xsd:complexContent>
  </xsd:complexType>

  <xsd:element name="NoSuchNameException" type="epcisq:NoSuchNameException"/>
  <xsd:complexType name="NoSuchNameException">
     <xsd:complexContent>
        <xsd:extension base="epcisq:EPCISException">
           <xsd:sequence/>
        </xsd:extension>
     </xsd:complexContent>
  </xsd:complexType>

  <xsd:element name="NoSuchSubscriptionException" type="epcisq:NoSuchSubscriptionException"/>
  <xsd:complexType name="NoSuchSubscriptionException">
     <xsd:complexContent>
        <xsd:extension base="epcisq:EPCISException">
           <xsd:sequence/>
        </xsd:extension>
     </xsd:complexContent>
  </xsd:complexType>

  <xsd:element name="DuplicateSubscriptionException" type="epcisq:DuplicateSubscriptionException"/>
  <xsd:complexType name="DuplicateSubscriptionException">
     <xsd:complexContent>
        <xsd:extension base="epcisq:EPCISException">
           <xsd:sequence/>
        </xsd:extension>
     </xsd:complexContent>
  </xsd:complexType>

  <xsd:element name="QueryParameterException" type="epcisq:QueryParameterException"/>
  <xsd:complexType name="QueryParameterException">
     <xsd:complexContent>
        <xsd:extension base="epcisq:EPCISException">
           <xsd:sequence/>
        </xsd:extension>
     </xsd:complexContent>
  </xsd:complexType>

  <xsd:element name="QueryTooLargeException" type="epcisq:QueryTooLargeException"/>
  <xsd:complexType name="QueryTooLargeException">
     <xsd:complexContent>
        <xsd:extension base="epcisq:EPCISException">
           <xsd:sequence>
             <xsd:element name="queryName" type="xsd:string" minOccurs="0"/>
             <xsd:element name="subscriptionID" type="xsd:string" minOccurs="0"/>
           </xsd:sequence>
        </xsd:extension>
     </xsd:complexContent>
  </xsd:complexType>

  <xsd:element name="QueryTooComplexException" type="epcisq:QueryTooComplexException"/>
  <xsd:complexType name="QueryTooComplexException">
     <xsd:complexContent>
        <xsd:extension base="epcisq:EPCISException">
           <xsd:sequence/>
        </xsd:extension>
     </xsd:complexContent>
  </xsd:complexType>

  <xsd:element name="SubscriptionControlsException" type="epcisq:SubscriptionControlsException"/>
  <xsd:complexType name="SubscriptionControlsException">
     <xsd:complexContent>
        <xsd:extension base="epcisq:EPCISException">
           <xsd:sequence/>
        </xsd:extension>
     </xsd:complexContent>
  </xsd:complexType>

  <xsd:element name="SubscribeNotPermittedException" type="epcisq:SubscribeNotPermittedException"/>
  <xsd:complexType name="SubscribeNotPermittedException">
     <xsd:complexContent>
        <xsd:extension base="epcisq:EPCISException">
           <xsd:sequence/>
        </xsd:extension>
     </xsd:complexContent>
  </xsd:complexType>

  <xsd:element name="SecurityException" type="epcisq:SecurityException"/>
  <xsd:complexType name="SecurityException">
     <xsd:complexContent>
        <xsd:extension base="epcisq:EPCISException">
           <xsd:sequence/>
        </xsd:extension>
     </xsd:complexContent>
  </xsd:complexType>

  <xsd:element name="ValidationException" type="epcisq:ValidationException"/>
  <xsd:complexType name="ValidationException">
     <xsd:complexContent>
        <xsd:extension base="epcisq:EPCISException">
           <xsd:sequence/>
        </xsd:extension>
     </xsd:complexContent>
  </xsd:complexType>

  <xsd:element name="ImplementationException"
               type="epcisq:ImplementationException"/>
  <xsd:complexType name="ImplementationException">
     <xsd:complexContent>
        <xsd:extension base="epcisq:EPCISException">
           <xsd:sequence>
              <xsd:element name="severity"
                           type="epcisq:ImplementationExceptionSeverity"/>
              <xsd:element name="queryName" type="xsd:string" minOccurs="0"/>
              <xsd:element name="subscriptionID" type="xsd:string" minOccurs="0"/>
           </xsd:sequence>
         </xsd:extension>
     </xsd:complexContent>
   </xsd:complexType>

   <xsd:simpleType name="ImplementationExceptionSeverity">
     <xsd:restriction base="xsd:NCName">
         <xsd:enumeration value="ERROR"/>
         <xsd:enumeration value="SEVERE"/>
     </xsd:restriction>
   </xsd:simpleType>

</xsd:schema>
