【发布时间】:2021-04-14 06:39:51
【问题描述】:
在 BizTalk 映射器中,当特定输入字段为空或为空时,我必须在输出字段中设置默认电子邮件。
所以我用电子邮件设置了一个 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>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 标识的员工。有一个循环,因此对于第一个文件中的每个员工,我们获取与 用户名 相关的员工数据。我们需要数据库中与每个员工相关的两个数据来计算输出文件中的两个字段。 输出必须包含来自第一个和 2 个计算字段的所有数据。 如果在第一个文件(来自我的客户)中未提供电子邮件字段(为空或 null),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>
【问题讨论】:
-
@Dijkgraaf 我添加了示例输入文件
-
我认为您正在尝试从 Get 获取电子邮件,并将其与 Return 中的用户名相匹配,我认为该用户名将包含其他详细信息,例如名字、姓氏和出生日期,这似乎从您的示例输入中丢失。如果我使用您的 XSLT 并且有来自 GET 的链接,它可以工作,如果我将两者分开,它不会。我认为您将不得不给我们一个示例地图和模式,并更详细地解释您要做什么。
-
@Dijkgraaf 我更新了我的帖子。对于映射,我通过我放置的脚本函数将 InputMessagePart_1 中的 Number 字段连接到输出相应的字段(在我的情况下为 email 字段)我的 XSLT 代码。如果输入 Email 字段(来自 InputMessagePart_0) 为空,我不必设置默认值,但它运行良好。
标签: xslt-1.0 biztalk biztalk-2013