资源控制显示配置 XML 参考

资源控制显示配置(RCDC)资源是用户定义的资源,可用于控制最终用户在用户界面(UI)中显示的Microsoft Identity Manager 2016 SP1(MIM)数据存储中的其他资源的方式。 每个 RCDC 资源都包含一个 XML 配置文件,你可以更改该文件来添加、修改或删除 UI 文本和 UI 控件。 虽然 MIM 2016 SP1 提供了多个默认 RCDC 资源,但也可以为自定义资源创建自定义 RCDC 资源。 有关在 FIM 门户中使用 RCDC UI 的详细信息,请参阅 FIM 文档中 配置和自定义 FIM 门户 简介。

已知问题

不支持许多 RCDC 控件中的默认值。

在此版本中,不支持在资源控件中的控件中设置默认值,但选项按钮控件除外。 可以通过指定不与任何值关联的默认值来解决此问题,以强制用户更改所选内容。 若要解决其他控件的此问题,需要在提交请求期间使用授权工作流提供默认值。

基本结构

RCDC 资源的 XML 数据由单个 ObjectControlConfiguration XML 元素组成。

注释

有关完整的 XSD 架构,请参阅附录 A:默认 XSD 架构

下面是 ObjectControlConfiguration 元素的 XSD 架构:

<xsd:element name="ObjectControlConfiguration"\>
  <xsd:complexType\>
    <xsd:sequence\>
      <xsd:element ref="my:ObjectDataSource" minOccurs="0" maxOccurs="32"/>
      <xsd:element ref="my:XmlDataSource" minOccurs="0" maxOccurs="32"/>
      <xsd:element ref="my:Panel"/>
      <xsd:element ref="my:Events" minOccurs="0" maxOccurs="1"/>
    </xsd:sequence>
    <xsd:attribute ref="my:TypeName"/>
    <xsd:anyAttribute processContents="lax" namespace="http://www.w3.org/XML/1998/namespace"/>
  </xsd:complexType>
</xsd:element>

ObjectControlConfiguration 元素包含以下元素:

  • ObjectDataSource:此元素指定资源控制(RC)使用的数据源类的 TypeName。 有关说明和架构定义,请参阅本文档中的以下数据源部分。 ObjectControlConfiguration 元素最多可以包含 ObjectDataSource 元素的 32 个节点。

  • XmlDataSource:这是一个简单的数据源,通常用于指定摘要页的设计。 有关说明和架构定义,请参阅本文档中的以下数据源部分。 ObjectControlConfiguration:元素最多可以包含 XmlDataSource 元素的 32 个节点。

  • 面板:管理员可以通过修改 Panel 元素内的元素来自定义 RCDC 页面的布局。 有关详细信息,请参阅本文档后面的“面板”部分。 ObjectControlConfiguration 元素必须只有一个 Panel 元素。

  • 事件:管理员无法提供自定义代码隐藏,此功能受到限制。 这是面板或控件可以根据状态更改发出的事件。 有关详细信息,请参阅本文档后面的“事件”部分。 ObjectControlConfiguration 元素可以包含一个 事件 元素。 通常,除非在以后的增强功能中专门开发,否则不支持使用自定义 事件

数据源

Microsoft标识管理器使用数据源将数据绑定到 UI 组件。 这有助于促进数据与呈现层的分离。 RCDC 资源配置数据中有两种类型的数据源:ObjectDataSourceXmlDataSource

  • ObjectDataSources 指定向 RC 提供数据的 Microsoft .NET 类。 提供了一组固定的 ObjectDataSources 可用类型,前提是管理员可以选择在创作 RCDC 时使用。

  • XMLDataSources 提供了一种构建基于 XML 的数据的简单方法,管理员可以使用它们来提供自定义数据。 除非使用内置的预定义 XML 结构,否则必须在 RCDC 中直接指定 XML 数据。 内置 XML 结构用于在 RC 中生成摘要页。

在 RCDC 中,可以将这些数据源绑定到 RCDC 中指定的 UI 控件的属性以生成 UI。

ObjectDataSource 元素

Microsoft标识管理器提供下表中可用于所有资源类型的通用数据源类型(除非有说明)。

类型名称 说明 双向绑定 绑定语法
PrimaryResourceObjectDataSource 这表示正在创建、编辑或查看的 FIM 2010 资源。 绑定字符串中的路径是属性名称。 资源类型由 RCDC 的 TargetObjectType 属性指定,而不是在 RCDC 中指定。ConfigurationData 属性。 是的 [AttributeName] 其名称给出的对象属性的值。
PrimaryResourceDeltaDataSource 此数据源生成增量 XML,用于比较 FIM 2010 资源的原始状态和当前状态。 RC 摘要控件使用生成的增量 XML 来呈现用户正在提交的请求的 UI。 DeltaXml 这与摘要控件一起使用以显示增量。
PrimaryResourceRightsDataSource 此数据源为 FIM 2010 资源的每个属性提供内联权限。 这使 RC 能够提前确定用户对该属性具有哪些权限,然后相应地呈现该属性的 UI。 [AttributeName]
SchemaDataSource 此数据源可用于访问架构相关信息,例如显示名称、说明、是否需要属性以及资源类型信息。 [AttributeName].Required 布尔值,该值指示属性是否必须具有有效值。
[AttributeName].DisplayNameString 指示绑定的显示名称的值。
[AttributeName].DescriptionString 指示绑定说明的值。
[AttributeName].StringRegexString 指示绑定的字符串正则表达式的值。
[AttributeName].DisplayName
[AttributeName].Description
[AttributeName].IntegerValueMinimum
[AttributeName].IntegerValueMaximum
[AttributeName].LocalizedAllowedValues
DomainDataSource 此数据源基于域配置资源提供域的枚举。 此数据源只能在用于组资源和用户资源的 RCDC 中使用。 是的 域名

下面是将三个数据源绑定到 UocTextBox 控件以编辑组的说明属性的示例 RCDC 代码片段:

<my:ObjectDataSource my:TypeName="PrimaryResourceObjectDataSource" my:Name="object" my:Parameters=""/>
<my:ObjectDataSource my:TypeName="SchemaDataSource" my:Name="schema"/>
<my:ObjectDataSource my:TypeName="PrimaryResourceRightsDataSource" my:Name="rights"/>

     <my:Control my:Name="Description" my:TypeName="UocTextBox" my:Caption="{Binding Source=schema, Path=Description.DisplayName}" my:RightsLevel="{Binding Source=rights, Path=Description}">
          <my:Properties>
               <my:Property my:Name="Required" my:Value="{Binding Source=schema, Path=DisplayName.Required}"/>
               <my:Property my:Name="Rows" my:Value="3"/>
               <my:Property my:Name="Columns" my:Value="60"/>
               <my:Property my:Name="MaxLength" my:Value="450"/>
               <my:Property my:Name="Text" my:Value="{Binding Source=object, Path=Description, Mode=TwoWay}"/>
          </my:Properties>
     </my:Control>

XMLDataSource 元素

通过使用 XMLDataSource 元素,可以指定 RCDC 可以为给定资源使用的自定义数据。 在这种情况下,必须在 RCDC 中指定 XML 数据。 或者,此数据源可用于引用内置 XML 数据结构,以呈现摘要页的 UI。 控制在 RCDC 中定义 XMLDataSource 时要使用的 XMLDataSource 类型。

类型名称 说明 双向绑定 绑定语法
XMLDataSource 数据源表示 XML 数据。 数据可以采用 XSL 格式或嵌入式 XSL 格式:
  • Microsoft.IdentityManagement.WebUI.Controls.dll中的 XSL 格式:
    <my:XmlDataSource my:Name="summaryTransformXsl" my:Parameters="Microsoft.IdentityManagement. WebUI.Controls.Resources.DefaultSummary.xsl"> </my:XmlDataSource>
  • 嵌入的 XSL 格式:
    <my:XmlDataSource my:Name="RequestStatusTransformXsl"><xsl:stylesheet version="1.0" xmlns:xsl=http://www.w3.org/1999/XSL/Transform xmlns:msxsl="urn:schemas-microsoft-com:xslt"></xsl:stylesheet></my:XmlDataSource>
Xpath[;namespaces]其中 Xpath 是一个有效的 XML xpath 来选择所需的注释,通常是“/”(根)。 namespaces 是前缀=URI 字符串的可选列表。 该字符串由分号分隔,因为 Xpath 可针对命名空间 XML 工作。
ReferenceDeltaDataSource 数据源表示多值引用属性的增量。 它仅用于组和集的 RCDC。
尽管数据源不限于组或集,但它需要 RCDC 主机中的代码更改才能提交此类增量。 目前,组和集是唯一能够识别此数据源的主机。
是的 [AttributeName].Add 其中 [AttributeName] 表示引用属性,返回的数据是增量加法。
  • 示例:[ReferenceAttribute].Add
  • 示例:<my:Property my:Name="Value" my:Value="{Binding Source=delta, Path=ExplicitMember.Add, Mode=TwoWay}"/>
[AttributeName].Remove 其中 [AttributeName] 表示引用属性,返回的数据是增量删除。
DeltaXml
RequestDetailsDataSource 数据源表示 Request 对象的 RequestParameter 属性。 该参数设置每个多值属性显示的最大属性值数。 它仅在 RCDC 中用于请求。 <my:ObjectDataSource my:TypeName="RequestDetailsDataSource" my:Name="requestDetails" my:Parameters="1000" /> DeltaXml
RequestStatusDataSource 数据源表示 Request 对象的 RequestStatusDetails 属性。 它仅在 RCDC 中用于请求。 DeltaXml

若要定义自定义 XML 数据源,请使用以下 XML:

<my:XmlDataSource my:Name="MyCustomData" >
    %Insert custom, properly formatted XML data here%
</my:XmlDataSource>

若要使用内置摘要控件 XSL,请定义数据源,如下所示:

<my:XmlDataSource my:Name="summaryTransformXsl" my:Parameters="Microsoft.IdentityManagement.WebUI.Controls.Resources.DefaultSummary.xsl" />

如果要为自定义资源类型创建 RCDC,则可以使用此方法自动呈现该自定义资源的摘要页。

下面是如何使用 PrimaryResourceDeltaDataSource 元素和内置 XSL XMLDataSource 元素在 RCDC 中创建摘要选项卡的示例:

<my:ObjectDataSource my:TypeName="PrimaryResourceDeltaDataSource" my:Name="delta" />
<my:XmlDataSource my:Name="summaryTransformXsl" my:Parameters="Microsoft.IdentityManagement.WebUI.Controls.Resources.DefaultSummary.xsl" />

<my:Grouping my:Name="summaryGroup" my:Caption="Summary” my:IsSummary="true">
     <my:Control my:Name="summaryControl" my:TypeName="UocHtmlSummary" my:ExpandArea="true">
          <my:Properties>
               <my:Property my:Name="ModificationsXml" my:Value="{Binding Source=delta, Path=DeltaXml}" />
              <my:Property my:Name="TransformXsl" my:Value="{Binding Source=summaryTransformXsl, Path=/}" />
          </my:Properties>
     </my:Control>
</my:Grouping>

或者,用户可以将之前指定的 XmlDataSource 元素替换为以下格式来定义摘要页的自定义布局。 作为参考,默认 FIM 2010 摘要 XSL 包含在附录 B:默认摘要 XSL 中,本文档的后面部分。

<my:XmlDataSource my:Name="summaryTransformXsl">
     Insert valid XSL code here
</my:XmlDataSource>

数据源的架构

以下 XSD 架构生成两种类型的数据源:

<xsd:element name="ObjectDataSource">
     <xsd:complexType>
          <xsd:sequence/>
          <xsd:attribute ref="my:TypeName"/>
          <xsd:attribute ref="my:Name"/>
          <xsd:attribute ref="my:Parameters"/>
     </xsd:complexType>
</xsd:element>
<xsd:element name="XmlDataSource">
     <xsd:complexType  mixed="true">
          <xsd:sequence>
              <xsd:any minOccurs="0" maxOccurs="unbounded" processContents="lax"/>
          </xsd:sequence>
          <xsd:attribute ref="my:Name"/>
          <xsd:attribute ref="my:Parameters"/>
    </xsd:complexType>
</xsd:element>

事件元素

事件 元素定义控件的更改状态。 此功能的扩展性有限,因为无法编写自定义函数(Handler)来定义触发事件后的行为。 同一事件元素可以在 Panel 元素中使用。 有关详细信息,请参阅本文档后面的“面板”部分。

下面是 Event 元素的 XSD 架构:

<xsd:element name="Events">
     <xsd:complexType>
          <xsd:sequence>
               <xsd:element ref="my:Event" minOccurs="1" maxOccurs="16"/>
          </xsd:sequence>
     </xsd:complexType>
</xsd:element>
<xsd:element name="Event">
     xsd:complexType>
          <xsd:simpleContent>
               <xsd:extension base="xsd:string">
                    xsd:attribute ref="my:Name"/>
                    <xsd:attribute ref="my:Handler"/>
               </xsd:extension>
          </xsd:simpleContent>
     </xsd:complexType>
     </xsd:element>

事件 是一个空元素,它具有以下属性:

  • 名称:这是事件的唯一名称。 ObjectControlConfiguration 中唯一受支持的事件是 Load 事件。 首次加载页面时会触发此事件。

  • 处理程序:这是处理程序的唯一名称。 触发事件时,通常调用程序方法来处理控件状态的更改。 不支持以下情况:

    • 从现有控件中删除现有处理程序。
    • 创建新处理程序。
    • 将处理程序附加到现有或新控件。

下面是 事件 元素的示例:

<my:Events>
    <my:Event my:Name="Load" my:Handler="OnLoad"/>
</my:Events>

Panel 元素

Panel 元素是 RCDC 布局中的核心元素。 以下是 Panel 元素的 XSD 架构:

<xsd:element name="Panel">
     <xsd:complexType>
          <xsd:sequence>
               <xsd:element ref="my:Grouping" minOccurs="1" maxOccurs="16"/>
          </xsd:sequence>
          <xsd:attribute ref="my:Name"/>
          <xsd:attribute ref="my:DisplayAsWizard"/>
          <xsd:attribute ref="my:Caption"/>
          <xsd:attribute ref="my:AutoValidate"/>
     </xsd:complexType>
</xsd:element>

Panel 元素包含定期元素,分组。 有关详细信息,请参阅本文档中的“分组”部分。

Panel 元素具有以下属性:

  • 名称:面板的名称。 这是必需的字符串类型属性。

  • DisplayAsWizard:此属性当前已弃用。 RCDC 上的相应 VerbContext 属性控制资源布局处于向导模式或 Tab 模式时。 如果设置为 0(创建模式),则它也处于向导模式。 否则,它处于 Tab 模式。 有关详细信息,请参阅文档中的“配置和自定义 FIM 门户简介”。

  • Caption:此属性当前已弃用。 用户可以通过包含仅包含页眉信息的组来指定页面的标题。 有关详细信息,请参阅本文档中的“分组”部分。

  • AutoValidate:这是可选的布尔属性。 当它设置为 true 验证时,将针对当前选项卡上的每个控件触发。默认情况下,如果该属性缺失,则设置为 true。 它可以与 RegularExpression 属性结合使用。 有关详细信息,请参阅本文档后面的部分中的“RegularExpression”。

分组元素

分组 元素定义面板的整体布局。 它充当一个容器,将各个控件组合到不同的节和选项卡中。 下面是 Grouping 元素的 XSD 架构:

