<?xml version="1.0" encoding="UTF-8"?>
<!--

Change record: changes made by Tim Moses, date: 26 July 2002.
1. Defined a common attribute for ResourceId.
2. Changed "Specifier" to "Designator" for consistency with the xacml Policy schema.
3. Used "xacmlContext:Status" in place of "Advice".

-->
<xs:schema targetNamespace="urn:oasis:names:tc:xacml:0.16a:context" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:identifier="urn:oasis:names:tc:xacml:identifier" xmlns:ds="http://www.w3.org/2000/09/xmldsig#" xmlns:xacmlContext="urn:oasis:names:tc:xacml:0.16a:context" xmlns:xacml="urn:oasis:names:tc:xacml:0.16a:policy" elementFormDefault="qualified" attributeFormDefault="unqualified">
	<xs:import namespace="urn:oasis:names:tc:xacml:0.16a:policy" schemaLocation="D:\My Documents\Standards\Xacml\v16\draft-xacml-schema-policy-16a.xsd"/>
	<xs:import namespace="http://www.w3.org/2000/09/xmldsig#" schemaLocation="D:\My Documents\Standards\Xacml\v16\xmldsig-core-schema.xsd"/>
	<!-- -->
	<xs:element name="Request" type="xacmlContext:RequestType"/>
	<xs:element name="Response" type="xacmlContext:ResponseType"/>
	<!-- -->
	<xs:complexType name="RequestType">
		<xs:sequence>
			<xs:element name="Subject" type="xacmlContext:SubjectType" maxOccurs="unbounded"/>
			<xs:element name="Resource" type="xacmlContext:ResourceType"/>
			<xs:element name="Action" type="xacmlContext:ActionType" maxOccurs="unbounded"/>
			<xs:element name="Environment" type="xacmlContext:EnvironmentType" minOccurs="0"/>
		</xs:sequence>
	</xs:complexType>
	<!-- -->
	<xs:complexType name="ResponseType">
		<xs:sequence>
			<xs:element name="Result" type="xacmlContext:ResultType" maxOccurs="unbounded"/>
		</xs:sequence>
	</xs:complexType>
	<!-- -->
	<xs:complexType name="ResultType">
		<xs:sequence>
			<xs:element name="Decision" type="xacmlContext:DecisionType"/>
			<xs:element name="Obligations" type="xacml:ObligationsType" minOccurs="0"/>
			<xs:element ref="xacmlContext:Status" minOccurs="0"/>
		</xs:sequence>
		<xs:attribute ref="xacmlContext:ResourceId" use="optional"/>
	</xs:complexType>
	<!-- -->
	<xs:complexType name="SubjectType">
		<xs:sequence>
			<xs:choice minOccurs="0">
				<xs:element name="SubjectId" type="xacmlContext:SubjectIdType"/>
				<xs:element ref="ds:KeyInfo"/>
			</xs:choice>
			<xs:element name="SubjectAttribute" type="xacmlContext:AttributeType" minOccurs="0" maxOccurs="unbounded"/>
			<xs:element name="AuthenticationInfo" type="xacmlContext:AuthenticationInfoType" minOccurs="0" maxOccurs="unbounded"/>
		</xs:sequence>
		<xs:attribute name="SubjectCategory" type="xs:anyURI" default="identifier:AccessSubject"/>
	</xs:complexType>
	<!-- -->
	<xs:complexType name="SubjectIdType">
		<xs:simpleContent>
			<xs:extension base="xs:string">
				<xs:attribute name="Format" type="xs:anyURI" use="optional"/>
				<xs:attribute name="Qualifier" type="xs:string" use="optional"/>
			</xs:extension>
		</xs:simpleContent>
	</xs:complexType>
	<!-- -->
	<xs:complexType name="AuthenticationInfoType">
		<xs:attribute name="Method" type="xs:anyURI" use="optional"/>
		<xs:attribute name="Instant" type="xs:dateTime" use="optional"/>
	</xs:complexType>
	<!-- -->
	<xs:complexType name="AttributeType">
		<xs:complexContent>
			<xs:extension base="xacml:AttributeValueType">
				<xs:attribute name="AttributeId" type="xs:anyURI" use="required"/>
				<xs:attribute name="Issuer" type="xs:anyURI" use="optional"/>
				<xs:attribute name="IssueInstant" type="xs:dateTime" use="optional"/>
			</xs:extension>
		</xs:complexContent>
	</xs:complexType>
	<!-- -->
	<xs:complexType name="ResourceType">
		<xs:sequence>
			<xs:element name="ResourceDesignator" type="xacmlContext:ResourceDesignatorType" minOccurs="0"/>
			<xs:element name="ResourceContent" type="xacmlContext:ResourceContentType" minOccurs="0"/>
			<xs:element name="ResourceAttribute" type="xacmlContext:AttributeType" minOccurs="0" maxOccurs="unbounded"/>
		</xs:sequence>
	</xs:complexType>
	<!-- -->
	<xs:attribute name="ResourceId" type="xs:string"/>	
	<!-- -->
	<xs:complexType name="ResourceDesignatorType">
		<xs:attribute name="Format" type="xs:anyURI" use="optional"/>
		<xs:attribute name="Scope" type="xacmlContext:DesignatorScopeType" use="optional"/>
		<xs:attribute ref="xacmlContext:ResourceId" use="required"/>
	</xs:complexType>
	<!-- -->
	<xs:simpleType name="DesignatorScopeType">
		<xs:restriction base="xs:string">
			<xs:enumeration value="Immediate"/>
			<xs:enumeration value="Children"/>
			<xs:enumeration value="Descendants"/>
		</xs:restriction>
	</xs:simpleType>
	<!-- -->
	<xs:complexType name="ResourceContentType">
		<xs:sequence>
			<xs:any namespace="##any" processContents="lax" minOccurs="0" maxOccurs="unbounded"/>
		</xs:sequence>
		<xs:anyAttribute namespace="##any" processContents="lax"/>
	</xs:complexType>
	<!-- -->
	<xs:complexType name="ActionType">
		<xs:simpleContent>
			<xs:extension base="xs:string">
				<xs:attribute name="Namespace" type="xs:anyURI"/>
			</xs:extension>
		</xs:simpleContent>
	</xs:complexType>
	<!-- -->
	<xs:simpleType name="DecisionType">
		<xs:restriction base="xs:string">
			<xs:enumeration value="Permit"/>
			<xs:enumeration value="Deny"/>
			<xs:enumeration value="Indeterminate"/>
		</xs:restriction>
	</xs:simpleType>
	<!-- -->
	<xs:complexType name="EnvironmentType">
		<xs:sequence>
			<xs:element name="EnvironmentAttribute" type="xacmlContext:AttributeType" maxOccurs="unbounded"/>
		</xs:sequence>
	</xs:complexType>
	<!-- -->
	<xs:element name="Status" type="xacmlContext:StatusType"/>
	<!-- -->
	<xs:complexType name="StatusType">
		<xs:sequence>
			<xs:element ref="xacmlContext:StatusCode"/>
			<xs:element ref="xacmlContext:StatusMessage" minOccurs="0"/>
			<xs:element ref="xacmlContext:StatusDetail" minOccurs="0"/>
		</xs:sequence>
	</xs:complexType>
	<!-- -->
	<xs:element name="StatusCode" type="xacmlContext:StatusCodeType"/>
	<!-- -->
	<xs:complexType name="StatusCodeType">
		<xs:sequence>
			<xs:element ref="xacmlContext:StatusCode" minOccurs="0"/>
		</xs:sequence>
		<xs:attribute name="Value" type="xs:QName" use="required"/>
	</xs:complexType>
		<!-- -->
	<xs:element name="StatusMessage" type="xs:string"/>
		<!-- -->
	<xs:element name="StatusDetail" type="xacmlContext:StatusDetailType"/>
	<!-- -->
	<xs:complexType name="StatusDetailType">
		<xs:sequence>
			<xs:any namespace="##any" processContents="lax" minOccurs="0" maxOccurs="unbounded"/>
		</xs:sequence>
	</xs:complexType>
	<!-- -->
</xs:schema>

