使用电子邮件设置 xslt 变量

Set an xslt variable with an email

在 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>email2@domain.fr</Email>
            </Employee>
            <Employee>
                <Username>011812</Username>
                <Email>email3@domain.fr</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>noreply@domain.fr</email>
  <birthdate>dd/MM/yyyy</birthdate>
</Employee>

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

<Employee>
  <username>008441</username> 
  <firstname>Firstname</firstname> 
  <lastname>Lastname</lastname>
  <email>email2@domain.fr</email>
  <birthdate>dd/MM/yyyy</birthdate>
</Employee>

而不是:

<Employee>
  <username>008441</username> 
  <firstname>Firstname</firstname> 
  <lastname>Lastname</lastname>
  <email>noreply@domain.fr</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='noreply@domain.fr'/>
   </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 尝试 link,这只会混淆循环,并且您已经在 XSLT 中为 [=14= 创建了循环] 和你的 for-each-select。只需 link 来自 InputMessagePart_1 的数字并使用以下 XSLT。还有 select 来自节点的电子邮件,而不是将其作为变量传递。

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