<xsd:element name="Grouping">
     <xsd:complexType>
          <xsd:sequence>
               <xsd:element ref="my:Help" minOccurs="0"  maxOccurs="1"/>
               <xsd:element ref="my:Control" minOccurs="1" maxOccurs="256"/>
               <xsd:element ref="my:Events" minOccurs="0" maxOccurs="1"/>
          </xsd:sequence>
          <xsd:attribute ref="my:Name"/>
          <xsd:attribute ref="my:Caption"/>
          <xsd:attribute ref="my:Description"/>
          <xsd:attribute ref="my:Enabled"/>
          <xsd:attribute ref="my:Visible"/>
          <xsd:attribute ref="my:IsHeader"/>
          <xsd:attribute ref="my:IsSummary"/>
     </xsd:complexType>
</xsd:element>

有三种类型的 分组 元素:

  • 标头分组:标头分组是可选的。 面板中只能有一个标头分组。 标题分组作为标题显示在面板顶部。 此分组中只能使用一个 UocCaptionControl。 有关标头分组的示例,请参阅“示例”部分。

  • 内容分组:至少需要一个内容分组。 面板中可以有多个内容分组。 内容分组显示为 RCDC 页面的主要内容。 每个内容分组都显示为同一面板中的选项卡,可以保留 1 到 256 个控件。 有关 内容分组的示例,请参阅“示例”部分。

  • 摘要分组:摘要分组是可选的。 面板中只能有一个摘要分组。 摘要分组显示为面板的最后一个选项卡。 摘要分组中只能使用一个 UocHtmlSummary 控件来显示用户在提交请求之前所做的更改。 有关摘要分组的示例,请参阅“示例”部分。

每个分组类型包含以下元素:

  • 帮助:此元素在选项卡中提供帮助文本。还可以使用它向选项卡的帮助文件添加链接。

  • 控件:有关此元素的信息,请参阅本文档中的“控件”部分。 每个分组必须具有 1 到 256 个控件,具体取决于分组的类型。

  • 事件:有关此元素的信息,请参阅本文档中的“事件”部分。 每个分组都可以作为选项使用一个事件。 分组元素中支持的事件如下所示:

    • BeforeLeave:当用户准备好离开内容分组中的选项卡时,将触发此事件。
    • AfterEnter:当用户准备好在内容分组中输入选项卡时,将触发此事件。

分组可以包含以下七个属性:

  • 名称:这是分组所需的名称。 名称面板中必须是唯一的。

  • 标题:标题分组中 标题 显示为标题标题。 它显示为内容或摘要分组的选项卡标题。

  • 说明:可选字符串属性,说明 仅在内容分组中使用时才有效。 使用此元素为最终用户提供有关同一选项卡中信息的一些详细信息。

    注释

    如果在摘要分组中使用此属性,则 XML 被视为无效。 如果在标头分组中使用此属性,则 XML 被视为有效,但将被忽略。

  • 已启用:可选布尔属性,如果缺少,则 Enabled 设置为 true。 如果 Enabled 设置为 false,最终用户将看到“已禁用”选项卡。此属性仅在内容分组中正常工作。

    注释

    如果在摘要分组中使用此属性,则 XML 被视为无效。 如果在标头分组中使用此属性,则 XML 被视为有效,但将被忽略。

  • 可见:可以通过将此属性设置为 false 来隐藏 RCDC 页面选项卡或其标题。 默认情况下,此可选布尔类型属性设置为 true。 此属性仅在内容分组上正常工作。

    注释

    当面板中只有一个内容分组时,此功能不起作用。 当面板中有多个内容分组时,它的行为与前面所述一样。

  • IsHeader:此属性是可选的布尔属性,用于定义分组是否为标头分组。 如果未指定此属性,则它设置为 false。

  • IsSummary:这是一个可选的布尔属性,用于定义分组是否为摘要分组。 如果未指定此属性,则它设置为 false。

分组元素类型的示例

本部分包含 Groupings 元素的示例。

示例:标头分组

下图显示了示例标头分组:

标头分组

以下 XML 生成示例标头分组。 在 XML 中,标头分组是标题文本“示例标头分组”的区域。

<!--Sample for a Header Grouping-->
<my:Grouping my:Name="HeaderGroupingSample" my:IsHeader="true">
     <my:Control my:Name="SampleHeaderCaption" my:TypeName="UocCaptionControl" my:ExpandArea="true" my:Caption="Sample Header Grouping">
          <my:Properties>
               <my:Property my:Name="MaxHeight" my:Value="32"/>
               <my:Property my:Name="MaxWidth" my:Value="32"/>
          </my:Properties>
      </my:Control>
</my:Grouping>
<!--End of Header Grouping Sample-->

示例:内容分组

下图显示了示例内容分组:

内容分组

以下 XML 生成示例内容分组。 在 XML 中,内容分组是标题文本“示例内容分组”的区域。

<!--Sample for a Content Grouping-->
<my:Grouping my:Name="ContentGroupingSample" my:Caption="Sample Content Grouping" my:Description="Some description for content grouping">
     <my:Control my:Name="DisplayName" my:TypeName="UocTextBox" my:Caption="Display name" my:Description="This is the display name of the set.">
          <my:Properties>
               <my:Property my:Name="Required" my:Value="True"/>
               <my:Property my:Name="MaxLength" my:Value="128"/>
               <my:Property my:Name="Text" my:Value="{Binding Source=object, Path=DisplayName, Mode=TwoWay}"/>
          </my:Properties>
     </my:Control>
</my:Grouping>
<!--End of Content Grouping Sample-->

示例:摘要分组

下图显示了一个示例摘要分组:

摘要分组

以下 XML 生成示例摘要分组。 在 XML 中,摘要分组是标题文本“示例摘要分组”的区域。

<!--Sample for a Summary Grouping-->
<my:Grouping my:Name="Summary" my:Caption="Sample Summary Grouping" my:IsSummary="true">
     <my:Control my:Name="SummaryControl" my:TypeName="UocHtmlSummary" my:ExpandArea="true">
          <my:Properties>
               <my:Property my:Name="ModificationsXml" my:Value="{Binding Source=delta, Path=DeltaXml}"/>
               <my:Property my:Name="TransformXsl" my:Value="{Binding Source=summaryTransformXsl, Path=/}"/>
          </my:Properties>
     </my:Control>
</my:Grouping>
<!--End of Summary Grouping Sample-->

Help 元素

Help 元素可以作为可选元素包含在分组或 Control 元素中。 如果在分组中使用,则它必须是使用的第一个元素。 它为最终用户提供文本帮助,帮助他们提供准确的信息。 以下 XSD 架构适用于 Help 元素:

<xsd:element name="Help">
     <xsd:complexType>
          <xsd:sequence/>
          <xsd:attribute ref="my:HelpText"/>
          <xsd:attribute ref="my:Link"/>
     </xsd:complexType>
</xsd:element>

以下 XML 示例代码生成 Help 元素:

<my:Help my:HelpText="Some Help Text for Group Basic Info" my:Link="03e258a0-609b-44f4-8417-4defdb6cb5e9.htm#bkmk_grouping_GroupingBasicInfo" />

Control 元素

分组元素包含一个或多个 控件 元素。 控件是 RCDC 的主要元素。 可以通过定义它包含的不同控件元素来自定义分组元素。 以下 XSD 架构适用于 Control 元素:

<xsd:element name="Control">
     <xsd:complexType>
          <xsd:sequence>
               <xsd:element ref="my:Help" minOccurs="0"  maxOccurs="1"/>
               <xsd:element ref="my:CustomProperties" minOccurs="0"  maxOccurs="1"/>
               <xsd:element ref="my:Options" minOccurs="0"  maxOccurs="1"/>
               <xsd:element ref="my:Buttons" minOccurs="0"  maxOccurs="1"/>
               <xsd:element ref="my:Properties" minOccurs="0"  maxOccurs="1"/>
               <xsd:element ref="my:Events" minOccurs="0" maxOccurs="1"/>
          </xsd:sequence>
          <xsd:attribute ref="my:Name"/>
          <xsd:attribute ref="my:TypeName"/>
          <xsd:attribute ref="my:Caption"/>
          <xsd:attribute ref="my:Enabled"/>
          <xsd:attribute ref="my:Visible"/>
          <xsd:attribute ref="my:Description"/>
          <xsd:attribute ref="my:ExpandArea"/>
          <xsd:attribute ref="my:Hint"/>
          <xsd:attribute ref="my:AutoPostback"/>
          <xsd:attribute ref="my:RightsLevel"/>
     </xsd:complexType>
</xsd:element>

Control 元素包含以下元素:

  • 帮助:忽略此元素。 它仅在分组中运行。

  • CustomProperties:不支持此元素。

  • 选项:此元素仅与 UocDropDownListUocRadioButtonList Controls 结合使用。 它不适用于任何其他控件。 有关此元素的结构,请参阅本文档中的“选项”部分。 请参阅本文档的“单个控件”部分,了解控件如何使用选项。

  • 按钮:此元素仅与 UocListView 控件结合使用。 它不适用于任何其他控件。 有关详细信息,请参阅本文档中的 UocListView 部分。

  • 属性:此元素在所有控件中用于指定控件的其他行为。 有关此元素的信息,请参阅本文档中的“属性”部分。

  • 事件:有关此元素的结构,请参阅本文档前面的“事件”部分。 请参阅本文档的“单个控件”部分,查看控件中使用的事件。

Control 元素可以包含以下 10 个属性:

  • 名称:这是控件的名称。 控件的名称在每个面板中必须是唯一的。 这是必需的字符串类型属性。

  • TypeName:此属性指定控件的类型。 这是必需的字符串类型属性。 有关每个控件名称,请参阅本文档中的“单个控件”部分。

  • Caption:可以使用此属性来包含控件的标题。 标题通常是控件显示或输入的数据的显示名称。 可以显式指定标题的值,或者将其与架构属性显示名称信息绑定。 标题显示在正常大小的控件的最左侧。 如果控件跨越全屏,标题会显示在控件上。 这是可选的字符串类型属性。 有关如何将数据源与属性或属性值绑定的信息,请参阅“属性”部分。

    以下示例演示如何显式使用题注:

      <my:Control my:Name="ExplicitAlias" my:TypeName="UocTextBox" my:Caption="Explicit Alias">…<my:Control/>
    

    以下示例演示如何将标题与数据源一起使用。 如果已将模板用于本文档前面所示的数据源,则数据源为架构。 建议将属性的 DisplayName 与 Caption 属性绑定。

    <my:Control my:Name="DynamicAlias" my:TypeName="UocTextBox" my:Caption="{Binding Source=schema, Path=Alias.DisplayName, Mode=OneWay}">…<my:Control/>
    
  • 已启用:这是可选的布尔类型属性。 通过将此属性值设置为 false,用户可以禁用控件。 默认值设置为 true。

  • 可见:这是可选的布尔类型属性。 可以使用此属性隐藏整个控件。 默认值设置为 true。

  • 说明:使用此可选的字符串类型属性来包含说明,以帮助最终用户了解控件中应放置的内容或控件的作用。 可以显式指定说明的值,或将其与架构属性说明信息绑定。

    说明显示在标题下方正常大小的控件的最左侧。 如果控件跨越全屏,说明将显示在标题下的控件顶部。 有关如何将数据源与属性或属性值绑定的信息,请参阅本文档中的“属性”部分。

    以下示例演示如何显式使用说明:

    <my:Control my:Name="ExplicitAlias" my:TypeName="UocTextBox" my:Caption="Explicit Alias" my:Description="This is explicit description.">…<my:Control/>
    

    此示例演示如何将 Description 与数据源一起使用。 如果已将模板用于本文档前面所示的数据源,则数据源 架构。 建议将属性的 Description 与 Description 属性绑定。

    <my:Control my:Name="DynamicAlias" my:TypeName="UocTextBox" my:Caption="{Binding Source=schema, Path=Alias.DisplayName, Mode=OneWay}" my:Description="{Binding Source=schema, Path=Alias.Description, Mode=OneWay}">…<my:Control/>
    
  • ExpandArea:此属性指示控件是否跨全屏。 这是可选的布尔类型属性。 默认值设置为 false。

    注释

    当此属性设置为 true 时,将禁用 Caption 和 Description 属性。 使用 UocLabel 控件为展开的控件提供标题。

  • 提示:这是可选的字符串类型属性。 Hint 属性中的文本可帮助最终用户确定控件的有效输入。 提示显示在控件下方。

  • AutoPostback:这是可选的布尔类型属性。 默认值为 false。 如果设置为 false,刷新页面可能不会刷新控件。 有关 AutoPostback 的信息,请查找同名 ASP.NET UI 控件属性Microsoft。

  • RightsLevel:这是可选的字符串类型属性。 只能将此属性与数据源的内联权限绑定。 根据用户的权限动态打开或禁用该控件。 有关如何将数据源与属性或属性值绑定的信息,请参阅本文档中的“属性”部分。

    此示例演示如何将 RightsLevel 属性与数据源一起使用。 如果已将模板用于本文档前面所示的数据源,则数据源 权限。 使用属性名称作为路径。

属性元素

可以使用 属性 元素进一步自定义每个控件的行为。 属性是空元素。 以下 XSD 架构适用于 Property 元素:

<xsd:element name="Properties">
     <xsd:complexType>
          <xsd:sequence>
               <xsd:element ref="my:Property" minOccurs="1" maxOccurs="32"/>
          </xsd:sequence>
     </xsd:complexType>
</xsd:element>
<xsd:element name="Property">
     <xsd:complexType>
          <xsd:simpleContent>
               <xsd:extension base="xsd:string">
                    <xsd:attribute ref="my:Name"/>
                    <xsd:attribute ref="my:Value"/>
               </xsd:extension>
          </xsd:simpleContent>
     </xsd:complexType>
</xsd:element>

每个属性具有以下两个必需属性:

  • 名称:此字符串类型属性是属性的唯一名称。 不同的控件具有不同的属性。 有一些通用属性可供所有控件使用。 有关给定控件可用的名称的详细信息,请参阅本文档的“通用属性”和“单个控件”部分。

  • :这是属性的值。 值的数据类型取决于它分配到的属性。 有关特定属性允许的值格式,请参阅以下部分。

将属性与数据源内容绑定

某些属性可以使用数据源中的信息进行绑定。 使用以下字符串格式进行此绑定。 请参阅本文档的“单独控件”部分中各个属性的说明,了解如何将属性与数据源绑定。

<my:Property my:Name="Required" my:Value="[Formatted String]"/>

   Formatted String :=  “{Binding “ + [SourceExpression] + “,” + [PathExpression] + “,” + [ModeExpression]? + “}

   SourceExpression:= “Source=” + [ObjectDataSourceName]

   PathExpression:= “Path=” + [AttributeName]|[AttributePropertyName]

   ModeExpression:= “Mode=” + [ModeChoice]

   ModeChoice:= “OneWay”|”TwoWay”

   ObjectDataSourceName:= The value of any string assign to node /ObjectControlConfiguration/ObjectDataSource/Name.

   AttributeName:= valid schema attribute name from the data source.

   AttributePropertyName:= valid property name of a schema attribute from the data source.

以下 XML 演示如何将数据源绑定到 属性 元素:

<my:Property my:Name="Text" my:Value="{Binding Source=object, Path=DisplayName, Mode=TwoWay}"/>
<my:Property my:Name="Required" my:Value="{Binding Source=schema, Path=DisplayName.Required}"/>

通用属性

