!!! Overview
When using the [Microsoft Active Directory Driver] there are often attributes that require conversion from being Multi-Valued in [IDV] to [SINGLE-VALUE] in [Microsoft Active Directory].

The [DirXML Example] below shows on method to accomplish the task.

[{$pagename}] utilizes some rather unique techniques to accomplishing the task. 

First the rule reads the [DirXML-ApplicationSchema] attribute values and stores this in a [Driver Scope] [Global Configuration Variable] "APP-SCHEMA". The value is set only once and then only checked for presence.

* For each DirXML Operational Attribute, the "APP-SCHEMA" GCV is checked using [XPATH] to read the XML Attribute @multi-valued and set the value into the [local Variable] "MULTI-VALUED".
* if the value of "MULTI-VALUED" is "false", the vlaue of the DirXML Operational Attribute is stored in the [Local Variable] "VALUE"
* The DirXML Operational Attribute is stripped from the operation and the destination Attribute is set to the value of "VALUE".

Originally taken from [Generic Single-valued Schema Enforcement|https://www.netiq.com/communities/cool-solutions/generic-single-valued-schema-enforcement/|target='_blank'].

%%warning
It is important that the [Application Schema|DirXML-ApplicationSchema]] be refreshed for the rule to work properly.
%% 
We added a couple of tweaks.
Shows some [DirXML Example] and [XPATH Examples]:
{{{
<rule>
   <description>[CIS] Handle Multi-to-single valued conversions</description>
      <comment xml:space="preserve">Generic Rule which reads the application schema from AD and determines if it needs to take only the first value from a multi-valued eDirectory attribute
From:
http://www.novell.com/communities/node/9413/generic-single-valued-schema-enforcement</comment>
      <comment name="author" xml:space="preserve">jim@willeke.com</comment>
	<comment name="version" xml:space="preserve">40</comment>
	<comment name="lastchanged" xml:space="preserve">2014-02-03</comment>
	<conditions>
		<or>
			<if-operation mode="case" op="equal">modify</if-operation>
			<if-operation mode="case" op="equal">add</if-operation>
		</or>
	</conditions>
	<actions>
		<do-if>
			<arg-conditions>
				<and>
					<if-local-variable name="APP-SCHEMA" op="not-available"/>
				</and>
			</arg-conditions>
			<arg-actions>
				<do-trace-message>
					<arg-string>
						<token-text xml:space="preserve">Caching DirXML-ApplicationSchema on startup of driver!</token-text>
					</arg-string>
				</do-trace-message>
				<do-set-local-variable name="APP-SCHEMA" scope="driver">
					<arg-node-set>
						<token-xml-parse>
							<token-base64-decode>
								<token-src-attr name="DirXML-ApplicationSchema">
									<arg-dn>
										<token-global-variable name="dirxml.auto.driverdn"/>
									</arg-dn>
								</token-src-attr>
							</token-base64-decode>
						</token-xml-parse>
					</arg-node-set>
				</do-set-local-variable>
			</arg-actions>
			<arg-actions/>
		</do-if>
		<do-for-each>
			<arg-node-set>
				<token-xpath expression=".//@attr-name"/>
			</arg-node-set>
			<arg-actions>
				<do-set-local-variable name="CLASS" scope="policy">
					<arg-string>
						<token-class-name/>
					</arg-string>
				</do-set-local-variable>
				<do-set-local-variable name="ATTR-DEF" scope="policy">
					<arg-node-set>
						<token-xpath expression="$APP-SCHEMA/schema-def/class-def/attr-def[@attr-name=$current-node]"/>
					</arg-node-set>
				</do-set-local-variable>
				<do-set-local-variable name="MULTI-VALUED" scope="policy">
					<arg-string>
						<token-xpath expression="$ATTR-DEF[1]/@multi-valued"/>
					</arg-string>
				</do-set-local-variable>
				<do-if>
					<arg-conditions>
						<and>
							<if-local-variable mode="nocase" name="MULTI-VALUED" op="equal">false</if-local-variable>
						</and>
					</arg-conditions>
					<arg-actions>
						<do-set-local-variable name="VALUE" scope="policy">
							<arg-string>
								<token-op-attr name="$current-node$"/>
							</arg-string>
						</do-set-local-variable>
						<do-strip-op-attr name="$current-node$"/>
						<do-set-dest-attr-value name="$current-node$">
							<arg-value>
								<token-local-variable name="VALUE"/>
							</arg-value>
						</do-set-dest-attr-value>
					</arg-actions>
					<arg-actions/>
				</do-if>
			</arg-actions>
		</do-for-each>
	</actions>
</rule>
}}}


!! More Information
There might be more information for this subject on one of the following:
[{ReferringPagesPlugin before='*' after='\n' }]