xml - 如何根据 XML 输入(Active Directory 用户属性)中两个兄弟节点的条件处理来设置 XSLT 输出的值?
问题描述
用例: 我有一个传真应用程序进程,它从 Microsoft Active Directory 域服务中检索用户对象,并将 AD 用户属性映射到应用程序中的关联用户属性。
要求:
- 在 XML 输出中的一个
<value></value>
节点下填充一个 SINGLE节点。<attr name="facsimileTelephoneNumber"></attr>
- 设置
<value/>
基于 XML 输入的多个节点的条件的最终结果。
注意:我不确定 XSLT 引擎是什么。该处理器内置于传真应用程序中。
条件流程:
- 如果 of
<attr name="facsimileTelephoneNumber">
不是空字符串,则<value>
删除除整数以外的所有内容并将<attr name="PersonalFaxNumber">
.
- 如果
<value>
of<attr name="facsimileTelephoneNumber">
是一个空字符串,那么- 处理
<value>
节点下的<attr name="proxyAddresses">
节点。
- 处理
- 在
<attr name="proxyAddresses">
节点中,找到第一个以“did:”开头的字符串(可选),后跟 10 位数字。 - 如果找到值,则
- 从字符串中删除“did:”并将下面的
<attr name="PersonalFaxNumber">
- 丢弃
<value>
下的所有其他节点<attr name="proxyAddresses">
。
- 从字符串中删除“did:”并将下面的
- 否则,
<value>
下面<attr name="PersonalFaxNumber">
是字符串“8885551234”。
问题:我对 XSL 编码的尝试总是导致
- 多个
<attr name="PersonalFaxNumber">
输出 - 输出中的剩余代理地址。
样品输入:
<?xml version="1.0" encoding="utf-8"?>
<syncRequest xmlns="urn:rightfax-sync-schema" source="ActiveDirectory" >
<userAddRequest source="ActiveDirectory" guid="1234abc567890d11e22fa3b45c6789de">
<attr name="sAMAccountName">
<value>johndoe</value>
</attr>
<attr name="facsimileTelephoneNumber">
<value>111-555-1234</value>
</attr>
<attr name="proxyAddresses">
<value>did:2225551111</value>
<value>smtp:johndoe@mydomain.com</value>
</attr>
</userAddRequest>
<userAddRequest source="ActiveDirectory" guid="4321cba098765a99b88cd7e65f9876ab">
<attr name="sAMAccountName">
<value>joeschmoe</value>
</attr>
<attr name="facsimileTelephoneNumber">
<value></value>
</attr>
<attr name="proxyAddresses">
<value>did:2225554321</value>
<value>smtp:joeschmoe@mydomain.com</value>
</attr>
</userAddRequest>
<attr name="sAMAccountName">
<value>janedoe</value>
</attr>
<userAddRequest source="ActiveDirectory" guid="5555cba123123a45b45cd4e45f4545cd">
<attr name="facsimileTelephoneNumber">
<value></value>
</attr>
<attr name="proxyAddresses">
<value></value>
<value>smtp:janedoe@mydomain.com</value>
</attr>
</userAddRequest>
</syncRequest>
我尝试的 XSL - 源自我所有的阅读和实验:
<?xml version="1.0"?>
<xsl:stylesheet
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:rf="urn:rightfax-sync-schema"
xmlns="urn:rightfax-sync-schema"
exclude-result-prefixes="rf"
version="1.0">
<xsl:output method="xml" indent="yes"/>
<!-- "userID" is a required attribute -->
<xsl:template match="rf:attr[@name='sAMAccountName']">
<attr name="UserID">
<xsl:apply-templates select="*"/>
</attr>
</xsl:template>
<xsl:template match="rf:attr[@name='facsimileTelephoneNumber'] | rf:attr[@name='proxyAddresses']/*[starts-with(.,'did:')][1]">
<attr name="RouteCode">
<value>100</value>
</attr>
<attr name="PersonalFaxNum">
<value>
<xsl:choose>
<xsl:when test="compare(normalize-space(.),'') != 0">
<xsl:variable name="cleanNumber" select="translate(normalize-space(.), 'did: .-,()', '')"/>
<xsl:value-of select="$cleanNumber"/>
</xsl:when>
<xsl:otherwise>8885551234</xsl:otherwise>
</xsl:choose>
</value>
</attr>
</xsl:template>
</xsl:stylesheet>
当前输出结果...
当 'facsimileTelephoneNumber' 包含字符串时
<?xml version="1.0" encoding="UTF-8"?>
<attr xmlns="urn:rightfax-sync-schema" name="UserID">johndoe</attr>
<attr xmlns="urn:rightfax-sync-schema" name="PersonalFaxNum">
<value>1115551234</value>
</attr>
<attr xmlns="urn:rightfax-sync-schema" name="PersonalFaxNum">
<value>2225551111</value>
</attr>
smtp:johndoe@mydomain.com
当 'facsimileTelephoneNumber' 为空且 'proxyAddressess' 有一个以“DID:”开头的值节点时(我还没有弄清楚如何检查“后跟 10 位数字,但这是一个总奖励。我可以使用 DID:部分。)
<?xml version="1.0" encoding="UTF-8"?>
<attr xmlns="urn:rightfax-sync-schema" name="UserID">joeschmoe</attr>
<attr xmlns="urn:rightfax-sync-schema" name="PersonalFaxNum">
<value>8885551234</value>
</attr>
<attr xmlns="urn:rightfax-sync-schema" name="PersonalFaxNum">
<value>2225554321</value>
</attr>
smtp:joeschmoe@mydomain.com
当 'facsimileTelephoneNumber' 和 'proxyAddresses' 都没有匹配的节点时:
<?xml version="1.0" encoding="UTF-8"?>
<attr xmlns="urn:rightfax-sync-schema" name="UserID">janedoe</attr>
<attr xmlns="urn:rightfax-sync-schema" name="PersonalFaxNum">
<value>8885551234</value>
</attr>
smtp:janedoe@mydomain.com
期望的输出
- 情况1:
<attr xmlns="urn:rightfax-sync-schema" name="UserID">johndoe</attr>
<attr xmlns="urn:rightfax-sync-schema" name="PersonalFaxNum">
<value>1115551234</value>
</attr>
- 案例 2:
<attr xmlns="urn:rightfax-sync-schema" name="UserID">johndoe</attr>
<attr xmlns="urn:rightfax-sync-schema" name="PersonalFaxNum">
<value>2225554321</value>
</attr>
- 案例 3:
<attr xmlns="urn:rightfax-sync-schema" name="UserID">johndoe</attr>
<attr xmlns="urn:rightfax-sync-schema" name="PersonalFaxNum">
<value>8885551234</value>
</attr>
解决方案
以下 XSL 执行您指定的操作:
<?xml version="1.0" encoding="utf-8" ?>
<xsl:stylesheet
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:rf="urn:rightfax-sync-schema"
xmlns="urn:rightfax-sync-schema"
exclude-result-prefixes="rf"
version="1.0">
<xsl:output method="xml" indent="yes"/>
<xsl:template match="/">
<xsl:apply-templates select="@*|node()" />
</xsl:template>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()" />
</xsl:copy>
</xsl:template>
<xsl:template match="rf:userAddRequest">
<userAddRequest source="{@source}" guid="{@guid}">
<attr name="UserID"><xsl:value-of select="rf:attr[@name='sAMAccountName']/rf:value" /></attr>
<xsl:choose>
<xsl:when test="rf:attr[@name='facsimileTelephoneNumber']/rf:value!=''">
<attr name="PersonalFaxNum">
<value><xsl:value-of select="rf:attr[@name='facsimileTelephoneNumber']/rf:value" /></value>
</attr>
</xsl:when>
<xsl:otherwise>
<xsl:choose>
<xsl:when test="contains(rf:attr[@name='proxyAddresses']/rf:value,'did')">
<attr name="PersonalFaxNum">
<value><xsl:value-of select="substring-after(rf:attr[@name='proxyAddresses']/rf:value,'did:')" /></value>
</attr>
</xsl:when>
<xsl:otherwise>
<attr name="PersonalFaxNum">
<value>8885551234</value>
</attr>
</xsl:otherwise>
</xsl:choose>
</xsl:otherwise>
</xsl:choose>
</userAddRequest>
</xsl:template>
</xsl:stylesheet>
请注意,在您的示例输入中,您已包含此节点
<attr name="sAMAccountName">
<value>janedoe</value>
</attr>
,但没有包裹在
<userAddRequest />
我不确定这是否有意。它不会按照您的规则进行处理。
推荐阅读
- azure - 是否可以使用给定公共 IpPrefix 的静态 IP 修改 VMScaleset 实例的公共 IP?
- arrays - 如何在 Swift 中将 [String] 划分为指定数量的相等部分?
- json.net - 使用 AnyOf/OneOf/AllOf 生成 JSON 模式
- security - 如何修复 npm 漏洞?
- python - 如何使用嵌套字典进行长度检查
- azure - 尝试使用专用端点和专用链接运行用于存储帐户配置的 ARM 模板时出错
- flutter - 我想用未来的布尔值保存列表项是否可能?
- azure-active-directory - 使用代表流刷新令牌(使用 Teams 单点登录)
- node.js - 在 Mongoose Mongodb 上使用 INDEX 搜索数据
- c++ - 变量的创建是否取决于范围?