使用电子邮件设置 xslt 变量

问题描述

在 BizTalk 映射器中,当特定输入字段为 null 或为空时,我必须在输出字段中设置认电子邮件

所以我用电子邮件设置了一个 XSLT 变量,但是当条件良好时,不会在输出中创建节点。

这是我的代码

<xsl:template name="GetEmail">
  <xsl:param name="number" />
  <xsl:param name="Email" />
  <xsl:variable name="defaultmail">noreply&#64;domain.fr</xsl:variable>

  <xsl:for-each select="//*[local-name()='Employee']">
    <xsl:choose>
      <xsl:when test="*[local-name()='Username' and text() = $number] and $Email != ''">
        <xsl:element name="email">      
          <xsl:value-of select="string(*[local-name()='Email'])" />
        </xsl:element>
      </xsl:when>
      <xsl:when test="*[local-name()='Username' and text() = $number] and $Email = ''">
        <xsl:element name="email">      
          <xsl:value-of select="$defaultmail" />
        </xsl:element>
      </xsl:when>
    </xsl:choose>
  </xsl:for-each>      
</xsl:template>

这是我的输入文件

<ns0:Root xmlns:ns0="http://schemas.microsoft.com/BizTalk/2003/aggschema">
    <InputMessagePart_0>
        <Get>
            <Employee>
                <Username>008441</Username>
                <Email />
            </Employee>
            <Employee>
                <Username>014095</Username>
                <Email>[email protected]</Email>
            </Employee>
            <Employee>
                <Username>011812</Username>
                <Email>[email protected]</Email>
            </Employee>
        </Get>
    </InputMessagePart_0>
    <InputMessagePart_1>
        <ns1:EmployeeResponse xmlns:ns1="http://Employee">
            <ns1:Header /> 
            <ns1:Return>
                <ns1:Employee>
                    <ns1:Number>008441</ns1:Number>
                </ns1:Employee>
            </ns1:Return>
        </ns1:EmployeeResponse>
    </InputMessagePart_1>
</ns0:Root>

这是输出

<Employee>
  <username>123456789</username> 
  <firstname>Firstname</firstname> 
  <lastname>Lastname</lastname>
  <birthdate>dd/MM/yyyy</birthdate>
<email />
</Employee>

它应该是什么:

<Employee>
  <username>123456789</username> 
  <firstname>Firstname</firstname> 
  <lastname>Lastname</lastname>
  <email>nor[email protected]</email>
  <birthdate>dd/MM/yyyy</birthdate>
</Employee>

我有 2 个输入文件一个由我的客户提供,另一个由我们的数据库提供。 来自客户的第一个文件包含员工列表。 我们数据库中的第二个文件只包含第一个文件中使用 用户名 标识的一名员工。有一个循环,因此对于第一个文件中的每个员工,我们都会获得与用户名 相关的员工数据。我们需要数据库中与每个员工相关的两个数据来计算输出文件中的 2 个字段。 输出必须包含来自第一个和两个计算字段的所有数据。 如果第一个文件(来自我的客户)中未提供电子邮件字段(空或空),BizTalk 映射器会使用非空电子邮件字段获取下一位员工的电子邮件。 所以在我的例子中,输出将是:

<Employee>
  <username>008441</username> 
  <firstname>Firstname</firstname> 
  <lastname>Lastname</lastname>
  <email>[email protected]</email>
  <birthdate>dd/MM/yyyy</birthdate>
</Employee>

而不是:

<Employee>
  <username>008441</username> 
  <firstname>Firstname</firstname> 
  <lastname>Lastname</lastname>
  <email>nor[email protected]</email>
  <birthdate>dd/MM/yyyy</birthdate>
</Employee>

解决方法

将您的代码更改为:

    <xsl:template name="GetEmail">
  <xsl:param name="number" />
  <xsl:param name="Email" />
  <xsl:variable name="defaultmail">
      <xsl:value-of select='[email protected]'/>
   </xsl:variable>

  <xsl:for-each select="//*[local-name()='Employee']">
    <xsl:choose>
      <xsl:when test="[local-name()='Username' and text() = $number]  and string-length($Email) &gt;0">
        <xsl:element name="email">      
          <xsl:value-of select="string(*[local-name()='Email'])" />
        </xsl:element>
      </xsl:when>
      <xsl:when test="*[local-name()='Username' and text() = $number] and string-length($Email) &eq;0">
        <xsl:element name="email">      
          <xsl:value-of select="$defaultmail" />
        </xsl:element>
      </xsl:when>
    </xsl:choose>
  </xsl:for-each>      
</xsl:template>
,

您不应该尝试同时从 InputMessagePart_0 和 InputMessagePart_1 进行链接,这只会混淆循环,并且您已经在 XSLT 内为 InputMessagePart_0 与您的 for-each-select 创建了循环。只需链接 InputMessagePart_1 中的 Number 并使用以下 XSLT。还要从节点中选择电子邮件,而不是将其作为变量传入。

<xsl:template name="GetEmail">
  <xsl:param name="number" />
  <xsl:variable name="defaultmail">noreply&#64;domain.fr</xsl:variable>

  <xsl:for-each select="//*[local-name()='Employee']">
    <xsl:choose>
      <xsl:when test="*[local-name()='Username' and text() = $number]">
       <xsl:choose>
         <xsl:when test="*[local-name()='Email' and text() != '']">
           <xsl:element name="email">
            <xsl:value-of select="string(*[local-name()='Email'])" />
           </xsl:element>
         </xsl:when>
           <xsl:otherwise>
           <xsl:element name="email">      
             <xsl:value-of select="$defaultmail" />
           </xsl:element>
         </xsl:otherwise>
       </xsl:choose>
     </xsl:when>
    </xsl:choose>
  </xsl:for-each>      
</xsl:template>