首页 > 解决方案 > 如何根据 XML 输入(Active Directory 用户属性)中两个兄弟节点的条件处理来设置 XSLT 输出的值?

问题描述

用例: 我有一个传真应用程序进程,它从 Microsoft Active Directory 域服务中检索用户对象,并将 AD 用户属性映射到应用程序中的关联用户属性。

要求:

注意:我不确定 XSLT 引擎是什么。该处理器内置于传真应用程序中。

条件流程:

问题:我对 XSL 编码的尝试总是导致

样品输入:

<?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>

标签: xmlxslt

解决方案


以下 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 />

我不确定这是否有意。它不会按照您的规则进行处理。


推荐阅读