<?xml version="1.0" encoding="UTF-8"?>
<xs:schema targetNamespace="http://www.oasis-open.org/committees/xacml/docs/draft-xacml-schema-09.xsd" xmlns:saml="http://www.oasis-open.org/committees/security/docs/draft-sstc-schema-assertion-24" xmlns:samlp="http://www.oasis-open.org/committees/security/docs/draft-sstc-schema-protocol-24" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:ds="http://www.w3.org/2000/09/xmldsig#" xmlns:xacml="http://www.oasis-open.org/committees/xacml/docs/draft-xacml-schema-policy-09.xsd" elementFormDefault="qualified" attributeFormDefault="unqualified">
	<xs:import namespace="http://www.oasis-open.org/committees/security/docs/draft-sstc-schema-assertion-24" schemaLocation="D:\My Documents\Standards\Xacml\draft-sstc-schema-assertion-24.xsd"/>
	<xs:import namespace="http://www.oasis-open.org/committees/security/docs/draft-sstc-schema-protocol-24" schemaLocation="D:\My Documents\Standards\Xacml\draft-sstc-schema-protocol-24.xsd"/>
	<xs:import namespace="http://www.w3.org/2000/09/xmldsig#" schemaLocation="D:\My Documents\Standards\Xacml\xmldsig-core-schema.xsd"/>
	<xs:element name="metaPolicyStatement" type="xacml:MetaPolicyStatementType"/>
	<xs:element name="policyStatement" type="xacml:PolicyStatementType"/>
	<xs:element name="ruleStatement" type="xacml:RuleStatementType"/>
	<xs:complexType name="MetaPolicyStatementType">
		<xs:complexContent>
			<xs:extension base="saml:StatementAbstractType">
				<xs:sequence>
					<xs:element name="comment" type="xs:string" minOccurs="0"/>
					<xs:element name="metaPolicy" type="xacml:PredicateExpressionType"/>
				</xs:sequence>
				<xs:attribute name="metaPolicyId" type="xs:anyURI" use="required"/>
				<xs:attribute name="metaPolicyName" type="xs:string" use="optional"/>
			</xs:extension>
		</xs:complexContent>
	</xs:complexType>
	<xs:complexType name="PolicyStatementType">
		<xs:complexContent>
			<xs:extension base="saml:StatementAbstractType">
				<xs:sequence>
					<xs:element name="comment" type="xs:string" minOccurs="0"/>
					<xs:element name="target" type="xacml:RuleType"/>
					<xs:element name="policy" type="xacml:RuleExpressionType"/>
				</xs:sequence>
				<xs:attribute name="policyId" type="xs:anyURI" use="required"/>
				<xs:attribute name="policyName" type="xs:string" use="optional"/>
			</xs:extension>
		</xs:complexContent>
	</xs:complexType>
	<xs:complexType name="RuleStatementType">
		<xs:complexContent>
			<xs:extension base="saml:StatementAbstractType">
				<xs:sequence>
					<xs:element name="rule" type="xacml:RuleType"/>
				</xs:sequence>
				<xs:attribute name="metaPolicyName" type="string" use="required" fixed="xacml:metaPolicy1"/>
				<xs:attribute name="effect" type="xacml:EffectType"/>
			</xs:extension>
		</xs:complexContent>
	</xs:complexType>
	<xs:complexType name="RuleType">
		<xs:sequence>
			<xs:element name="subjects" type="xacml:PredicateExpressionType"/>
			<xs:element name="resources" type="xacml:PredicateExpressionType"/>
			<xs:element name="actions" type="xacml:PredicateExpressionType"/>
		</xs:sequence>
	</xs:complexType>
	<xs:simpleType name="EffectType">
		<xs:restriction base="string">
			<xs:enumeration value="permit"/>
			<xs:enumeration value="deny"/>
		</xs:restriction>
	</xs:simpleType>
	<xs:complexType name="RuleExpressionType">
		<xs:choice>
			<xs:element name="and" type="xacml:RuleExpressionType"/>
			<xs:element name="or" type="xacml:RuleExpressionType"/>
			<xs:element name="orderedOr" type="xacml:RuleExpressionType"/>
			<xs:element name="nOf" type="xacml:RuleExpressionType"/>
			<xs:element name="not" type="xacml:RuleExpressionType"/>
			<xs:element name="rule" type="xacml:RuleType"/>
		</xs:choice>
	</xs:complexType>
	<xs:complexType name="PredicateExpressionType">
		<xs:choice>
			<xs:element name="and" type="xacml:PredicateExpressionType"/>
			<xs:element name="or" type="xacml:PredicateExpressionType"/>
			<xs:element name="orderedOr" type="xacml:PredicateExpressionType"/>
			<xs:element name="nOf" type="xacml:PredicateExpressionType"/>
			<xs:element name="not" type="xacml:PredicateExpressionType"/>
			<xs:element name="predicate" type="xacml:PredicateAbstractType"/>
		</xs:choice>
	</xs:complexType>
	<xs:element name="predicate" type="xacml:PredicateAbstractType" abstract="true"/>
	<!--This is an XACML extensibility point.  New predicates may be added in the
		substitution group of "predicate"-->
	<xs:complexType name="PredicateAbstractType"/>
	<xs:element name="present" type="xacml:PresentType" substitutionGroup="xacml:predicate"/>
	<xs:element name="equal" type="xacml:CompareType" substitutionGroup="xacml:predicate"/>
	<xs:element name="greaterOrEqual" type="xacml:CompareType" substitutionGroup="xacml:predicate"/>
	<xs:element name="lessOrEqual" type="xacml:CompareType" substitutionGroup="xacml:predicate"/>
	<xs:element name="subset" type="xacml:CompareType" substitutionGroup="xacml:predicate"/>
	<xs:element name="superset" type="xacml:CompareType" substitutionGroup="xacml:predicate"/>
	<xs:element name="patternMatch" type="xacml:CompareType" substitutionGroup="xacml:predicate"/>
	<xs:element name="nonNullSetIntersection" type="xacml:CompareType" substitutionGroup="xacml:predicate"/>
	<xs:element name="policyRef" type="xacml:PolicyRefType" substitutionGroup="xacml:predicate"/>
	<xs:complexType name="PresentType">
		<xs:complexContent>
			<xs:extension base="xacml:PredicateAbstractType">
				<xs:sequence>
					<xs:element ref="xacml:attributeRef"/>
				</xs:sequence>
			</xs:extension>
		</xs:complexContent>
	</xs:complexType>
	<xs:complexType name="CompareType">
		<xs:complexContent>
			<xs:extension base="xacml:PredicateAbstractType">
				<xs:sequence>
					<xs:element ref="xacml:attributeRef"/>
					<xs:choice>
						<xs:element ref="xacml:attributeRef"/>
						<xs:element ref="xacml:attributeValue"/>
					</xs:choice>
				</xs:sequence>
			</xs:extension>
		</xs:complexContent>
		<!-- XML operands in "set" operations MUST be of type xs:list -->
		<!-- XML operands in "inequality" operations MUST contain an xsi:type attribute for which
	XACML defines a comparison algorithm -->
	</xs:complexType>
	<xs:element name="attributeRef" type="AttributeRefType"/>
	<xs:complexType name="AttributeRefType">
		<xs:sequence>
			<xs:element name="authority" type="xs:anyURI" minOccurs="0" maxOccurs="unbounded"/>
			<xs:element name="attributeName" type="xacml:AttributeNameType"/>
		</xs:sequence>
	</xs:complexType>
	<xs:complexType name="AttributeNameType">
		<xs:complexContent>
			<xs:restriction base="saml:AttributeValueType">
				<xs:sequence>
					<xs:any namespace="##any" processContents="lax"/>
				</xs:sequence>
			</xs:restriction>
		</xs:complexContent>
	</xs:complexType>
	<xs:element name="attributeValue" type="xs:anyType"/>
	<xs:complexType name="PolicyRefType">
		<xs:sequence>
			<xs:element name="policyID" type="xs:anyURI"/>
			<xs:element name="authority" type="xs:anyURI"/>
		</xs:sequence>
	</xs:complexType>
</xs:schema>

