Biztalk 两个模式和带条件的循环 functoid

Biztalk two schemas and loop functoid with condition

当输入有两个模式而输出有一个模式和一些跨映射的条件时如何创建映射?

输入是一个内联模式,包含发票和客户模式。 他们都有 CustomerNumber 和 DepartmentCode 仅存在于 Invoices 架构中。

[条件]

仅映射此 DepartmentCode 如果 CustomerNumber 在发票和客户数据(行)上相同.

If Invoice.CustomerNumber == Customer.CustomerNumber then map Invoice.DepartmentCode.

我已经尝试使用 loop、相等和值映射 functoid,但没有预期的结果, 第二个想法是我尝试使用 "Inline xslt call template" 但我在处理时遇到错误。

[XSLT functoid 代码]

<xsl:template name="GetDepartmenCodeByCustomerNumber">
    <xsl:param name="CustomerNumber" />
    <xsl:if test="$CustomerNumber != ''">
        <xsl:element name="DepartmentCode">
            <xsl:value-of select="//s1:Customer[s1:CustomerNumber=$CustomerNumber]/s1:DepartmentCode/text()" />
        </xsl:element>
    </xsl:if>
</xsl:template>

示例:

输入

<ROOT>
 <Invoices>
  <Invoice>
   <CustomerNumber>123</CustomerNumber>
   <DepartmentCode>321</DepartmentCode>
  </Invoice>
 </Invoices>
 <Customers>
  <Customer>
   <CustomerNumber>123</CustomerNumber>
  </Customer>
  <Customer>
   <CustomerNumber>222</CustomerNumber>
  </Customer>
 </Customers>
</ROOT>

预计

<Document>
 <CustomerNumber>123</CustomerNumber>
 <DepartmentCode>321</DepartmentCode>
</Document>

例如,我需要使发票和客户段中的 CustomerNumber 相等。

您需要创建一个 "double" 循环,因为我猜您有多个发票和客户。 xslt 是一个很好的解决方案,但如果您只需要这两个字段,您可以使用这样的映射:

将发票循环到 Table Looping adding its two children and a Cumulative Concatenate of all the CNumb (adding some special character to allow the search later, for example @CNumb@) from Customers. Use the Table Extractors 以获取所有值并检查发票中的每个 CNumb 是否在串联中,将比较结果发送到目标模式中的循环元素。