<?xml version="1.0" encoding="UTF-8"?>
<!-- edited with XML Spy v4.1 U (http://www.xmlspy.com) by Tim Moses (private) -->
<!--

Change record: changes made by Tim Moses, date: 10 April 2002.
1. Added the predicate "true" with a single parameter that must be of type boolean.  The function is of type boolean also, it takes the same value as the parameter.
2. Added the attributeFunction "union" with parameters that must be of type "list".  The function is of type list also, it takes the value of the union of the parameters.
3. Added the attributeFunction "intersection" with parameters that must be of type "list".  The function is of type list also, it takes the value of the intersection of the parameters.
4. Added the attributeFunction "setOrder" with a single parameter that must be of type "list".  The function is of type nonNegativeInteger, it takes the value of the number of elements in the parameter.

-->
<xs:schema targetNamespace="http://www.oasis-open.org/committees/xacml/docs/draft-xacml-schema-policy-13.xsd" xmlns:saml="http://www.oasis-open.org/committees/security/docs/draft-sstc-schema-assertion-28.xsd" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xacml="http://www.oasis-open.org/committees/xacml/docs/draft-xacml-schema-policy-13.xsd" elementFormDefault="qualified" attributeFormDefault="unqualified">
	<xs:import namespace="http://www.oasis-open.org/committees/security/docs/draft-sstc-schema-assertion-28.xsd" schemaLocation="D:\My Documents\Standards\Xacml\v13 schema\draft-sstc-schema-assertion-28.xsd"/>
	<xs:element name="policySetStatement" type="xacml:PolicySetStatementType"/>
	<xs:element name="policyStatement" type="xacml:PolicyStatementType"/>
	<xs:element name="rule" type="xacml:RuleType"/>
	<xs:element name="authorizationDecisionStatement" type="xacml:AuthorizationDecisionStatementType"/>
	<xs:complexType name="PolicySetStatementType">
		<xs:complexContent>
			<xs:extension base="saml:StatementAbstractType">
				<xs:sequence>
					<xs:element name="description" type="xs:string" minOccurs="0"/>
					<xs:element name="target" type="xacml:TargetType"/>
					<xs:element name="policySet" type="xacml:PolicySetType" maxOccurs="unbounded"/>
					<xs:element name="obligations" type="xacml:ObligationsType" minOccurs="0"/>
				</xs:sequence>
				<xs:attribute name="policySetId" type="xs:anyURI" use="required"/>
				<xs:attribute name="policySetName" type="xs:string" use="optional"/>
				<xs:attribute name="policyCombiningAlgId" type="xs:anyURI" use="required"/>
			</xs:extension>
		</xs:complexContent>
	</xs:complexType>
	<xs:complexType name="PolicyStatementType">
		<xs:complexContent>
			<xs:extension base="saml:StatementAbstractType">
				<xs:sequence>
					<xs:element name="description" type="xs:string" minOccurs="0"/>
					<xs:element name="target" type="xacml:TargetType"/>
					<xs:element name="ruleSet" type="xacml:RuleSetType" maxOccurs="unbounded"/>
					<xs:element name="obligations" type="xacml:ObligationsType" minOccurs="0"/>
				</xs:sequence>
				<xs:attribute name="policyId" type="xs:anyURI" use="required"/>
				<xs:attribute name="policyName" type="xs:string" use="optional"/>
				<xs:attribute name="ruleCombiningAlgId" type="xs:anyURI" use="required"/>
			</xs:extension>
		</xs:complexContent>
	</xs:complexType>
	<xs:complexType name="RuleType">
		<xs:sequence>
			<xs:element name="description" type="xs:string" minOccurs="0"/>
			<xs:element name="target" type="xacml:TargetType" minOccurs="0"/>
			<xs:element name="condition" type="xacml:PredicateExpressionType" minOccurs="0"/>
		</xs:sequence>
		<xs:attribute name="ruleId" type="xs:anyURI" use="required"/>
		<xs:attribute name="ruleName" type="xs:string" use="optional"/>
		<xs:attribute name="effect" type="saml:DecisionType" use="required"/>
	</xs:complexType>
	<xs:complexType name="AuthorizationDecisionStatementType">
		<xs:complexContent>
			<xs:extension base="saml:AuthorizationDecisionStatementType">
				<xs:sequence>
					<xs:element name="obligations" type="xacml:ObligationsType"/>
				</xs:sequence>
			</xs:extension>
		</xs:complexContent>
	</xs:complexType>
	<xs:complexType name="TargetType">
		<xs:sequence>
			<xs:element name="subjects" type="xacml:SubjectsType"/>
			<xs:element name="resources" type="xacml:ResourcesType"/>
			<xs:element name="actions" type="xacml:ActionsType"/>
		</xs:sequence>
	</xs:complexType>
	<xs:complexType name="SubjectsType">
		<xs:sequence maxOccurs="unbounded">
			<xs:element ref="saml:Attribute"/>
		</xs:sequence>
	</xs:complexType>
	<xs:complexType name="ResourcesType">
		<xs:sequence maxOccurs="unbounded">
			<xs:element ref="saml:Attribute"/>
		</xs:sequence>
	</xs:complexType>
	<xs:complexType name="ActionsType">
		<xs:sequence maxOccurs="unbounded">
			<xs:element ref="saml:Action"/>
		</xs:sequence>
	</xs:complexType>
	<xs:complexType name="ObligationsType">
		<xs:sequence>
			<xs:element name="obligation" type="xacml:ObligationType" maxOccurs="unbounded"/>
		</xs:sequence>
	</xs:complexType>
	<xs:complexType name="ObligationType">
		<xs:choice maxOccurs="unbounded">
			<xs:element ref="saml:AttributeDesignator"/>
			<xs:element ref="saml:Attribute"/>
		</xs:choice>
		<xs:attribute name="ObligationId" type="xs:anyURI" use="required"/>
		<xs:attribute name="fulfilOn" type="saml:DecisionType" use="required"/>
	</xs:complexType>
	<xs:complexType name="PredicateExpressionType">
		<xs:choice>
			<xs:element ref="xacml:predicateExpression"/>
			<xs:element ref="xacml:predicate"/>
		</xs:choice>
	</xs:complexType>
	<xs:element name="predicateExpression" type="xacml:PredicateExpressionAbstractType" abstract="true"/>
	<xs:complexType name="PredicateExpressionAbstractType"/>
	<xs:element name="and" type="xacml:AndType" substitutionGroup="xacml:predicateExpression"/>
	<xs:element name="or" type="xacml:OrType" substitutionGroup="xacml:predicateExpression"/>
	<xs:element name="orderedOr" type="xacml:OrderedOrType" substitutionGroup="xacml:predicateExpression"/>
	<xs:element name="nOf" type="xacml:NOfType" substitutionGroup="xacml:predicateExpression"/>
	<xs:element name="not" type="xacml:NotType" substitutionGroup="xacml:predicateExpression"/>
	<xs:complexType name="AndType">
		<xs:choice minOccurs="0" maxOccurs="unbounded">
			<xs:element ref="xacml:predicateExpression"/>
			<xs:element ref="xacml:predicate"/>
		</xs:choice>
	</xs:complexType>
	<xs:complexType name="OrType">
		<xs:choice minOccurs="0" maxOccurs="unbounded">
			<xs:element ref="xacml:predicateExpression"/>
			<xs:element ref="xacml:predicate"/>
		</xs:choice>
	</xs:complexType>
	<xs:complexType name="OrderedOrType">
		<xs:choice minOccurs="0" maxOccurs="unbounded">
			<xs:element ref="xacml:predicateExpression"/>
			<xs:element ref="xacml:predicate"/>
		</xs:choice>
	</xs:complexType>
	<xs:complexType name="NOfType">
		<xs:choice minOccurs="0" maxOccurs="unbounded">
			<xs:element ref="xacml:predicateExpression"/>
			<xs:element ref="xacml:predicate"/>
		</xs:choice>
		<xs:attribute name="quorum" type="xs:positiveInteger"/>
	</xs:complexType>
	<xs:complexType name="NotType">
		<xs:choice>
			<xs:element ref="xacml:predicateExpression" minOccurs="0"/>
			<xs:element ref="xacml:predicate" minOccurs="0"/>
		</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="true" type="xacml:TrueType" substitutionGroup="xacml:predicate"/>
	<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:complexType name="TrueType">
		<xs:complexContent>
			<xs:extension base="xacml:PredicateAbstractType">
				<xs:sequence>
					<xs:element ref="saml:AttributeDesignator"/>
				</xs:sequence>
			</xs:extension>
		</xs:complexContent>
	</xs:complexType>
	<xs:complexType name="PresentType">
		<xs:complexContent>
			<xs:extension base="xacml:PredicateAbstractType">
				<xs:sequence>
					<xs:element ref="saml:AttributeDesignator"/>
				</xs:sequence>
			</xs:extension>
		</xs:complexContent>
	</xs:complexType>
	<xs:complexType name="CompareType">
		<xs:complexContent>
			<xs:extension base="xacml:PredicateAbstractType">
				<xs:choice minOccurs="2" maxOccurs="2">
					<xs:element ref="saml:AttributeDesignator"/>
					<xs:element ref="saml:Attribute"/>
					<xs:element ref="xacml:attributeFunction"/>
				</xs:choice>
			</xs:extension>
		</xs:complexContent>
	</xs:complexType>
	<xs:element name="attributeFunction" type="xacml:AttributeFunctionAbstractType" abstract="true"/>
	<xs:complexType name="AttributeFunctionAbstractType"/>
	<xs:element name="plus" type="xacml:ArgumentListType" substitutionGroup="xacml:attributeFunction"/>
	<xs:element name="minus" type="xacml:ArgumentListType" substitutionGroup="xacml:attributeFunction"/>
	<xs:element name="times" type="xacml:ArgumentListType" substitutionGroup="xacml:attributeFunction"/>
	<xs:element name="divide" type="xacml:ArgumentListType" substitutionGroup="xacml:attributeFunction"/>
	<xs:element name="setOrder" type="xacml:ArgumentListType" substitutionGroup="xacml:attributeFunction"/>
	<xs:element name="union" type="xacml:ArgumentListType" substitutionGroup="xacml:attributeFunction"/>
	<xs:element name="intersection" type="xacml:ArgumentListType" substitutionGroup="xacml:attributeFunction"/>
	<xs:complexType name="ArgumentListType">
		<xs:complexContent>
			<xs:extension base="xacml:AttributeFunctionAbstractType">
				<xs:choice maxOccurs="unbounded">
					<xs:element ref="saml:AttributeDesignator"/>
					<xs:element ref="saml:Attribute"/>
					<xs:element ref="xacml:attributeFunction"/>
				</xs:choice>
			</xs:extension>
		</xs:complexContent>
	</xs:complexType>
	<xs:complexType name="PolicySetType">
		<xs:choice maxOccurs="unbounded">
			<xs:element ref="xacml:policySetStatement"/>
			<xs:element ref="xacml:policyStatement"/>
			<xs:element name="policySetDesignator" type="xacml:PolicySetDesignatorType"/>
			<xs:element name="policyDesignator" type="xacml:PolicyDesignatorType"/>
		</xs:choice>
	</xs:complexType>
	<xs:complexType name="PolicySetDesignatorType">
		<xs:sequence>
			<xs:element name="policySetId" type="xs:anyURI" minOccurs="0"/>
			<xs:element name="policySetAssertion" type="saml:AssertionType"/>
		</xs:sequence>
	</xs:complexType>
	<xs:complexType name="PolicyDesignatorType">
		<xs:sequence>
			<xs:element name="policyId" type="xs:anyURI" minOccurs="0"/>
			<xs:element name="policyAssertion" type="saml:AssertionType"/>
		</xs:sequence>
	</xs:complexType>
	<xs:complexType name="RuleSetType">
		<xs:choice maxOccurs="unbounded">
			<xs:element ref="xacml:rule"/>
			<xs:element name="ruleDesignator" type="xacml:RuleDesignatorType"/>
		</xs:choice>
	</xs:complexType>
	<xs:complexType name="RuleDesignatorType">
		<xs:sequence>
			<xs:element name="ruleId" type="xs:anyURI" minOccurs="0"/>
			<xs:element name="ruleDigest" minOccurs="0">
				<xs:complexType>
					<xs:attribute name="digestAlgId" type="xs:string" default="SHA-1"/>
					<xs:attribute name="base64Digest" type="xs:string"/>
				</xs:complexType>
			</xs:element>
		</xs:sequence>
	</xs:complexType>
</xs:schema>