本文档中指定的所有 RCDC 控件都可以具有本节中所述的通用属性。 可以将这些属性与其他特定于不同控件的属性一起使用。

  • 必需:此属性指示该字段为必填字段或可选字段。 必须用值填充必填字段。 字符串输入不支持空值。 可选字段可以留空。 如果此字段是未填充值的必要字段,则输入控件顶部会显示一条错误消息。 可以显式指定字段是必需字段还是可选字段。 还可以将字段与属性与资源类型之间的给定绑定的架构信息绑定绑定。 默认情况下,如果缺少此属性,则表示控件是可选的输入控件。

    以下示例对此属性使用显式值:

    <my:Property my:Name="Required" my:Value="True"/>
    

    此示例使用此属性的动态数据源。 如果已将模板用于本文档上一部分所示的数据源,则数据源为架构。 使用 <attribute name>.Required 作为路径。

    <my:Property my:Name="Required" my:Value="{Binding Source=schema, Path=DisplayName.Required}"/>
    
  • ReadOnly:通过将此属性设置为 true,最终用户在只读模式下体验控件。 这是可选的布尔类型属性。 默认值设置为 false。 但是,有时此属性的行为被用户对与控件绑定的数据的权限类型覆盖。 例如,如果用户无权更新字段,并且字段绑定到内联权限,则即使此属性设置为 false,用户也会在只读模式下看到数据。

  • RegularExpression:此属性指定对控件中的值施加的限制。 此属性值的格式是 .NET StringRegex 标准中支持的格式。 有关详细信息,请参阅 .NET Framework 正则表达式。 如果控件用于输入值,则当用户尝试离开当前页时,会根据此属性中指定的限制检查该值。 错误消息显示在输入无效的控件顶部。 用户可以显式指定字符串正则表达式。 用户还可以将它与给定属性的架构信息绑定。 默认情况下,如果此属性缺失,则表示控件不会检查输入字符串的任何限制。

    以下示例对此属性使用显式值:

    <my:Property my:Name="RegularExpression" my:Value="[A-Z]*"/>
    

    此示例使用此属性的动态数据源。 如果已将模板用于本文档前面显示的数据源,则数据源为架构。 使用 <attribute name>.StringRegex 作为路径。

    <my:Property my:Name="RegularExpression" my:Value="{Binding Source=schema, Path=Alias.StringRegex, Mode=OneWay}"/>
    
  • 可见:这是可选的布尔类型属性。 可以使用此属性隐藏整个控件。 默认值设置为 true。

Options 元素

Options 元素包括一个或多个 Option 子节点。 Options 元素仅用于 UocRadioButtonListUocDropDownList 控件。 有关如何使用这些控件的详细信息,请参阅本文档的“单独控件”部分。

以下 XSD 架构适用于 Options 元素:

<xsd:element name="Options">
     <xsd:complexType>
          <xsd:sequence>
               <xsd:element ref="my:Option" minOccurs="0" maxOccurs="unbounded"/>
          </xsd:sequence>
     </xsd:complexType>
</xsd:element>
<xsd:element name="Option">
     <xsd:complexType>
          <xsd:simpleContent>
               <xsd:extension base="xsd:string">
                    <xsd:attribute ref="my:Value"/>
                    <xsd:attribute ref="my:Caption"/>
                    <xsd:attribute ref="my:Hint"/>
               </xsd:extension>
          </xsd:simpleContent>
     </xsd:complexType>
</xsd:element>

Options 元素具有以下属性:

  • :这是字符串类型的必需属性。 值属性必须在同一控件中是唯一的。 只能使用 A 到 Z,不区分大小写的字符。

  • Caption:此必需属性是每个选项的显示名称。

  • 提示:这是一个可选属性。 使用此属性向最终用户提供更多信息和提示。

环境变量

可在任何 RCDC 配置中使用以下环境变量:

变量 说明
<LoginID> 显示当前登录的用户的 ID。
<LoginDomain> 显示当前登录的用户的域。
<Today> 显示当前日期和时间
<FromToday_nnn> 显示当前日期,以及 nnn 和时间,其中 nnn 为整数。
<ObjectID> RCDC 主资源 ID。
<Attribute_xxx> 返回 RCDC 主资源的指定属性 xxx。

调试 XML 配置文件

开发或修改 RCDC 的 XML 配置文件时,通过使用编辑器(如 Microsoft Visual Studio)验证 XSD 文件的 XML,有助于减少错误。 有关详细信息,请参阅 Visual Studio 2005中的 XML 工具简介。

自定义帮助文件

如果创建新的资源和属性,可能需要使用自定义资源的内容更新 FIM 门户中的现有帮助文件。 FIM 门户中的帮助文件采用 .htm 格式,可以手动编辑它们。 有关创建自定义属性的详细信息,请参阅 FIM 2010 文档中的自定义资源和属性管理简介。

重要

本文未提供有关格式设置或编辑 HTML 的基础知识的信息。 用户应知道如何编辑 HTML 文件。

帮助文件的位置

Microsoft Identity Manager 2016 SP1 门户的所有帮助文件都位于 MIM 服务服务器上的文件夹 <ProgramFiles>\Common Files\Microsoft Shared\Web Server Extensions\12\Template\Layouts\MSILM2\Help\1033\html

找到特定的帮助文件

FIM 门户的所有帮助文件都以全局唯一标识符(GUID)命名。 若要找到自定义资源的正确文件,请执行以下作:

  1. 在 FIM 门户中,打开要自定义的门户页上的“帮助”文件。

  2. 右键单击“帮助”文件,然后选择 属性

  3. 突出显示并复制 <GUID\>.htm 字段中的 文件。

  4. 浏览到存储帮助文件的文件夹并搜索该文件。

在现有分组元素中添加属性的内容

若要在现有分组元素中添加新属性的描述性内容(选项卡):

  1. 确定并找到相应的帮助文件。

  2. 使用 HTML 编辑器打开该文件。

  3. 找到要添加内容的位置。 通常,这是另一个段落,例如:

    <p xmlns="">A new paragraph with customized information.</p>

    它也可能是插入到现有列表中的项,例如:

    <li class="unordered"><b>First Name</b> – The first name of the User.<br>
    <li class="unordered"><b>Last Name</b> - The last name of the User.<br>
    <li class="unordered"><b>Added a new line</b><br>
    

为现有分组元素添加内容

大多数 FIM 门户页面具有多个分组元素(或选项卡),随附的帮助文件具有与每个分组元素相关的分区的书签。 HTML 中的书签在各节中指定。 例如,这是 FIM 门户中“创建用户”页的帮助文件中“工作信息”选项卡的 HTML:

<a name="bkmk_grouping_WorkInfo" xmlns=""></a><h3 class="subHeading" xmlns="">Work Info</h3><p class="subHeading" xmlns=""></p><div class="subSection" xmlns="">

它由 Configuration Data XML 文件中的 Grouping 元素 WorkInfo 引用,用于 用户创建配置 RCDC。 \<GUID\>.htm 参数中指定了 my:Link 文件名和书签:

<my:Grouping my:Name="WorkInfo" my:Caption="%SYMBOL_WorkInfoTabCaption_END%" my:Enabled="true" my:Visible="true"> <my:Help my:HelpText="%SYMBOL_WorkInfoTabHelpText_END%" my:Link="5e18a08b-4b20-48b8-90c6-c20f6cbeeb44.htm#bkmk_grouping_WorkInfo"/>

简单控件示例

本部分提供了用于创建不同简单文本框控件的示例。

下图显示了不同模式下的一些简单的文本框控件:

简单文本框控件

以下代码段创建第一个文本框控件,该控件对所有属性和属性使用显式文本:

<!-- Sample for a simple control to use explicit information. (with hints)-->
<my:Control my:Name="ExplicitControl" my:TypeName="UocTextBox" my:Caption="Explicit Control" my:Description="This is explicit description." my:Hint="This is a Hint (enter any text).">
     <my:Properties>
          <my:Property my:Name="Required" my:Value="True"/>
          <my:Property my:Name="RegularExpression" my:Value="[A-Z]*"/>
          <my:Property my:Name="Text" my:Value="Enter Information Here"/>
     </my:Properties>
</my:Control>
<!-- End of Sample for a simple control to use explicit information.-->

以下代码段创建第二个文本框控件,该控件使用动态绑定技术将控件与其他数据源链接:

<!-- Sample for a simple control to use stored data information.-->
<my:Control my:Name="DynamicControl" my:TypeName="UocTextBox" my:Caption="{Binding Source=schema, Path=DisplayName.DisplayName, Mode=OneWay}" my:Description="{Binding Source=schema, Path=DisplayName.Description, Mode=OneWay}" my:RightsLevel="{Binding Source=rights, Path=DisplayName, Mode=OneWay}">
     <my:Properties>
          <my:Property my:Name="Required" my:Value="{Binding Source=schema, Path=DisplayName.Required, Mode=OneWay}"/>
          <my:Property my:Name="RegularExpression" my:Value="{Binding Source=schema, Path=DisplayName.StringRegex, Mode=OneWay}"/>
          <my:Property my:Name="Text" my:Value="{Binding Source=object, Path=DisplayName, Mode=TwoWay}"/>
     </my:Properties>
</my:Control>
<!-- End of Sample for a simple control to use stored data information.-->

以下代码段创建第三个展开的标签和文本框控件:

<!-- Sample for a simple expanded control with caption control.-->
<my:Control my:Name="SampleExpandLabel" my:TypeName="UocLabel" my:ExpandArea="true">
     <my:Properties>
          <my:Property my:Name="Text" my:Value="This is an expanded control."/>
     </my:Properties>
</my:Control>
<my:Control my:Name="ExpandedControl" my:TypeName="UocTextBox"
          my:ExpandArea="true">
     <my:Properties>
          <my:Property my:Name="Required" my:Value="false"/>
          <my:Property my:Name="Columns" my:Value="40"/>
          <my:Property my:Name="Text" my:Value="Expanded control (enter text)"/>
     </my:Properties>
</my:Control>
<!-- End of Sample for a simple expanded control.-->

以下代码段创建第四个禁用的文本框控件。 尽管此控件不显示禁用状态与启用状态之间的明显差异,但用户无法再在文本框中输入数据。

<!-- Sample for a simple disabled control.-->
<my:Control my:Name="DisabledControl" my:TypeName="UocTextBox" my:Caption="Disabled Control" my:Description="This is disabled simple control." my:Enabled="false">
     <my:Properties>
          <my:Property my:Name="Required" my:Value="false"/>
          <my:Property my:Name="MaxLength" my:Value="128"/>
          <my:Property my:Name="Text" my:Value="Disabled control"/>
     </my:Properties>
</my:Control>
<!-- End of Sample for a simple disabled control.-->

单个控件

本部分介绍Microsoft Identity Manager 2016 SP1 提供的各个控件。

UocButton

名称: UocButton

说明:这是一个简单的按钮控件,可用于触发某些作。 但是,由于无法指定自己的处理程序,因此此控件的使用受到限制。

属性

  • 所有通用属性:有关这些属性的信息,请参阅 通用属性

  • 文本:此属性指定按钮上显示的文本。 这是可选的字符串类型属性。 文本采用显式字符串值。

事件

  • OnButtonClicked:单击按钮时发出该事件。

示例

UocButton 控件

以下 XML 段生成简单的 UocButton 控件按钮:

<!--Sample enabled simple button control-->
<my:Control my:Name="ButtonControl" my:TypeName="UocButton" my:Caption="SampleButton" my:Description="This is a simple button."
my:Hint="Click the button">
     <my:Properties>
          <my:Property my:Name="Required" my:Value="True"/>
          <my:Property my:Name="Text" my:Value="Click Me"/>
     </my:Properties>
</my:Control>
<!--End of sample enabled simple button control -->

UocCaptionControl

名称:UocCaptionControl

说明:此控件用于显示 RCDC 页面的标题。 此控件旨在仅用作标头分组中的单个控件。 在任何其他上下文中使用它可能会导致呈现问题或门户错误。

模式:只读(OneWay)

属性

  • 所有通用属性:有关这些属性的信息,请参阅 通用属性

  • MaxHeight: 此属性指定标题部分中图标的最大高度。 此属性是可选的。 此属性采用整数值(以像素为单位)。 默认值为 32 像素。

事件

  • 此控件没有事件。

示例

UocCaptionControl 控件

以下代码段生成 标头标题

<!--Sample header caption control-->
<my:Control my:Name="SampleHeaderCaption" my:TypeName="UocCaptionControl" my:ExpandArea="true" my:Caption="Header Caption" my:Description="Description Starts here.">
     <my:Properties>
          <my:Property my:Name="MaxHeight" my:Value="32"/>
          <my:Property my:Name="MaxWidth" my:Value="32"/>
     </my:Properties>
</my:Control>
<!--End of sample header caption control-->

以下代码段生成 显式内容标题

<my:Control my:Name="SampleContentCaption" my:TypeName="UocCaptionControl" my:ExpandArea="true" my:Caption="Sample Explicit Content Caption" my:Description="Explicit content caption with smaller icon">
     <my:Properties>
          <my:Property my:Name="MaxHeight" my:Value="20"/>
          <my:Property my:Name="MaxWidth" my:Value="20"/>
     </my:Properties>
</my:Control>
<!--End of sample caption-->

以下代码段生成 显示名称 动态标题:

<!--Sample content dynamic caption-->
<my:Control my:Name="Caption3" my:TypeName="UocCaptionControl" my:Caption="{Binding Source=schema, Path=DisplayName.DisplayName, Mode=OneWay}" my:Description="{Binding Source=schema, Path=DisplayName.Description, Mode=OneWay}"/>
<!--End of sample caption -->

UocCheckBox

名称:UocCheckBox

说明:这是一个简单的复选框控件。 建议用户将此控件与布尔类型数据绑定。 此控件可用作只读控件或可更新控件,具体取决于它绑定到的数据。

注释

在此版本中,当在编辑模式下使用复选框控件显示布尔属性时,如果该属性以前没有分配给该属性的值,则当 在编辑模式下单击“确定” 时,资源控件会将 false 的值添加到该属性。 解决方法是始终创建一个布尔属性,该属性假定不存在与 false相同,或使用其他控件(例如布尔属性的单选按钮)。

属性

  • 所有通用属性:有关这些属性的信息,请参阅 通用属性

  • DefaultValue:这是可选的布尔类型属性。 默认值设置为 false。 此字段指定复选框的默认行为。 这可以显式指定。

  • 选中:这是可选的布尔类型属性。 默认值设置为 false。 此值随 DefaultValue 一起出现时覆盖 DefaultValue 属性。 此字段指定复选框的行为。 与 DefaultValue 一样,可以显式指定或绑定到来自服务器的数据。

  • 文本:这是可选的字符串类型属性。 该文本显示在复选框右侧。 可以使用此属性指定向最终用户提供更多信息的文本。

事件

  • CheckedChanged:当复选框更改其状态时,将发出此事件。

示例

在下面的示例中,在自定义资源类型和属性 IsConfigurationType之间创建自定义绑定。 XML 用于自定义资源类型的 RCDC。

UocCheckBox 控件

以下代码段 生成一个动态复选框,如上图中的动态复选框所示。 这种类型的绑定比显式复选框更通用,更有用。 该属性必须属于当前资源类型。

<!--Sample dynamic check box-->
<my:Control my:Name="SampleDynamicCheckBox" my:TypeName="UocCheckBox" my:Caption="Dynamic Check Box" my:Description="This is a dynamic check box. It saves to data source." my:RightsLevel="{Binding Source=rights, Path=IsConfigurationType}">
     <my:Properties>
          <my:Property my:Name="Text" my:Value="{Binding Source=schema, Path=IsConfigurationType.DisplayName, Mode=OneWay}"/>
          <my:Property my:Name="Checked" my:Value="{Binding Source=object, Path=IsConfigurationType, Mode=TwoWay}"/>
     </my:Properties>
</my:Control>
<!--End of sample dynamic check box -->

UocCommonMultiValueControl

名称:UocCommonMultiValueControl

