问题描述
在 BizTalk 映射器中,当特定输入字段为 null 或为空时,我必须在输出字段中设置默认电子邮件。
所以我用电子邮件设置了一个 XSLT 变量,但是当条件良好时,不会在输出中创建节点。
这是我的代码:
<xsl:template name="GetEmail">
<xsl:param name="number" />
<xsl:param name="Email" />
<xsl:variable name="defaultmail">noreply@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) >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@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>