首页 > 解决方案 > 将循环内部的记录映射到不属于范围的目标记录

问题描述

为令人困惑的标题道歉,但我不确定如何最好地描述这一点。基本上,我的源架构中有一条记录,正在循环以在目标架构中创建 5 个不同的记录。

这些记录中的每一个都是根据源模式中字段的值创建的,因此可以将正确的信息映射到每个记录。在这种情况下,它是买方、供应商等的地址信息。

目标模式中的每条记录也有一个联系人记录,其中包含姓名、电话等字段。

我的任务是将源架构中的字段映射到目标架构中买家的联系人记录,而不是源架构中买家的联系方式。

买方的结构(目标模式)

在此处输入图像描述

正在循环的源模式中记录的结构。在目标模式中创建不同记录之前,我已将正在检查值的字段标记为顶部的蓝色,以及包含联系人详细信息的记录底部的蓝色。

在此处输入图像描述

我不能像往常一样映射它们的原因是 CTALoop1 在被映射的当前记录的范围内。因此,当映射买方时,我无法从不同的 NADLoop1 访问联系方式,因为它们不在循环范围内。

我的输入文件包含以下内容: 在此处输入图像描述

正如您所看到的,只有 NAD01 = PO 的 NADLoop1 包含联系方式,并且这些没有被映射到买方,因为它们超出了范围。

我如何从另一条记录映射 CTALoop1 详细信息,而不是正在循环目标模式的记录?我不会使用 XSLT 脚本,但应该说循环当前是使用可视映射器完成的,我知道在添加 XSLT 时可能会导致问题。

标签: xmlxsltmappingbiztalkedifact

解决方案


我设法通过以下内联 XSLT 解决了这个问题:

<Contact>
    <Name>
        <xsl:value-of select="/*[local-name()='EFACT_D01B_ORDERS']/*[local-name()='NADLoop1'][*[local-name()='NAD']/*[local-name()='NAD01']='PO']/*[local-name()='CTALoop1']/*[local-name()='CTA']/*[local-name()='C056']/*[local-name()='C05602']"/>
    </Name>
    <Telephone>
    <xsl:value-of select="/*[local-name()='EFACT_D01B_ORDERS']/*[local-name()='NADLoop1'][*[local-name()='NAD']/*[local-name()='NAD01']='PO']/*[local-name()='CTALoop1']/*[local-name()='COM']/*[local-name()='C076'][*[local-name()='C07602'] = 'TE']/*[local-name()='C07601']"/>
    </Telephone>
    <Email>
<xsl:value-of select="/*[local-name()='EFACT_D01B_ORDERS']/*[local-name()='NADLoop1'][*[local-name()='NAD']/*[local-name()='NAD01']='PO']/*[local-name()='CTALoop1']/*[local-name()='COM']/*[local-name()='C076'][*[local-name()='C07602'] = 'EM']/*[local-name()='C07601']"/>
    </Email>
</Contact>

推荐阅读