说明:这是支持特殊字符串格式的多行文本框控件。 多值项中的每个值都用分号(;)或文本框中的换行符)彼此分隔。 建议将此控件与多值、短字符串和整数类型的数据绑定。 此控件支持只读模式和可更新模式。

属性

  • 所有通用属性:有关这些属性的信息,请参阅 通用属性

  • DataType:这是必需的字符串类型属性。 可以将其指定为 字符串、整数或显式 DateTime 类型。 还可以将属性与架构属性的 DataType 属性绑定。 多值引用类型应由 UOCListViewUOCIdentityPicker进行处理。 多值布尔值不是受支持的数据类型。

  • :这是可选的整数类型属性。 可以定义框的高度(以字符数为单位)。 默认值设置为 1。

  • :这是可选的整数类型属性。 可以定义框宽的字符数。 默认值设置为 20。

  • :这是可选的字符串类型属性。 只能将此属性与数据源绑定。

事件

  • ValueListChanged:当控件中的当前值发生更改时,将触发此事件。

示例:

在以下示例中,将创建名为 AMultiValueString 的多值字符串属性并将其绑定到自定义资源类型。 此示例仅在创建此绑定后有效。

UocCommonMultiValueControl 控件

以下代码段生成 UocCommonMultiValueControl 控件:

<!--Sample multivalue control-->
<my:Control my:Name="SampleDynamicMultiValueControl" my:TypeName="UocCommonMultiValueControl" my:Caption="{Binding Source=schema, Path=AMultiValueString.DisplayName, Mode=OneWay}" my:Description="{Binding Source=schema, Path=AMultiValueString.Description, Mode=OneWay}" my:RightsLevel="{Binding Source=rights, Path=AMultiValueString}">
     <my:Properties>
          <my:Property my:Name="Rows" my:Value="6"/>
          <my:Property my:Name="Columns" my:Value="60"/>
          <my:Property my:Name="DataType" my:Value="String"/>
          <!--not supported for above property my:Value={Binding Source=schema, Path=AMultiValueString.DataType, Mode=OneWay}"/>-->
          <my:Property my:Name="Value" my:Value="{Binding Source=object, Path=AMultiValueString, Mode=TwoWay}"/>
     </my:Properties>
</my:Control>
<!--End of sample multivalue control -->

UocDateTimeControl

名称:UocDateTimeControl

说明:这类似于文本框控件,但 说明 只接受特定格式。 在只读模式下,它显示为标签。 有关支持的输入字符串的格式,请参阅本节中的 DateTimeFormat 属性。

属性

  • 所有通用属性:有关这些属性的信息,请参阅 通用属性

  • DateTimeFormat:这是可选的字符串类型属性。 支持的格式 DateTimeDateOnly。 默认值设置为 DateTime 格式。

    • DateTime:属性的格式为 mm/dd/yyyyy hh:mm:ss AM。

    • DateOnly:属性的格式为 mm/dd/yy。

      注释

      无论指定差异的用户如何,都支持 DateTimeDateOnly 格式。

  • :这是可选的字符串类型属性。 将此属性与资源数据源绑定。 此属性的值必须符合正确的日期/时间格式。

事件

  • DateTimeChanged:当日期/时间值发生更改时,将发生该事件。

示例

UocDateTimeControl 控件

以下代码段生成第一个 DateTime 控件。

<!--Sample explicit DateTime control-->
<my:Control my:Name="SampleExplicitDateTimeControl" my:TypeName="UocDateTimeControl" my:Caption="Explicit Date Time Control" my:Description="The data shown here is explicit and in date time format.">
     <my:Properties>
          <my:Property my:Name="DateTimeFormat" my:Value="DateTime"/>
          <my:Property my:Name="Value" my:Value="11/11/2008 00:00:00"/>
     </my:Properties>
</my:Control>
<!--End of sample explicit DateTime control -->

以下代码段生成第二 DateTime 控件。 如果在“数据源”部分中使用了示例代码,则 ExpirationTime 属性绑定到所有资源类型。 因此,可以将它与以下代码一起使用:

<!--Sample dynamic DateTime control-->
<my:Control my:Name="SampleDynamicDateTimeControl" my:TypeName="UocDateTimeControl" my:Caption="{Binding Source=schema, Path=ExpirationTime.DisplayName, Mode=OneWay}" my:Description="{Binding Source=schema, Path=ExpirationTime.Description, Mode=OneWay}" my:RightsLevel="{Binding Source=rights, Path=ExpirationTime}">
     <my:Properties>
          <my:Property my:Name="DateTimeFormat" my:Value="DateOnly"/>
          <my:Property my:Name="Value" my:Value="{Binding Source=object, Path=ExpirationTime, Mode=TwoWay}"/>
     </my:Properties>
</my:Control>
<!--End of dynamic explicit DateTime control -->

UocDropDownList

名称:UocDropDownList

说明:这是一个简单的下拉框控件。 此控件用于从定义的选项集中选择选项。 字符串、整数、日期/时间和布尔值的数据类型非常适合此控件。

属性

  • 所有通用属性:有关这些属性的信息,请参阅 通用属性

  • ValuePath:从 ItemSource 获取 Value 属性的属性。 将 ItemSource 指定为“自定义”时,值路径将设置为“值”。 它与 Option 元素中的 Value 字段绑定,如本节中所述。

  • CaptionPath:从 ItemSource 获取 Value 属性的属性。 将 ItemSource 指定为 Custom 时,值路径设置为 Caption。 它与 Option 元素中的 Caption 字段绑定,如本节中所述。

  • HintPath:从 ItemSource 获取 Value 属性的属性。 将 ItemSource 指定为“自定义”时,值路径设置为“提示”。 它与 Option 元素中的 Hint 字段绑定,如本节中所述。

  • ItemSource:ListControlItems 的集合,用于定义列表中的选项。 用户可以将此项显式设置为 Custom,并使用 Option 元素(如本部分所述)指定字符串值。

  • SelectedValue:当前选择的值。 这是必需的字符串类型属性。 此属性与数据源中的字符串数据绑定。

事件

  • SelectedIndexChanged:下拉列表框中的选择发生更改时发生该事件。

选项

有关 Options 元素的结构,请参阅 Options 元素

  • Value:单个 Options 元素的值可以设置为控件绑定到的数据源的有效输入的任何字符串。

  • 标题:标题可以是任何字符串值。

  • 提示:提示可以是任何字符串值。

示例

UocDropDownList 控件

Options in a UocDropDownList controlOptions in a UocDropDownList controlUocDropDownList 控件中的选项

注释

若要使示例正常工作,必须使用 RCDC 适用的自定义资源类型绑定现有字符串类型属性 范围

以下代码段生成下拉列表:

<!--Sample for drop-down list control-->
<my:Control my:Name="Scope" my:TypeName="UocDropDownList" my:Caption="{Binding Source=schema, Path=Scope.DisplayName}" my:RightsLevel="{Binding Source=rights, Path=Scope}">
     <my:Options>
          <my:Option my:Value="DomainLocal" my:Caption="Domain Local" my:Hint="to secure a local resource (i.e. a file share on your computer)" />
          <my:Option my:Value="Global" my:Caption="Global" my:Hint="to secure resources across your team or division" />
          <my:Option my:Value="Universal" my:Caption="Universal" my:Hint="to use this group across your organization" />
     </my:Options>
     <my:Properties>
          <my:Property my:Name="Required" my:Value="{Binding Source=schema, Path=Scope.Required" />
          <my:Property my:Name="ValuePath" my:Value="Value" />
          <my:Property my:Name="CaptionPath" my:Value="Caption" />
          <my:Property my:Name="HintPath" my:Value="Hint" />
          <my:Property my:Name="ItemSource" my:Value="Custom" />
          <my:Property my:Name="SelectedValue" my:Value="{Binding Source=object, Path=Scope, Mode=TwoWay}" />
     </my:Properties>
</my:Control>
<!--End of Sample for drop-down list control-->

UocFileDownload

名称:UocFileDownload

说明:此控件包含超链接。 单击超链接时,将显示 Windows 保存文件页。 用户可以将文件保存到其本地驱动器。 如果 Internet Explorer 可以呈现文件格式,则还支持“打开”选项。 建议使用此控件的数据类型是格式化字符串(XML)和二进制类型。

注释

在此版本的 Microsoft Identity Manager 2016 SP1 中,用户必须关闭打开文件的 Internet Explorer 窗口,然后刷新页面。 刷新 Internet Explorer 窗口后,用户可以启动下载,以在原始窗口中再次保存或打开同一文件。

属性

  • 所有通用属性:有关这些属性的信息,请参阅 通用属性

  • 文本:这是定义超链接文本的可选字符串类型属性。 用户可以为此属性指定显式字符串。

  • :这是必需的属性。 它指定要下载其内容的服务器上的属性绑定。

  • PromptedFileName:这是可选的字符串类型属性。 这是保存下载的文件时向用户建议的文件名。

  • ContentType:这是必需的字符串类型属性。 这是保存数据的文件类型。 文本或二进制是两个支持的字符串选项。 如果它是文本,则返回值被视为长字符串。 否则,对于二进制文件,返回值被视为 byte[]。 如果选择文本,用户可以添加后缀以指定文本所采用的格式。 例如,文本/xml 有效。

注释

当绑定到此控件的值为空时,该控件缺少用于触发下载作的超链接。 这是因为没有可下载内容。

事件

  • 此控件没有事件。

示例

UocFileDownload 控件

注释

上传此示例文件之前,用户必须在自定义资源类型和现有 ConfigurationData 属性之间创建绑定。

以下代码段生成文件下载控件:

<!--Sample dynamic download control-->
<my:Control my:Name="SampleDynamicFileDownloadControl" my:TypeName="UocFileDownload" my:Caption="{Binding Source=schema, Path=ConfigurationData.DisplayName, Mode=OneWay}" my:Description="{Binding Source=schema, Path=ConfigurationData.Description, Mode=OneWay}" my:RightsLevel="{Binding Source=rights, Path=ConfigurationData}">
     <my:Properties>
          <my:Property my:Name="Text" my:Value="Download Dummy xml"/>
          <my:Property my:Name="PromptedFileName" my:Value="DummyXML.xml"/>
          <my:Property my:Name="ContentType" my:Value="text/xml"/>
          <my:Property my:Name="Value" my:Value="{Binding Source=object, Path=ConfigurationData}"/>
     </my:Properties>
</my:Control>
<!--End of dynamic download control -->

UocFileUpload

名称:UocFileUpload

说明:此控件包含一个文本框,显示要上传的本地文件的位置、浏览文件按钮和上传按钮。 当最终用户单击“浏览”按钮时,将显示 Windows 打开的文件窗口。 最终用户可以在本地驱动器上选择要上传的一个文件。 选择该文件后,文件的位置将显示在文本框中。 单击“上传”按钮后,文件将上传到客户端本地数据源。 文件内容尚未提交到服务器。 建议使用此控件的数据类型如下所示:格式化字符串(XML)或二进制类型。

注释

没有指示上传进度或状态。 将文件上传到本地数据源时,将清除文本框。

属性

  • 所有通用属性:有关这些属性的信息,请参阅 通用属性

  • :这是必需的属性。 它指定将数据上传到的服务器上的架构属性绑定。

  • ContentType:这是可选的字符串类型属性。 这是文件保存到服务器上的数据类型。 这可以设置为“文本”或“二进制”。 缺少该属性时,默认值为 Binary。

  • MaxFileSize:这是可选的字符串类型属性。 MaxFileSize 定义上传文件大小的大小。 默认情况下,如果缺少该属性,则最大大小为 1 兆字节(MB)。

  • PromptedForNoValue:这是可选的字符串类型属性。 它定义文件未上载时向用户显示的文本。

事件

  • FileUploaded:成功上传文件时发出此事件。

示例

UocFileUpload 控件

注释

若要使以下示例代码正常工作,必须创建一个名为 ABinaryAttribute 的新二进制类型属性,然后在自定义资源类型和此属性之间创建新的绑定。

以下代码段生成上传控件:

<!--Sample dynamic upload control-->
<my:Control my:Name="SampleDynamicFileUploadControl" my:TypeName="UocFileUpload" my:Caption="{Binding Source=schema, Path=ABinaryAttribute.DisplayName, Mode=OneWay}" my:Description="{Binding Source=schema, Path=ABinaryAttribute.Description, Mode=OneWay}” my:RightsLevel="{Binding Source=rights, Path=ABinaryAttribute}">
     <my:Properties>
          <my:Property my:Name="Required" my:Value="{Binding Source=schema, Path=ABinaryAttribute.Required}"/>
          <my:Property my:Name="ContentType" my:Value="Binary"/>
          <my:Property my:Name="Value" my:Value="{Binding Source=object, Path=ABinaryAttribute, Mode=TwoWay}"/>
     </my:Properties>
</my:Control>
<!--End of dynamic upload control -->

UocFilterBuilder

名称:UocFilterBuilder

说明:这是一个复杂的控件,允许用户呈现 MIM 2016 XPath 表达式。 不支持某些 XPath 表达式。 有关如何使用筛选器生成器的信息,请参阅筛选器生成器的帮助。

属性

  • 所有通用属性:有关这些属性的信息,请参阅 通用属性

  • PermittedObjectTypes:这将定义要在筛选器生成器的选择语句中显示的资源类型列表。 有关如何使用筛选器生成器的信息,请参阅筛选器生成器帮助。 该字符串采用 ResourceTypeA、ResourceTypeB 的格式,其中每个资源类型都用逗号“,”分隔。

  • :这是呈现筛选器生成器的值。 仅支持包含 XPath 表达式的字符串类型数据的绑定。 Filter 属性是用于绑定此控件的建议属性。

  • PreviewButtonVisible:这是可选的布尔类型属性。 当此属性设置为 false 时,用户看不到“预览”按钮。 默认值设置为 true。 此按钮可与列表视图控件结合使用,以预览 XPath 表达式的结果。

  • ExcludeGroupMembership:这是一个布尔属性。 如果此属性设置为 true,则无法创建使用 <引用属性>(例如 ResourceID)的筛选器是 <Group 对象>的成员。 换句话说,如果此属性设置为 true,则无法创建使用组成员身份目录的筛选器。

  • PreviewButtonCaption:这是一个可选字符串。 当 PreviewButtonVisible 设置为 true 时,可以使用此属性为按钮提供自定义文本。 文本显示在“预览”按钮上。

事件

  • OnFilterChanged:筛选器生成器内容更改时会触发此事件。

示例

UocFilterBuilder 控件

以下示例代码包括 UOCLabel 控件、具有 PermittedObjectTypes 的简单筛选器生成器和预览列表视图。 将列表视图 ListFilter 属性和筛选器生成器 Value 属性指向同一数据源属性以链接这两个属性。

注释

使用此示例代码之前,请在现有 Filter 属性和自定义资源类型之间创建新的绑定。

<!--Sample filter builder with preview list-->
<my:Control my:Name="ComplexFilterBuilderLabel" my:TypeName="UocLabel" my:ExpandArea="true">
     <my:Properties>
          <my:Property my:Name="Text" my:Value="This is a Filter Builder with preview."/>
     </my:Properties>
</my:Control>
<my:Control my:Name="ComplexFilterBuilder" my:TypeName="UocFilterBuilder" my:RightsLevel="{Binding Source=rights, Path=Filter}" my:ExpandArea="true">
     <my:Properties>
          <my:Property my:Name="PermittedObjectTypes" my:Value="Person,Group" />
          <my:Property my:Name="Value" my:Value="{Binding Source=object, Path=Filter, Mode=TwoWay}" />
          <my:Property my:Name="Required" my:Value="{Binding Source=schema, Path=Filter.Required, Mode=OneWay}" />
     </my:Properties>
