Biztalk两个模式和循环functoid条件

时间:2016-11-02 20:49:32

标签: mapping biztalk

如何在输入时创建映射我们将有两个架构并且在输出上将是一个架构和跨映射的某些条件?

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

[条件]

Mapp只有 DepartmentCode ,如果 CustomerNumber 在发票和客户数据(行)上相同

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

我尝试使用loop,等值和值映射functoid但没有预期的结果, 第二个想到我试图使用“内联xslt调用模板”,但我在处理时遇到错误。

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

例如,我需要在Invoice和Customer segment中等同CustomerNumber。

1 个答案:

答案 0 :(得分:1)

你需要做一个&#34; double&#34;循环,因为我猜你有多个发票和客户。 xslt是一个很好的解决方案,但是如果你只需要这两个字段就可以使用这样的地图:

enter image description here

将发票循环到Table Looping添加其两个孩子和Cumulative Concatenate所有CNumb(添加一些特殊字符以便稍后进行搜索,例如@ CNumb @)来自Customers。使用Table Extractors获取所有值并检查来自发票的每个CNumb是否在串联中,将比较结果发送到目标模式中的循环元素。