<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema
	xmlns:xsd="http://www.w3.org/2001/XMLSchema"
	targetNamespace="http://www.semwebtech.org/eca/2006/eca-ml"
	xmlns:html="http://www.w3.org/1999/xhtml"
	xmlns:eca="http://www.semwebtech.org/eca/2006/eca-ml"
	xmlns:r3="http://rewerse.net/I5/NS/r3/2005#"
	xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
	elementFormDefault="qualified"
	attributeFormDefault="unqualified"
	version="0.12">

	<xsd:import
		namespace="http://rewerse.net/I5/NS/r3/2005#"
		schemaLocation="r3.xsd" />
	<xsd:import
		namespace="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
		schemaLocation="rdf.xsd" />

	<xsd:element name="rule">
		<xsd:complexType>
			<xsd:choice>
				<xsd:sequence>
					<xsd:annotation>
						<xsd:documentation>
							An ECA rule defined by its components.
						</xsd:documentation>
					</xsd:annotation>
					<xsd:element
						name="variable"
						type="eca:Variable"
						minOccurs="0"
						maxOccurs="unbounded" />
					<xsd:element
						name="event"
						type="eca:Component" />
					<xsd:element
						name="query"
						type="eca:Component"
						minOccurs="0"
						maxOccurs="unbounded" />
					<xsd:element
						name="test"
						type="eca:Component"
						minOccurs="0"
						maxOccurs="unbounded" />
					<xsd:element
						name="action"
						type="eca:Component" />
					<xsd:element
						ref="eca:opaque"
						minOccurs="0">
						<xsd:annotation>
							<xsd:documentation>
								An ECA rule may also include an opaque source.
							</xsd:documentation>
						</xsd:annotation>
					</xsd:element>
				</xsd:sequence>
				<xsd:element ref="eca:opaque">
					<xsd:annotation>
						<xsd:documentation>
							A native rule defined by its opaque source.
						</xsd:documentation>
					</xsd:annotation>
				</xsd:element>
			</xsd:choice>
		</xsd:complexType>
	</xsd:element>

	<xsd:complexType name="Component">
		<xsd:sequence>
			<xsd:choice
				minOccurs="0"
				maxOccurs="unbounded">
				<xsd:element
					name="input-variable"
					type="eca:Variable" />
				<xsd:element
					name="used-variable"
					type="eca:Variable" />
				<xsd:element
					name="output-variable"
					type="eca:Variable" />
			</xsd:choice>
			<xsd:group ref="eca:Expression" />
		</xsd:sequence>
		<xsd:attribute
			name="variable"
			use="optional"
			type="xsd:NCName" />
	</xsd:complexType>

	<xsd:group name="Expression">
		<xsd:choice>
			<xsd:element name="opaque">
				<xsd:complexType>
					<xsd:complexContent>
						<xsd:extension base="eca:OpaqueLiteral">
							<xsd:attribute
								name="input-variables"
								use="optional"
								type="eca:Variables" />
							<xsd:attribute
								name="used-variables"
								use="optional"
								type="eca:Variables" />
							<xsd:attribute
								name="output-variables"
								use="optional"
								type="eca:Variables" />
						</xsd:extension>
					</xsd:complexContent>
				</xsd:complexType>
			</xsd:element>
			<xsd:any
				namespace="##other"
				processContents="lax" />
		</xsd:choice>
	</xsd:group>

	<xsd:complexType name="Variable">
		<xsd:complexContent>
			<xsd:extension base="rdf:XMLLiteral">
				<xsd:attribute
					name="name"
					use="required"
					type="xsd:NCName" />
				<xsd:attribute
					name="use"
					use="optional"
					type="xsd:string" />
			</xsd:extension>
		</xsd:complexContent>
	</xsd:complexType>

	<xsd:simpleType name="Variables">
		<xsd:list itemType="xsd:NCName" />
	</xsd:simpleType>

	<xsd:element
		name="opaque"
		type="eca:OpaqueLiteral" />

	<xsd:complexType name="OpaqueLiteral">
		<xsd:complexContent>
			<xsd:extension base="rdf:XMLLiteral">
				<xsd:attribute
					name="lang"
					use="optional"
					type="xsd:anyURI" />
				<xsd:attribute
					name="uri"
					use="optional"
					type="xsd:anyURI" />
				<xsd:attribute
					name="method"
					use="optional"
					fixed="post" />
			</xsd:extension>
		</xsd:complexContent>
	</xsd:complexType>

	<xsd:group name="SimplifiedComponent">
		<xsd:choice>
			<xsd:element ref="eca:event" />
			<xsd:element ref="eca:query" />
			<xsd:element ref="eca:test" />
			<xsd:element ref="eca:action" />
		</xsd:choice>
	</xsd:group>

	<xsd:element
		name="event"
		type="eca:SimplifiedExpression" />
	<xsd:element
		name="query"
		type="eca:SimplifiedExpression" />
	<xsd:element
		name="test"
		type="eca:SimplifiedExpression" />
	<xsd:element
		name="action"
		type="eca:SimplifiedExpression" />

	<xsd:complexType name="SimplifiedExpression">
		<xsd:choice>
			<xsd:element ref="eca:opaque" />
			<xsd:any
				namespace="##other"
				processContents="lax" />
		</xsd:choice>
	</xsd:complexType>

</xsd:schema>