</my:Control>
<my:Control my:Name="FilterBuilderwithpreview" my:TypeName="UocListView" my:ExpandArea="true">
     <my:Properties>
          <my:Property my:Name="ColumnsToDisplay" my:Value="DisplayName,ObjectType,AccountName" />
          <my:Property my:Name="EmptyResultText" my:Value="There is no members according to the filter definition." />
       <my:Property my:Name="PageSize" my:Value="10" />
       <my:Property my:Name="ShowTitleBar" my:Value="false" />
       <my:Property my:Name="ShowActionBar" my:Value="false" />
       <my:Property my:Name="ShowPreview" my:Value="false" />
       <my:Property my:Name="ShowSearchControl" my:Value="false" />
       <my:Property my:Name="EnableSelection" my:Value="false" />
       <my:Property my:Name="SingleSelection" my:Value="false" />
       <my:Property my:Name="ItemClickBehavior" my:Value=" ModelessDialog "/>
       <my:Property my:Name="ListFilter" my:Value="{Binding Source=object, Path=Filter}" />
     </my:Properties>
</my:Control>
<!--end of sample filter builder with preview-->

UocHtmlSummary

名称: UocHtmlSummary

说明:可以使用此控件在 RCDC 页中定义摘要页。 此摘要页显示在最终用户提交请求之后。 此控件只能在摘要分组中使用,并且它必须是唯一的控件。 强烈建议使用提供的示例代码。

注释

此控件尚未经过广泛测试。

属性

  • 所有通用属性:有关这些属性的信息,请参阅 通用属性

  • ModificationsXml:此属性的格式必须为 {Binding Source=delta, Path=DeltaXml},其中 delta 是在配置标头 ObjectDataSource 中定义的。

  • TransformXsl:此属性的格式设置为 {Binding Source=summaryTransformXsl, Path=/},其中 summaryTransformXsl 在配置标头 XmlDataSource 中定义。

事件

  • 此控件没有事件。

示例

有关此控件的示例,请参阅本文档的 Grouping 元素部分中的摘要分组示例。

名称:UocHyperLink

说明:这是一个简单的超链接控件。 可以使用此控件将信息显示为超链接。

属性

  • 所有通用属性:有关这些属性的信息,请参阅 通用属性

  • ObjectReference:这是可选的引用类型属性。 如果 GUID 引用了此属性中定义的有效资源,则超链接为最终用户提供了访问资源的方法。 这与 NavigateUrl 属性互斥。

  • 文本:这是可选的字符串类型属性。 使用此属性定义显示为超链接的文本。

  • NavigateUrl:这是可选的字符串类型属性。 使用此属性定义超链接链接到的完整路径 URL。 这与 ObjectReference 属性互斥。

事件

  • 此控件没有事件。

示例

UocHyperLink 控件

注释

需要资源的有效 GUID 才能链接到该资源。 在这种情况下,第二个超链接是使用有效的 GUID 生成的。 第一个网站可以是任何网站。

以下代码段生成重定向超链接:

<!--Sample for a hyperlink that redirects page.-->
<my:Control my:Name="RedirectHyperlink" my:TypeName="UocHyperLink" my:Caption="Redirect Hyperlink" my:Description="This is a hyperlink that takes you to other pages.">
     <my:Properties>
          <my:Property my:Name="NavigateUrl" my:Value="http://www.microsoft.com"/>
          <my:Property my:Name="Text" my:Value="Microsoft Home Page"/>
     </my:Properties>
</my:Control>
<!--End of Sample for a hyperlink that redirect page-->

以下代码段生成引用资源的超链接。 显式引用可由表达式 {Binding Source=object, Path=Creator} 替换,以将其与数据源绑定。 仅当资源的管理器存在并且它为引用类型值时,这才有效。

<!--Sample for a hyperlink that reference object-->
<my:Control my:Name="ReferenceHyperlink" my:TypeName="UocHyperLink" my:Caption="Reference Hyperlink" my:Description="This is a hyperlink gives you an object view of the reference object">
     <my:Properties>
          <my:Property my:Name="ObjectReference" my:Value="e4e048b1-9e43-415e-806c-cf44c429c34c"/>
          <my:Property my:Name="Text" my:Value="View a group in FIM 2010."/>
     </my:Properties>
</my:Control>
<!--End of Sample for a hyperlink that reference object-->

UocIdentityPicker

名称:UocIdentityPicker

说明:此控件由可选的“解析”框和“浏览”窗口组成。 可选“解析”框包含一个可选文本框,用于输入标识、用于解析标识的“解析”按钮和一个“浏览”按钮来提示弹出的“浏览”窗口。 通过“浏览”窗口,用户可以通过列表视图控件选择标识。 “浏览”窗口中的所选标识反映在“解析”框中。

