<?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.

Change record: changes made by Tim Moses, date: 14 June 2002.
1. Removed policySetName, PolicyName and ruleName elements.
2. Capitalized the first letter of the name of locally-defined attributes and elements.
3. Replaced references to the <saml:Attribute> and <saml:AttributeDesignator> elements to references to the xacml equivalents.

-->
<xs:schema targetNamespace="urn:oasis:names:tc:XACML:0.14b:core" xmlns:saml="urn:oasis:names:tc:SAML:1.0:assertion" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xacml="urn:oasis:names:tc:XACML:0.14b:core" elementFormDefault="qualified" attributeFormDefault="unqualified">
	<xs:import namespace="urn:oasis:names:tc:SAML:1.0:assertion" schemaLocation="D:\My Documents\Standards\Xacml\v14 schema\cs-sstc-schema-assertion-01.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="xacml:Attribute"/>
		</xs:sequence>
	</xs:complexType>
	<!-- -->
	<xs:complexType name="ResourcesType">
		<xs:sequence maxOccurs="unbounded">
			<xs:element ref="xacml: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="xacml:AttributeDesignator"/>
			<xs:element ref="xacml: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="xacml: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="xacml: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="xacml:AttributeDesignator"/>
					<xs:element ref="xacml: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="xacml:AttributeDesignator"/>
					<xs:element ref="xacml:Attribute"/>
					<xs:element ref="xacml:AttributeFunction"/>
				</xs:choice>
			</xs:extension>
		</xs:complexContent>
	</xs:complexType>
	<!-- -->
	<xs:element name="AttributeDesignator" type="xacml:AttributeDesignatorType"/>
	<!-- -->
	<xs:complexType name="AttributeDesignatorType">
		<xs:attribute name="AttributeName" type="xs:anyURI" use="required"/>
	</xs:complexType>
	<!-- -->
	<xs:element name="Attribute" type="xacml:AttributeType"/>
	<!-- -->
	<xs:complexType name="AttributeType">
		<xs:complexContent>
			<xs:extension base="xacml:AttributeDesignatorType">
				<xs:sequence>
					<xs:element ref="xacml:AttributeValue" maxOccurs="unbounded"/>
				</xs:sequence>
			</xs:extension>
		</xs:complexContent>
	</xs:complexType>
	<!-- -->
	<xs:element name="AttributeValue" type="xs:anyType"/>
	<!-- -->
	<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>