属性

  • 所有通用属性:有关这些属性的信息,请参阅 通用属性

  • UsageKeywords:这是可选的字符串属性。 可以通过提供 SearchScopeConfiguration 结构支持的使用情况关键字列表来定义要在资源选取器中使用的搜索范围列表,其中每个关键字由撇号(')分隔。

  • 筛选器:这是可选的字符串属性。 用户提供一个 XPath 表达式来限定资源选取器的范围,以仅显示符合定义的作用域内的项。 此属性与 UsageKeywords 属性互斥。 应用搜索范围后,此属性不起作用。

  • ResultObjectType:这是可选的字符串属性。 资源类型用于在弹出对话框列表中呈现资源。 这与筛选器一起使用,以帮助标识选取器识别筛选器返回的资源类型,并相应地呈现数据。 此属性与 UsageKeywords 属性互斥。 应用搜索范围时,这不起作用。 此属性接受的字符串是任何单个有效资源类型名称,例如 Person。 当筛选器应返回多个资源类型时,将使用资源。

  • PreviewTitle:这是列表视图上使用的预览标题。 有关此属性的信息,请参阅 UocListView 部分。

  • ListViewTitle:这是可选的字符串属性。 可以使用此属性将列表视图顶部显示的文本定义为标题。

  • :这是可选的字符串属性。 建议将此值与架构属性绑定,以将值与数据源连接。

  • 模式:这是可选的字符串属性。 使用此属性可以定义是否可以由标识选取器选择一个值,还是可以选择多个标识。 SingleResult 和 MultipleResult 是允许的值。 默认情况下,它设置为 SingleResult。

  • ObjectTypes:这是可选的字符串类型属性。 可以定义最终用户可以在“标识选取器解析程序解析”框中针对的资源类型列表。 该列表由一个由逗号“,”分隔的资源类型名称列表组成。

  • AttributesToSearch:这是可选的字符串类型属性。 可以定义一个属性列表,用于解析标识选取器中的项,其中列表是架构属性的列表,用逗号“,”分隔。 例如,如果将 AttributesToSearch 设置为 DisplayName, Alias,则用户可以使用 DisplayName = \<search value\>Alias=\<search value\>搜索项。 此处输入的属性名称应该是在 Value 属性中指定的数据源的目标资源类型上的有效属性。 可以在 ObjectTypes 字段中找到目标资源类型。 所有属性都必须对 ObjectTypes 字段中引用的任何给定资源类型有效。

  • ColumnsToDisplay:这是可选的字符串类型属性。 用户提供架构属性名称列表,用逗号“,”分隔。 此处定义的属性构成标识选取器中列表视图的列。

  • :这是可选的整数属性。 仅当模式设置为 MultipleResult 时,它才有效。 使用此属性可将“解析”文本框的高度设置为字符单位中的给定大小。

  • MainSearchScreenText:这是可选的字符串类型属性。 这是搜索在“浏览”窗口中运行时显示的自定义文本。

事件

  • SelectedObjectChanged:当用户更改所选资源时,将发出此事件。

示例

SingleResult 模式下的 UocIdentityPicker 控件

注释

若要使此示例正常工作,必须在 Manager 属性与此 XML 适用的任何自定义资源类型之间创建新的绑定。

以下代码段使用 Filter 和 ResultObjectType 属性作为 RCDC 的一部分,在 SingleResult 模式下生成标识选取器:

<!--Sample for a single-selection identity picker using Filter and Result Object Type-->
<my:Control my:Name="SingleSelectionIdentityPicker" my:TypeName="UocIdentityPicker" my:Caption="A Single Selection Identity Picker" my:Description="The user is allowed to select only one entry here." my:RightsLevel="{Binding Source=rights, Path=Manager}">
     <my:Properties>
          <my:Property my:Name="Required" my:Value="{Binding Source=schema, Path=Manager.Required}"/>
          <my:Property my:Name="Mode" my:Value="SingleResult" />
          <!--Columns displayed in list view in pop-up window-->
          <my:Property my:Name="ColumnsToDisplay" my:Value="DisplayName, ObjectType" />
          <!--Identities will be resolved against following attribute in the resolve textbox when resolve button is clicked.-->
          <my:Property my:Name="AttributesToSearch" my:Value="DisplayName, AccountName" />
          <!--single valued reference type attribute is used to bind the control-->
          <my:Property my:Name="Value" my:Value="{Binding Source=object, Path=Manager , Mode=TwoWay}" />
          <!--Scoping the list explicitly to All Persons name contains letter "e"-->
          <my:Property my:Name="Filter" my:Value="/Person[contains(JobTitle, 'Manager')]"/>
          <!--Result object type specify the type is Person-->
          <my:Property my:Name="ResultObjectType" my:Value="Person"/>
          <my:Property my:Name="ListViewTitle" my:Value="Select only one entry" />
          <my:Property my:Name="PreviewTitle" my:Value="Entry selected:" />
     </my:Properties>
</my:Control>
<!--End of sample for a single-selection identity picker.-->

下图显示了 MultipleResult 模式下的标识选取器:

在 MultipleResult 模式下 UocIdentityPicker 控件

注释

若要使此示例代码正常工作,必须将 ExplicitMember 属性(多值引用属性)绑定到自定义资源类型。 使用 UsageKeyword 属性设置为 Person 和 Group 创建搜索范围。

以下代码段在 MultipleResult 模式下创建标识选取器:

<!--Sample for a multiselection Identity Picker uses Search Scope-->
<my:Control my:Name="multiSelectionIdentityPicker" my:TypeName="UocIdentityPicker" my:Caption="A multi Selection Identity Picker" my:Description="The user is allowed to select more than one entry here" my:RightsLevel="{Binding Source=rights, Path=ExplicitMember}">
     <my:Properties>
          <my:Property my:Name="Required" my:Value="{Binding Source=schema, Path=ExplicitMember.Required}"/>
          <my:Property my:Name="Mode" my:Value="MultipleResult" />
          <my:Property my:Name="Rows" my:Value="10" />
          <!--There are existing search scopes that has key word "Person" and "Group" use both sets of search scopes here.-->
          <my:Property my:Name="UsageKeywords" my:Value="Person,Group"/>
          <!--Columns displayed in list view in pop-up window-->
          <my:Property my:Name="ColumnsToDisplay" my:Value="DisplayName, ObjectType" />
          <!--Identities will be resolved against following attribute in the resolve textbox when resolve button is clicked.-->
          <my:Property my:Name="AttributesToSearch" my:Value="DisplayName, AccountName" />
          <!--multi valued reference type attribute is used to bind the control-->
          <my:Property my:Name="Value" my:Value="{Binding Source=object, Path=ExplicitMember , Mode=TwoWay}" />
          <my:Property my:Name="ResultObjectType" my:Value="Resource"/>
          <my:Property my:Name="ListViewTitle" my:Value="Select multiple entries" />
          <my:Property my:Name="PreviewTitle" my:Value="Entries selected" />
     </my:Properties>
</my:Control>
<!--End of sample for a multiselection Identity Picker.-->

UocLabel

名称:UocLabel

说明:这是一个简单的只读文本标签控件。 建议使用此控件来显示只读数据。

属性

  • 所有通用属性:有关这些属性的信息,请参阅 通用属性

  • 文本:这是字符串类型属性。 通过提供显式字符串值或将其与数据源绑定来定义此属性。 分配此属性值的示例绑定是 {Binding Source=object, Path=<有效的属性名称>。

有关 UocLabel 控件的示例,请参阅“简单控件示例”部分中的简单控件。

UocListView

名称:UocListView

说明:这是高级列表视图控件。 它包括一个简单的列表视图、一个可选的简单搜索、一个可选的高级搜索控件、一个可选的选择预览框和一个作按钮栏。 可选的简单搜索包括搜索范围和简单的搜索文本框。 高级搜索控件是筛选器生成器。 列表视图显示预呈现的资源列表。 它还可以显示来自此控件中的搜索控件的搜索结果。 “作按钮”栏根据列表视图中的选择定义可以执行的作。 “选择预览”框显示从列表视图中选择哪些项。

重要

UocListView 不适用于单值引用属性。 它只能与多值引用属性一起使用。 有关单值引用属性,请参阅本文档中的 UocIdentityPicker。

属性

  • 所有通用属性:有关这些属性的信息,请参阅 通用属性

  • SelectedValue:这是一个可选的字符串类型属性,该属性绑定到接受 GUID 格式字符串列表的多值引用属性。

  • PageSize:这是可选的整数属性。 用户可以指定列表视图控件中一页中容纳的条目数。 默认值为 10 个条目。 任何正整数都有效。

  • UsageKeyword:这是可选的字符串类型属性。 用户可以指定用于定义列表视图搜索控件中使用的搜索范围的关键字列表。 FIM 2010 服务器中有搜索范围资源。 SearchScopeConfiguration 结构(称为 UsageKeyword)上的属性用于对一组搜索范围进行分组。 列表视图使用该关键字列表。 每个关键字用逗号(,)分隔。 这是要在此列表视图中显示的相应搜索范围上使用的用法关键字。 仅当 ShowSearchControl 属性设置为 true 时,才会生效。

  • SearchControlAutoPostback:这是可选的布尔属性。 将此属性的值设置为 true,以在触发搜索时执行自动回发。 默认情况下,SearchControlAutoPostback 设置为 false。

  • EmptyResultText:这是可选的字符串类型属性。 默认情况下,它设置为“无项”,但可以设置为任何字符串值。 当搜索结果为空时,将显示此文本。

  • ButtonHeight:这是可选的整数类型属性。 将此属性的值设置为任何正整数值。 此属性定义作栏中按钮的高度(以像素为单位)。 默认值为 32 像素。

  • ButtonWidth:这是可选的整数类型属性。 将此属性的值设置为任何正整数值。 此属性定义作栏中按钮的宽度(以像素为单位)。 默认值为 32 像素。

  • CaptionImageMaxHeight:这是可选的整数类型属性。 将此属性的值设置为任何正整数。 此属性定义可选标题的最大图标高度。 默认值为 32 像素。

  • CaptionImageMaxWidth:这是可选的整数类型属性。 将此属性的值设置为任何正整数。 此属性定义可选标题的最大图标宽度。 默认值为 32 像素。

  • CaptionImageUrl:这是可选的字符串类型属性。 此属性定义链接到标题图像的图像的 URL。

  • PreviewTitle:这是可选的字符串类型属性。 使用此属性定义选择预览框顶部显示的文本。

  • EnableSelection:这是可选的布尔类型属性。 使用此属性可定义列表视图是否处于选择模式。 如果列表视图处于选择模式,则列表视图最左侧的一列将显示一列复选框,而选择预览框显示在列表视图的底部。 此属性的默认值设置为 true。

  • SingleSelection:这是可选的布尔类型属性。 如果为列表视图打开选择模式,则此值设置为 true 会限制最终用户仅从列表中选择一个项目。 默认情况下,此属性的值设置为 false。 这意味着,默认情况下,最终用户可以从列表中选择多个项。

  • RedirectUrl:这是可选的字符串类型属性。 使用此属性指定要在列表中单击超链接项时重定向到的页面。 此 URL 可以包含在运行时替换为实际值的占位符。 占位符如下所示:

    • {0} objectType
    • {1} objectID
    • {2} displayName
  • ShowTitleBar:这是可选的布尔类型属性。 使用此属性可指定标题栏是否应可见。 此属性的默认值为 false。

  • ShowActionBar:这是可选的布尔类型属性。 使用此属性可指定作栏区域是否应可见。 此属性的默认值为 true。

  • ShowPreview:这是可选的布尔类型属性。 使用此属性可指定预览区域是否应可见。 此属性的默认值为 true。

  • ShowSearchControl:这是可选的布尔类型属性。 使用此属性可指定搜索控件是否应可见。 此属性的默认值为 true。

  • ResultObjectType:这是可选的字符串类型属性。 使用此属性可指定搜索结果的预期对象类型。 此属性的默认值为 Resource。 如果搜索结果包含多个资源类型,则应将此值指定为 Resource。

  • ColumnsToDisplay:这是一个可选属性。 使用此属性可以指定希望列表视图显示为列的属性。 此属性的默认值为 DisplayName、ResourceType。 每个列都由属性的系统名称表示。 每列用逗号“,”分隔。 在选择模式下使用列表视图时,不必为此属性指定值。 在选择模式下,列设置来自当前所选搜索范围的 SearchScopeColumn 属性。

  • ListFilter:这是可选的字符串类型属性。 这是用于呈现列表视图的 xpath,仅在 ShowSearchControl 属性设置为 false 时有效。 指定此值后,列表视图将此属性用于查询,列表视图不在选择模式下。 筛选器可以绑定到资源的字符串属性:

    <my:Property my:Name="ListFilter" my:Value="{Binding Source=object, Path=Filter}"/>

    或为包含一些预定义环境变量的字符串:

    <my:Property my:Name="ListFilter" my:Value="/Approval[Request=''%ObjectID%'']"/>

  • TargetAttribute:这是一个过时的属性。 其值应为多值引用属性的系统名称。 建议不再使用此属性。 例如,在组管理中,而不是使用:

    <my:Property my:Name="TargetAttribute" my:Value="ExplicitMember"/>

    用:

    <my:Property my:Name=”ListFilter” my:Value=”/Group[ObjectID=’%ObjectID%’]/ExplicitMember”/>

  • ItemClickBehavior:这是可选的字符串类型属性。 使用此属性可以指定是要单击列表视图项来触发服务器回发还是显示项的详细信息视图。 支持两个选项值:ModelessDialog 和 Server。 默认值为 ModelessDialog。

  • SearchOnLoad:这是一个可选的布尔类型属性,用于指定列表视图控件是否应在加载时查询。 仅当列表视图处于选择模式时,此属性才适用。 此属性的默认值为 true。 如果希望用户通常会在搜索中键入文本以获取有意义的结果,则可以将其关闭。 在这种情况下,列表视图最初显示一条消息,告知用户如何执行搜索。 可以通过以下属性自定义文本:

  • MainSearchScreenText:仅当 SearchOnload 设置为 true 时,此可选字符串类型属性才适用。 此属性可用于在列表视图不自动搜索时自定义在列表视图中间显示的文本。 此属性的默认值是使用搜索查找资源,如前所述。 可以指定一个值,使文本与方案更相关。

  • SubSearchScreenText:此可选字符串类型属性用于自定义 MainSearchScreenText 属性后显示的文本。 通常,无需为此属性指定值,除非要添加有关如何使用列表视图的其他说明。

事件

  • 此控件没有事件。

示例

有关如何将列表视图与 UocFilterBuilder 控件一起使用作为预览列表的示例,请参阅本文档前面的 UocFilterBuilder 示例。 还可以在没有筛选器生成器的情况下使用 UocListView。

UocNumericBox

名称:UocNumericBox

说明:这是一个简单的文本框,它只接受整数值。 此控件支持只读模式和可更新模式。

属性

  • 所有通用属性:有关这些属性的信息,请参阅 通用属性

  • MaxValue:这是可选的整数类型属性。 使用此属性定义控件的客户端验证。 最终用户输入的值不能超过此值。 可以使用 {Binding Source=schema, Path=IntegerMaximum} 输入显式整数或将此整数与数据源中的整数数据绑定。

  • MinValue:这是可选的整数类型属性。 使用此属性定义控件的客户端验证。 最终用户输入的值不能低于此值。 可以使用 {Binding Source=schema, Path=IntegerMinimum} 输入显式整数或将此整数与数据源中的整数数据绑定。

  • DefaultValue:这是可选的整数类型属性。 如果控件用于创建新数据,请使用此属性定义控件的默认值。 此值只能显式设置为静态整数。

  • :这是可选的整数类型属性。 将此属性与数据源中的整数类型数据绑定时,页面加载时会显示该属性的值,然后在提交后将其保存到数据源。

事件

  • TextChanged:当控件内的当前值发生更改时,将发出此事件。

示例

UocNumericBox 控件

注释

以下示例代码生成第一个数字框。 数字框未与数据源或任何架构信息连接。

<!--Sample for an explicit Numeric Box-->
<my:Control my:Name="SampleExplicitNumericBox" my:TypeName="UocNumericBox" my:Caption="An Explicit NumericBox" my:Description="This is a dummy numeric box that is not linked with data source.">
     <my:Properties>
          <my:Property my:Name="MinValue" my:Value="1"/>
          <my:Property my:Name="MaxValue" my:Value="100"/>
          <my:Property my:Name="DefaultValue" my:Value="1"/>
     </my:Properties>
</my:Control>
<!--End of sample for an explicit Numeric Box.-->

以下示例代码生成第二个数字框。

注释

若要使此示例正常工作,首先必须创建一个名为 AnIntegerAttribute 的新整数类型属性,并将其与自定义资源类型绑定。

<!--Sample for a dynamically rendered numeric box-->
<my:Control my:Name="SampleDynamicNumericBox" my:TypeName="UocNumericBox" my:Caption="{Binding Source=schema, Path=AnIntegerAttribute.DisplayName}" my:Description="{Binding Source=schema, Path=AnIntegerAttribute.Description}" my:RightsLevel="{Binding Source=rights, Path=AnIntegerAttribute}">
     <my:Properties>
          <my:Property my:Name="MaxValue" my:Value="{Binding Source=schema, Path=AnIntegerAttribute.IntegerMaximum}"/>
          <my:Property my:Name="MinValue" my:Value="{Binding Source=schema, Path=AnIntegerAttribute.IntegerMinimum}"/>
          <my:Property my:Name="DefaultValue" my:Value="1"/>
          <my:Property my:Name="Value" my:Value="{Binding Source=object, Path=AnIntegerAttribute, Mode=TwoWay}"/>
          <my:Property my:Name="Required" my:Value="{Binding Source=schema, Path=AnIntegerAttribute.Required}"/>
     </my:Properties>
</my:Control>
<!--End of sample for a dynamically numeric box.-->

UocPictureBox

名称:UocPictureBox

说明:此控件用于呈现图片、二进制类型数据。 建议将此控件与二进制类型数据一起使用。 图片可由提供的图像 URL、二进制类型数据或包含图片类型数据的属性源呈现。

属性

  • 所有通用属性:有关这些属性的信息,请参阅 通用属性

  • ImageUrl:这是可选的字符串类型属性。 输入目标图片的 URL。

  • MaxHeight:这是可选的字符串类型属性。 它定义要以像素为单位呈现的图像的最大高度。

  • MaxWidth:这是可选的字符串类型属性。 它定义要以像素为单位呈现的图像的最大宽度。

  • ImageData:这是二进制类型属性。 使用此属性可将数据源与显示的图像绑定。 绑定数据源必须是二进制数据源。 还可以使用此字段通过以字节[] 格式提供数据来显式设置图片。

  • ImageResource:这是可选的二进制类型属性。

  • AlternativeText:这是可选的字符串类型属性。 当无法显示图片时,此属性显示为可选文本。

事件

  • 此控件没有事件。

示例

注释

若要使用此示例,必须具有与控件绑定的现有图像数据。

以下代码段生成将数据源与控件绑定的图片框控件:

<!--Sample for a Picture Box control binding with a data source-->
<my:Control my:Name="SamplePictureBoxImageData" my:TypeName="UocPictureBox" my:RightsLevel="{Binding Source=rights, Path=Photo}">
     <my:Properties>
          <my:Property my:Name="MaxHeight" my:Value="100" />
          <my:Property my:Name="MaxWidth" my:Value="100" />
          <my:Property my:Name="ImageData" my:Value="{Binding Source=object, Path=Photo}" />
     </my:Properties>
</my:Control>
<!--End of Sample for a Picture Box control-->

以下代码段生成一个图片框控件,该控件将 URL 图像与控件绑定:

<!--Sample for a Picture Box control bind with explicit URL-->
<my:Control my:Name="SamplePictureBoxImageUrl" my:TypeName="UocPictureBox">
     <my:Properties>
          <my:Property my:Name="MaxHeight" my:Value="100" />
          <my:Property my:Name="MaxWidth" my:Value="100" />
          <my:Property my:Name="ImageUrl" my:Value="http://www.microsoft.com/dummypicture.jpg" />
     </my:Properties>
</my:Control>
<!--End of Sample for a Picture Box control-->

UocRadioButtonList

名称: UocRadioButtonList

说明:这是一个简单的选项按钮列表。 这些选项在此列表中互斥。 当用户有五个或更少的选项可供选择时,建议使用此控件。 否则,建议使用 UOCListView。

属性

  • 所有通用属性:有关这些属性的信息,请参阅 通用属性

  • ValuePath:值路径设置为“值”。 它与 Option 元素中的 Value 字段绑定,如本节中所述。

  • CaptionPath:值路径设置为 Caption。 它与 Option 元素中的 Caption 字段绑定,如本节中所述。

  • HintPath:值路径设置为 Hint。 它与 Option 元素中的 Hint 字段绑定,如本节中所述。

  • SelectedValue:当前选择的值。 这是必需的字符串类型属性。 此属性与数据源中的字符串数据绑定。

事件

  • SelectedIndexChanged:所选单选按钮更改时发生该事件。

  • CheckedChanged:当单选按钮更改其状态时,将发出此事件。

选项

只有两个 选项 元素作为此控件的选项。 有关 Options 元素的结构,请参阅 Options 元素

  • :单个 Option 元素中的“值”字段必须设置为 True 或 False。

  • 标题:可以是任何字符串值。

  • 提示:可以是任何字符串值。

示例

UocRadioButtonList 控件

注释

若要使此示例正常工作,必须创建新的布尔属性 ABooleanAttribute,并将其与自定义资源类型绑定。

以下代码段创建选项按钮列表:

<!--Sample for option button list control-->
<my:Control my:Name="SampleRadioButtonList" my:TypeName="UocRadioButtonList" my:Caption="{Binding Source=schema, Path=ABooleanAttribute.DisplayName}" my:Description="{Binding Source=schema, Path=ABooleanAttribute.Description}" my:RightsLevel="{Binding Source=rights, Path=ABooleanAttribute}">
     <my:Options>
          <my:Option my:Value="False" my:Caption="Set Value To False" my:Hint="By selecting this option, you are setting the value of the attribute to false." />
          <my:Option my:Value="True" my:Caption="Set Value To True" my:Hint="By selecting this option, you are setting the value of the attribute to true." />
     </my:Options>
     <my:Properties>
          <my:Property my:Name="Required" my:Value="{Binding Source=schema, Path=ABooleanAttribute.Required}" />
          <my:Property my:Name="ValuePath" my:Value="Value" />
          <my:Property my:Name="CaptionPath" my:Value="Caption" />
          <my:Property my:Name="HintPath" my:Value="Hint" />
          <my:Property my:Name="SelectedValue" my:Value="{Binding Source=object, Path=ABooleanAttribute, Mode=TwoWay}" />
     </my:Properties>
</my:Control>
<!--End of Sample for option button list control-->

UocSimpleRadioButton

名称:UocSimpleRadioButton

说明:这是一个简单的选项按钮控件。 此控件的使用类似于简单的复选框。 有两个选项按钮,与文本标记并排显示。 建议将控件绑定到布尔类型数据。

属性

  • 所有通用属性:有关这些属性的信息,请参阅 通用属性

  • TrueText:这是可选的字符串类型属性。 这是选择选项按钮时显示的文本。

  • FalseText:这是可选的字符串类型属性。 这是未选择选项按钮时显示的文本。

  • SelectedItem:这是可选的布尔类型属性。 此值指示已选择选项按钮。 这可以与数据源中的布尔类型数据绑定。 默认值设置为 false。

事件

  • CheckedChanged:当选项按钮将状态从选定更改为未选中或相反时,将发出此信号。

示例

UocSimpleRadioButton 控件

注释

若要使示例正常工作,必须创建新的布尔属性 ABooleanAttribute 并将其绑定到自定义资源类型。 RCDC 数据应用于同一自定义资源类型。

以下代码段生成选项按钮:

<!--Sample for simple option button control-->
<my:Control my:Name="SampleSimpleRadioButton" my:TypeName="UocSimpleRadioButton" my:Caption="{Binding Source=schema, Path=ABooleanAttribute.DisplayName}" my:Description="{Binding Source=schema, Path=ABooleanAttribute.Description}" my:RightsLevel="{Binding Source=rights, Path=ABooleanAttribute}">
     <my:Properties>
          <my:Property my:Name="Required" my:Value="{Binding Source=schema, Path=ABooleanAttribute.Required}" />
          <my:Property my:Name="FalseText" my:Value="False"/>
          <my:Property my:Name="TrueText" my:Value="True"/>
          <my:Property my:Name="SelectedItem" my:Value="{Binding Source=object, Path=ABooleanAttribute, Mode=TwoWay}" />
     </my:Properties>
</my:Control>
<!--End of Sample for simple option button control-->

UocTextBox

名称:UocTextBox

说明:这是支持字符串类型输入的简单文本框。 建议使用此控件与字符串类型数据绑定。

属性

  • 所有通用属性:有关这些属性的信息,请参阅 通用属性

  • MaxLength:这是可选的整数类型属性。 此属性指定字符串输入的最大长度。 此属性的默认值为 128 个字符。

  • 文本:这是可选的字符串类型属性。 这是显示在文本框中的文本。 可以在控件的初始加载过程中定义显示在文本框中的显式字符串,或将其绑定到字符串类型的架构属性。

  • :这是可选的整数类型属性。 此属性以字符单位定义文本框的高度。 默认值为一个字符。

  • :这是可选的整数类型属性。 此属性以字符单位定义文本框的宽度。 默认值为 20 个字符。

  • 包装:这是可选的布尔类型属性。 通过将此属性的值设置为 true,用户将在文本框中启用“自动换行”功能。 此属性的默认值设置为 true。

  • UniquenessValidationXPath:这是可选的字符串类型属性。 它采用有效的 FIM XPath 筛选器表达式,并确保用户输入的值在筛选器范围内的资源中是唯一的。 例如,若要确保请求的用户显示名称在 FIM 服务 DB 的所有已启用邮件的安全组中是唯一的,请使用 XPath /Group[DisplayName=’%VALUE%’ and Type=’MailEnabledSecurity’。 当用户离开页面时,将执行验证作。 此属性仅在 RCDC 中受支持,用于创建资源。

  • UniquenessErrorMessage:这是可选的字符串类型属性。 如果 UniquenessValidationXPath 验证失败,并且可以是显式文本或字符串资源变量,则此字符串用于显示错误消息。 如果未指定此属性,则失败验证的默认错误消息为“%VALUE% 已存在。 请尝试其他方法。

事件

  • TextChanged:更改文本框内的文本时发出此事件。

示例

有关此控件的完整示例,请参阅“简单控件示例”部分。


附录 A:默认 XSD 架构

本部分显示与 Microsoft Identity Manager 2016 SP1 一起提供的所有默认 RCD 的完整 XSD 架构。

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<xsd:schema targetNamespace="http://schemas.microsoft.com/2006/11/ResourceManagement" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:my="http://schemas.microsoft.com/2006/11/ResourceManagement" xmlns:xd="http://schemas.microsoft.com/office/infopath/2003" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <xsd:attribute name="TypeName" type="my:requiredString"/>
    <xsd:attribute name="Name" type="my:requiredAlphanumericString"/>
    <xsd:attribute name="Parameters" type="xsd:string"/>
    <xsd:attribute name="DisplayAsWizard" type="xsd:boolean"/>
    <xsd:attribute name="Caption" type="xsd:string"/>
    <xsd:attribute name="AutoValidate" type="xsd:boolean"/>
    <xsd:attribute name="Enabled" type="xsd:string"/>
    <xsd:attribute name="Visible" type="xsd:string"/>
    <xsd:attribute name="IsSummary" type="xsd:boolean"/>
    <xsd:attribute name="IsHeader" type="xsd:boolean"/>
    <xsd:attribute name="HelpText" type="xsd:string"/>
    <xsd:attribute name="Link" type="xsd:string"/>
    <xsd:attribute name="Description" type="xsd:string"/>
    <xsd:attribute name="ExpandArea" type="xsd:boolean"/>
    <xsd:attribute name="Hint" type="xsd:string"/>
    <xsd:attribute name="AutoPostback" type="xsd:string"/>
    <xsd:attribute name="RightsLevel" type="my:requiredString"/>
    <xsd:attribute name="Value" type="xsd:string"/>
    <xsd:attribute name="Handler" type="my:requiredString"/>
    <xsd:attribute name="ImageUrl" type="xsd:string"/>
    <xsd:attribute name="RedirectUrl" type="xsd:string"/>
    <xsd:attribute name="ClickBehavior" type="xsd:string"/>
    <xsd:attribute name="EnableMode" type="xsd:string"/>
    <xsd:attribute name="ValueType" type="xsd:string"/>
    <xsd:attribute name="Condition" type="xsd:string"/>
    <xsd:element name="ObjectControlConfiguration">
        <xsd:complexType>
            <xsd:sequence>
                <xsd:element ref="my:ObjectDataSource" minOccurs="0" maxOccurs="32"/>
                <xsd:element ref="my:XmlDataSource" minOccurs="0" maxOccurs="32"/>
                <xsd:element ref="my:Panel"/>
                <xsd:element ref="my:Events" minOccurs="0" maxOccurs="1"/>
            </xsd:sequence>
            <xsd:attribute ref="my:TypeName"/>
            <xsd:anyAttribute processContents="lax" namespace="http://www.w3.org/XML/1998/namespace"/>
        </xsd:complexType>
    </xsd:element>
    <xsd:element name="ObjectDataSource">
        <xsd:complexType>
            <xsd:sequence/>
            <xsd:attribute ref="my:TypeName"/>
            <xsd:attribute ref="my:Name"/>
            <xsd:attribute ref="my:Parameters"/>
        </xsd:complexType>
    </xsd:element>
    <xsd:element name="XmlDataSource">
        <xsd:complexType  mixed="true">
      <xsd:sequence>
        <xsd:any minOccurs="0" maxOccurs="unbounded" processContents="lax"/>
      </xsd:sequence>
      <xsd:attribute ref="my:Name"/>
      <xsd:attribute ref="my:Parameters"/>
        </xsd:complexType>
    </xsd:element>
    <xsd:element name="Panel">
        <xsd:complexType>
            <xsd:sequence>
                <xsd:element ref="my:Grouping" minOccurs="1" maxOccurs="16"/>
            </xsd:sequence>
            <xsd:attribute ref="my:Name"/>
            <xsd:attribute ref="my:DisplayAsWizard"/>
            <xsd:attribute ref="my:Caption"/>
            <xsd:attribute ref="my:AutoValidate"/>
        </xsd:complexType>
    </xsd:element>
    <xsd:element name="Grouping">
        <xsd:complexType>
            <xsd:sequence>
                <xsd:element ref="my:Help" minOccurs="0"  maxOccurs="1"/>
                <xsd:element ref="my:Control" minOccurs="1" maxOccurs="256"/>
                <xsd:element ref="my:Events" minOccurs="0" maxOccurs="1"/>
            </xsd:sequence>
            <xsd:attribute ref="my:Name"/>
            <xsd:attribute ref="my:Caption"/>
            <xsd:attribute ref="my:Description"/>
            <xsd:attribute ref="my:Enabled"/>
            <xsd:attribute ref="my:Visible"/>
            <xsd:attribute ref="my:IsHeader"/>
            <xsd:attribute ref="my:IsSummary"/>
        </xsd:complexType>
    </xsd:element>
    <xsd:element name="Help">
        <xsd:complexType>
            <xsd:sequence/>
            <xsd:attribute ref="my:HelpText"/>
            <xsd:attribute ref="my:Link"/>
        </xsd:complexType>
    </xsd:element>
    <xsd:element name="Control">
        <xsd:complexType>
            <xsd:sequence>
                <xsd:element ref="my:Help" minOccurs="0"  maxOccurs="1"/>
                <xsd:element ref="my:CustomProperties" minOccurs="0"  maxOccurs="1"/>
                <xsd:element ref="my:Options" minOccurs="0"  maxOccurs="1"/>
                <xsd:element ref="my:Buttons" minOccurs="0"  maxOccurs="1"/>
                <xsd:element ref="my:Properties" minOccurs="0"  maxOccurs="1"/>
                <xsd:element ref="my:Events" minOccurs="0" maxOccurs="1"/>
            </xsd:sequence>
            <xsd:attribute ref="my:Name"/>
            <xsd:attribute ref="my:TypeName"/>
            <xsd:attribute ref="my:Caption"/>
            <xsd:attribute ref="my:Enabled"/>
            <xsd:attribute ref="my:Visible"/>
            <xsd:attribute ref="my:Description"/>
            <xsd:attribute ref="my:ExpandArea"/>
            <xsd:attribute ref="my:Hint"/>
            <xsd:attribute ref="my:AutoPostback"/>
            <xsd:attribute ref="my:RightsLevel"/>
        </xsd:complexType>
    </xsd:element>
    <xsd:element name="CustomProperties">
        <xsd:complexType mixed="true">
            <xsd:sequence>
                <xsd:any minOccurs="0" maxOccurs="unbounded" namespace="##targetNamespace" processContents="lax"/>
            </xsd:sequence>
        </xsd:complexType>
    </xsd:element>
    <xsd:element name="Options">
        <xsd:complexType>
            <xsd:sequence>
                <xsd:element ref="my:Option" minOccurs="0" maxOccurs="unbounded"/>
            </xsd:sequence>
            <xsd:attribute ref="my:ValueType"/>
        </xsd:complexType>
    </xsd:element>
    <xsd:element name="Option">
        <xsd:complexType>
            <xsd:simpleContent>
                <xsd:extension base="xsd:string">
                    <xsd:attribute ref="my:Value"/>
                    <xsd:attribute ref="my:Caption"/>
                    <xsd:attribute ref="my:Hint"/>
                </xsd:extension>
            </xsd:simpleContent>
        </xsd:complexType>
    </xsd:element>
    <xsd:element name="Buttons">
        <xsd:complexType>
            <xsd:sequence>
                <xsd:element ref="my:Button" minOccurs="1" maxOccurs="8"/>
            </xsd:sequence>
        </xsd:complexType>
    </xsd:element>
    <xsd:element name="Button">
        <xsd:complexType>
            <xsd:simpleContent>
                <xsd:extension base="xsd:string">
                    <xsd:attribute ref="my:Name"/>
                    <xsd:attribute ref="my:Caption"/>
                    <xsd:attribute ref="my:Hint"/>
                    <xsd:attribute ref="my:ImageUrl"/>
                    <xsd:attribute ref="my:ClickBehavior"/>
                    <xsd:attribute ref="my:RedirectUrl"/>
                    <xsd:attribute ref="my:Enabled"/>
                    <xsd:attribute ref="my:Visible"/>
                    <xsd:attribute ref="my:EnableMode"/>
                </xsd:extension>
            </xsd:simpleContent>
        </xsd:complexType>
    </xsd:element>
    <xsd:element name="Properties">
        <xsd:complexType>
            <xsd:sequence>
                <xsd:element ref="my:Property" minOccurs="1" maxOccurs="32"/>
            </xsd:sequence>
        </xsd:complexType>
    </xsd:element>
    <xsd:element name="Property">
        <xsd:complexType>
            <xsd:simpleContent>
                <xsd:extension base="xsd:string">
                    <xsd:attribute ref="my:Name"/>
                    <xsd:attribute ref="my:Value"/>
                    <xsd:attribute ref="my:Condition"/>                 
                </xsd:extension>
            </xsd:simpleContent>
        </xsd:complexType>
    </xsd:element>
    <xsd:element name="Events">
        <xsd:complexType>
            <xsd:sequence>
                <xsd:element ref="my:Event" minOccurs="1" maxOccurs="16"/>
            </xsd:sequence>
        </xsd:complexType>
    </xsd:element>
    <xsd:element name="Event">
        <xsd:complexType>
            <xsd:simpleContent>
                <xsd:extension base="xsd:string">
                    <xsd:attribute ref="my:Name"/>
                    <xsd:attribute ref="my:Handler"/>
          <xsd:attribute ref="my:Parameters"/>
        </xsd:extension>
            </xsd:simpleContent>
        </xsd:complexType>
    </xsd:element>
    <xsd:simpleType name="requiredString">
        <xsd:restriction base="xsd:string">
            <xsd:minLength value="1"/>
        </xsd:restriction>
    </xsd:simpleType>
  <xsd:simpleType name="requiredAlphanumericString">
    <xsd:restriction base="xsd:string">
      <xsd:pattern value="[A-Za-z0-9_]{1,128}"/>
    </xsd:restriction>
  </xsd:simpleType>
    <xsd:simpleType name="requiredAnyURI">
        <xsd:restriction base="xsd:anyURI">
            <xsd:minLength value="1"/>
        </xsd:restriction>
    </xsd:simpleType>
    <xsd:simpleType name="requiredBase64Binary">
        <xsd:restriction base="xsd:base64Binary">
            <xsd:minLength value="1"/>
        </xsd:restriction>
    </xsd:simpleType>
</xsd:schema>

附录 B:默认摘要 XSL

本部分显示Microsoft Identity Manager 2016 SP1 提供的完整摘要 XSL。

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:msxsl="urn:schemas-microsoft-com:xslt">
  <xsl:template name="output-attribute-value">
    <xsl:param name="attribute"/>
    <xsl:param name="type"/>
    <xsl:choose>
      <xsl:when test="$type='Binary'">
        <xsl:value-of select="$attribute" disable-output-escaping="yes"/>
      </xsl:when>
      <xsl:when test="$type='Text'">
        <xsl:text xml:space="preserve" disable-output-escaping="yes">(text data)</xsl:text>
      </xsl:when>
      <xsl:otherwise>
        <xsl:value-of select="translate($attribute,' ','&#160;')" disable-output-escaping="yes"/>
      </xsl:otherwise>
    </xsl:choose>
  </xsl:template>

  <xsl:template name="output-modified-value">
    <xsl:param name="name"/>
    <xsl:param name="attribute1"/>
    <xsl:param name="text1"/>
    <xsl:param name="attribute2"/>
    <xsl:param name="text2"/>
    <xsl:param name="type"/>
    <tr class="listViewRow" style="height:22px;">
      <xsl:if test="position() mod 2 != 0">
        <td class="commonSummaryListViewCellBR ms-vb">
          <xsl:value-of select="$name" disable-output-escaping="yes"/>
        </td>
        <xsl:choose>
          <xsl:when test="$attribute1 and $attribute1!=''">
            <td class="commonSummaryListViewCellBR ms-vb">
              <xsl:call-template name="output-attribute-value">
                <xsl:with-param name="attribute" select="$attribute1"/>
                <xsl:with-param name="type" select="$type"/>
              </xsl:call-template>
            </td>
          </xsl:when>
          <xsl:otherwise>
            <td class="commonSummaryListViewCellBR ms-vb">
              <xsl:copy-of select="$text1"/>
            </td>
          </xsl:otherwise>
        </xsl:choose>
        <xsl:choose>
          <xsl:when test="$attribute2 and $attribute2!=''">
            <td class="commonSummaryListViewCellBR ms-vb">
              <xsl:call-template name="output-attribute-value">
                <xsl:with-param name="attribute" select="$attribute2"/>
                <xsl:with-param name="type" select="$type"/>
              </xsl:call-template>
            </td>
          </xsl:when>
          <xsl:otherwise>
            <td class="commonSummaryListViewCellBR ms-vb">
              <xsl:copy-of select="$text2"/>
            </td>
          </xsl:otherwise>
        </xsl:choose>
      </xsl:if>
      <xsl:if test="position() mod 2 != 1">
        <td class="ms-alternating commonSummaryListViewCellBR ms-vb">
          <xsl:value-of select="$name" disable-output-escaping="yes"/>
        </td>
        <xsl:choose>
          <xsl:when test="$attribute1 and $attribute1!=''">
            <td class="ms-alternating commonSummaryListViewCellBR ms-vb">
              <xsl:call-template name="output-attribute-value">
                <xsl:with-param name="attribute" select="$attribute1"/>
                <xsl:with-param name="type" select="$type"/>
              </xsl:call-template>
            </td>
          </xsl:when>
          <xsl:otherwise>
            <td class="ms-alternating commonSummaryListViewCellBR ms-vb">
              <xsl:copy-of select="$text1"/>
            </td>
          </xsl:otherwise>
        </xsl:choose>
        <xsl:choose>
          <xsl:when test="$attribute2 and $attribute2!=''">
            <td class="ms-alternating commonSummaryListViewCellBR ms-vb">
              <xsl:call-template name="output-attribute-value">
                <xsl:with-param name="attribute" select="$attribute2"/>
                <xsl:with-param name="type" select="$type"/>
              </xsl:call-template>
            </td>
          </xsl:when>
          <xsl:otherwise>
            <td class="ms-alternating commonSummaryListViewCellBR ms-vb">
              <xsl:copy-of select="$text2"/>
            </td>
          </xsl:otherwise>
        </xsl:choose>
      </xsl:if>
    </tr>
  </xsl:template>

  <xsl:template name="output-localized-attribute-value">
    <xsl:param name="locale"/>
    <xsl:param name="attribute"/>
    <xsl:param name="type"/>
    <tr class="listViewRow" style="height:22px;">
      <xsl:if test="position() mod 2 != 0">
        <td class="commonSummaryListViewCellBR ms-vb">
          <xsl:value-of select="$locale" disable-output-escaping="yes"/>
        </td>
        <td class="commonSummaryListViewCellBR ms-vb">
          <xsl:call-template name="output-attribute-value">
            <xsl:with-param name="attribute" select="$attribute"/>
            <xsl:with-param name="type" select="$type"/>
          </xsl:call-template>
        </td>
      </xsl:if>
      <xsl:if test="position() mod 2 != 1">
        <td class="ms-alternating commonSummaryListViewCellBR ms-vb">
          <xsl:value-of select="$locale" disable-output-escaping="yes"/>
        </td>
        <td class="ms-alternating commonSummaryListViewCellBR ms-vb">
          <xsl:call-template name="output-attribute-value">
            <xsl:with-param name="attribute" select="$attribute"/>
            <xsl:with-param name="type" select="$type"/>
          </xsl:call-template>
        </td>
      </xsl:if>
    </tr>
  </xsl:template>

  <xsl:template match="/">
    <xsl:choose>
      <xsl:when test="ModifiedAttributes[@ActionType='Create']">
        <!-- expected XML
        <ModifiedAttributes ActionType="Create">
          <Attribute Name="[attribute's system name]" DisplayName="[attribute's display name]" DataType="[all kinds of ILM data type]" InitializedValue="[the value]"/>
          other <Attribute> elements
        </ModifiedAttributes>
        -->
        <table cellspacing="0" cellpadding="3" class="commonSummaryListViewGridBorder">
          <tr align="left" class="listViewHeader" style="height:22px;">
            <th class="commonSummaryListViewHeaderCellBR">Attribute</th>
            <th class="commonSummaryListViewHeaderCellBR">Value</th>
          </tr>
          <xsl:for-each select="ModifiedAttributes/Attribute">
            <xsl:sort select="@DisplayName" order="ascending"/>
            <tr class="listViewRow" style="height:22px;">
              <xsl:if test="position() mod 2 != 0">
                <td class="commonSummaryListViewCellBR ms-vb">
                  <xsl:value-of select="@DisplayName" disable-output-escaping="yes"/>
                </td>
                <xsl:if test="count(LocalizedValue)!=0">
                  <td class="commonSummaryListViewCellBR ms-vb">
                    <table cellspacing="0" style="width:100%">
                      <tr class="listViewHeader">
                        <th align="left" class="commonSummaryListViewHeaderCellBR">Language</th>
                        <th align="left" class="commonSummaryListViewHeaderCellBR">Status</th>
                      </tr>
                      <xsl:if test="@InitializedValue and @InitializedValue != ''">
                        <xsl:call-template name="output-localized-attribute-value">
                          <xsl:with-param name="locale" select="@Locale"/>
                          <xsl:with-param name="attribute" select="@InitializedValue"/>
                          <xsl:with-param name="type" select="@DataType"/>
                        </xsl:call-template>
                      </xsl:if>
                      <xsl:for-each select="LocalizedValue">
                        <xsl:call-template name="output-localized-attribute-value">
                          <xsl:with-param name="locale" select="@Locale"/>
                          <xsl:with-param name="attribute" select="@InitializedValue"/>
                          <xsl:with-param name="type" select="../@DataType"/>
                        </xsl:call-template>
                      </xsl:for-each>
                    </table>
                  </td>
                </xsl:if>
                <xsl:if test="count(LocalizedValue)=0">
                  <td class="commonSummaryListViewCellBR ms-vb">
                    <xsl:call-template name="output-attribute-value">
                      <xsl:with-param name="attribute" select="@InitializedValue"/>
                      <xsl:with-param name="type" select="@DataType"/>
                    </xsl:call-template>
                  </td>
                </xsl:if>
              </xsl:if>
              <xsl:if test="position() mod 2 != 1">
                <td class="ms-alternating commonSummaryListViewCellBR ms-vb">
                  <xsl:value-of select="@DisplayName" disable-output-escaping="yes"/>
                </td>
                <xsl:if test="count(LocalizedValue)!=0">
                  <td class="ms-alternating commonSummaryListViewCellBR ms-vb">
                    <table cellspacing="0" style="width:100%">
                      <tr class="listViewHeader">
                        <th align="left" class="commonSummaryListViewHeaderCellBR">Language</th>
                        <th align="left" class="commonSummaryListViewHeaderCellBR">Status</th>
                      </tr>
                      <xsl:if test="@InitializedValue and @InitializedValue != ''">
                        <xsl:call-template name="output-localized-attribute-value">
                          <xsl:with-param name="locale" select="@Locale"/>
                          <xsl:with-param name="attribute" select="@InitializedValue"/>
                          <xsl:with-param name="type" select="@DataType"/>
                        </xsl:call-template>
                      </xsl:if>
                      <xsl:for-each select="LocalizedValue">
                        <xsl:call-template name="output-localized-attribute-value">
                          <xsl:with-param name="locale" select="@Locale"/>
                          <xsl:with-param name="attribute" select="@InitializedValue"/>
                          <xsl:with-param name="type" select="../@DataType"/>
                        </xsl:call-template>
                      </xsl:for-each>
                    </table>
                  </td>
                </xsl:if>
                <xsl:if test="count(LocalizedValue)=0">
                  <td class="ms-alternating commonSummaryListViewCellBR ms-vb">
                    <xsl:call-template name="output-attribute-value">
                      <xsl:with-param name="attribute" select="@InitializedValue"/>
                      <xsl:with-param name="type" select="@DataType"/>
                    </xsl:call-template>
                  </td>
                </xsl:if>
              </xsl:if>
            </tr>
          </xsl:for-each>
        </table>
      </xsl:when>
      <xsl:when test="ModifiedAttributes[@ActionType='Modify']">
        <!-- expected XML
        <ModifiedAttributes ActionType="Modify">
          <SingleAttribute Name="[attribute's system name]" DisplayName="[attribute's display name]" DataType="[all kinds of ILM data type]" InitializedValue="[the old value]" SetValue="[the new value]"/>
          other <SingleAttribute> elements
          <MultipleAttribute Name="[attribute's system name]" DisplayName="[attribute's display name]" DataType="[all kinds of ILM data type]" InsertedItem="[inserted items separated by ';']" RemovedItem="[removed items separated by ';']"/>
          other <MultipleAttribute> elements
        </ModifiedAttributes>
        -->
        <table class="commonSummaryListViewGridBorder" cellspacing="0" cellpadding="3">
          <xsl:if test="ModifiedAttributes[count(SingleAttribute)!=0]">
            <tr align="left" class="listViewHeader">
              <th class="commonSummaryListViewHeaderCellBR">Single-Value Attributes</th>
              <th class="commonSummaryListViewHeaderCellBR">Old Value</th>
              <th class="commonSummaryListViewHeaderCellBR">New Value</th>
            </tr>
            <xsl:for-each select="ModifiedAttributes/SingleAttribute">
              <xsl:sort select="@DisplayName" order="ascending"/>
              <xsl:if test="count(LocalizedValue)!=0">
                <tr class="listViewRow">
                  <xsl:if test="position() mod 2 != 0">
                    <td class="commonSummaryListViewCellBR ms-vb">
                      <xsl:value-of select="@DisplayName" disable-output-escaping="yes"/>
                    </td>
                    <td colSpan="2">
                      <table cellspacing="0" cellpadding="0" style="width:100%">
                        <tr align="left" class="listViewHeader">
                          <th class="commonSummaryListViewHeaderCellBR">Language</th>
                          <th class="commonSummaryListViewHeaderCellBR">Old Value</th>
                          <th class="commonSummaryListViewHeaderCellBR">New Value</th>
                        </tr>
                        <xsl:if test="(@InitializedValue and @InitializedValue !='') or (@SetValue and @SetValue != '')">
                          <xsl:call-template name="output-modified-value">
                            <xsl:with-param name="name" select="@Locale"/>
                            <xsl:with-param name="attribute1" select="@InitializedValue"/>
                            <xsl:with-param name="text1">(no initial value)</xsl:with-param>
                            <xsl:with-param name="attribute2" select="@SetValue"/>
                            <xsl:with-param name="text2">(value removed)</xsl:with-param>
                            <xsl:with-param name="type" select="@DataType"/>
                          </xsl:call-template>
                        </xsl:if>
                        <xsl:for-each select="LocalizedValue">
                          <xsl:call-template name="output-modified-value">
                            <xsl:with-param name="name" select="@Locale"/>
                            <xsl:with-param name="attribute1" select="@InitializedValue"/>
                            <xsl:with-param name="text1">(no initial value)</xsl:with-param>
                            <xsl:with-param name="attribute2" select="@SetValue"/>
                            <xsl:with-param name="text2">(value removed)</xsl:with-param>
                            <xsl:with-param name="type" select="../@DataType"/>
                          </xsl:call-template>
                        </xsl:for-each>
                      </table>
                    </td>
                  </xsl:if>
                  <xsl:if test="position() mod 2 != 1">
                    <td class="ms-alternating commonSummaryListViewCellBR ms-vb">
                      <xsl:value-of select="@DisplayName" disable-output-escaping="yes"/>
                    </td>
                    <td colSpan="2">
                      <table cellspacing="0" style="width:100%">
                        <tr align="left" class="listViewHeader">
                          <th class="commonSummaryListViewHeaderCellBR">Language</th>
                          <th class="commonSummaryListViewHeaderCellBR">Old Value</th>
                          <th class="commonSummaryListViewHeaderCellBR">New Value</th>
                        </tr>
                        <xsl:if test="(@InitializedValue and @InitializedValue !='') or (@SetValue and @SetValue != '')">
                          <xsl:call-template name="output-modified-value">
                            <xsl:with-param name="name" select="@Locale"/>
                            <xsl:with-param name="attribute1" select="@InitializedValue"/>
                            <xsl:with-param name="text1">(no initial value)</xsl:with-param>
                            <xsl:with-param name="attribute2" select="@SetValue"/>
                            <xsl:with-param name="text2">(value removed)</xsl:with-param>
                            <xsl:with-param name="type" select="@DataType"/>
                          </xsl:call-template>
                        </xsl:if>
                        <xsl:for-each select="LocalizedValue">
                          <xsl:call-template name="output-modified-value">
                            <xsl:with-param name="name" select="@Locale"/>
                            <xsl:with-param name="attribute1" select="@InitializedValue"/>
                            <xsl:with-param name="text1">(no initial value)</xsl:with-param>
                            <xsl:with-param name="attribute2" select="@SetValue"/>
                            <xsl:with-param name="text2">(value removed)</xsl:with-param>
                            <xsl:with-param name="type" select="../@DataType"/>
                          </xsl:call-template>
                        </xsl:for-each>
                      </table>
                    </td>
                  </xsl:if>
                </tr>
              </xsl:if>
              <xsl:if test="count(LocalizedValue)=0">
                <xsl:call-template name="output-modified-value">
                  <xsl:with-param name="name" select="@DisplayName"/>
                  <xsl:with-param name="attribute1" select="@InitializedValue"/>
                  <xsl:with-param name="text1">(no initial value)</xsl:with-param>
                  <xsl:with-param name="attribute2" select="@SetValue"/>
                  <xsl:with-param name="text2">(value removed)</xsl:with-param>
                  <xsl:with-param name="type" select="@DataType"/>
                </xsl:call-template>
              </xsl:if>
            </xsl:for-each>
          </xsl:if>
          <xsl:if test="ModifiedAttributes[count(MultipleAttribute)!=0]">
            <tr align="left" class="listViewHeader">
              <th class="commonSummaryListViewHeaderCellBR">Multiple-Value Attributes</th>
              <th class="commonSummaryListViewHeaderCellBR">Removed Items</th>
              <th class="commonSummaryListViewHeaderCellBR">Inserted Items</th>
            </tr>
            <xsl:for-each select="ModifiedAttributes/MultipleAttribute">
              <xsl:sort select="@DisplayName" order="ascending"/>
              <xsl:if test="count(LocalizedValue)!=0">
                <tr class="uocSummaryTitleTR">
                  <xsl:if test="position() mod 2 != 0">
                    <td class="commonSummaryListViewCellBR ms-vb">
                      <xsl:value-of select="@DisplayName" disable-output-escaping="yes"/>
                    </td>
                    <td>
                      <table cellspacing="0" style="width:100%">
                        <tr align="left" class="listViewHeader">
                          <th class="commonSummaryListViewHeaderCellBR">Language</th>
                          <th class="commonSummaryListViewHeaderCellBR">Removed Items</th>
                          <th class="commonSummaryListViewHeaderCellBR">Inserted Items</th>
                        </tr>
                        <xsl:if test="(@RemovedItem and @RemovedItem!='') or (@InsertedItem and @InsertedItem!='')">
                          <xsl:call-template name="output-modified-value">
                            <xsl:with-param name="name" select="@Locale"/>
                            <xsl:with-param name="attribute1" select="@RemovedItem"/>
                            <xsl:with-param name="text1">(no removed item)</xsl:with-param>
                            <xsl:with-param name="attribute2" select="@InsertedItem"/>
                            <xsl:with-param name="text2">(no inserted item)</xsl:with-param>
                            <xsl:with-param name="type" select="@DataType"/>
                          </xsl:call-template>
                        </xsl:if>
                        <xsl:for-each select="LocalizedValue">
                          <xsl:call-template name="output-modified-value">
                            <xsl:with-param name="name" select="@Locale"/>
                            <xsl:with-param name="attribute1" select="@RemovedItem"/>
                            <xsl:with-param name="text1">(no removed item)</xsl:with-param>
                            <xsl:with-param name="attribute2" select="@InsertedItem"/>
                            <xsl:with-param name="text2">(no inserted item)</xsl:with-param>
                            <xsl:with-param name="type" select="@DataType"/>
                          </xsl:call-template>
                        </xsl:for-each>
                      </table>
                    </td>
                  </xsl:if>
                  <xsl:if test="position() mod 2 != 1">
                    <td class="ms-alternating commonSummaryListViewCellBR ms-vb">
                      <xsl:value-of select="@DisplayName" disable-output-escaping="yes"/>
                    </td>
                    <td>
                      <table cellspacing="0" style="width:100%">
                        <tr align="left" class="listViewHeader">
                          <th class="commonSummaryListViewHeaderCellBR">Language</th>
                          <th class="commonSummaryListViewHeaderCellBR">Removed Items</th>
                          <th class="commonSummaryListViewHeaderCellBR">Inserted Items</th>
                        </tr>
                        <xsl:if test="(@RemovedItem and @RemovedItem!='') or (@InsertedItem and @InsertedItem!='')">
                          <xsl:call-template name="output-modified-value">
                            <xsl:with-param name="name" select="@Locale"/>
                            <xsl:with-param name="attribute1" select="@RemovedItem"/>
                            <xsl:with-param name="text1">(no removed item)</xsl:with-param>
                            <xsl:with-param name="attribute2" select="@InsertedItem"/>
                            <xsl:with-param name="text2">(no inserted item)</xsl:with-param>
                            <xsl:with-param name="type" select="@DataType"/>
                          </xsl:call-template>
                        </xsl:if>
                        <xsl:for-each select="LocalizedValue">
                          <xsl:call-template name="output-modified-value">
                            <xsl:with-param name="name" select="@Locale"/>
                            <xsl:with-param name="attribute1" select="@RemovedItem"/>
                            <xsl:with-param name="text1">(no removed item)</xsl:with-param>
                            <xsl:with-param name="attribute2" select="@InsertedItem"/>
                            <xsl:with-param name="text2">(no inserted item)</xsl:with-param>
                            <xsl:with-param name="type" select="@DataType"/>
                          </xsl:call-template>
                        </xsl:for-each>
                      </table>
                    </td>
                  </xsl:if>
                </tr>
              </xsl:if>
              <xsl:if test="count(LocalizedValue)=0">
                <xsl:call-template name="output-modified-value">
                  <xsl:with-param name="name" select="@DisplayName"/>
                  <xsl:with-param name="attribute1" select="@RemovedItem"/>
                  <xsl:with-param name="text1">(no removed item)</xsl:with-param>
                  <xsl:with-param name="attribute2" select="@InsertedItem"/>
                  <xsl:with-param name="text2">(no inserted item)</xsl:with-param>
                  <xsl:with-param name="type" select="@DataType"/>
                </xsl:call-template>
              </xsl:if>
            </xsl:for-each>
          </xsl:if>
        </table>
      </xsl:when>
    </xsl:choose>
  </xsl:template>
</xsl:stylesheet>