将多个源结构映射到 BizTalk 中的单个循环目标结构

Mapping multiple source structures to a single looping destination structure in BizTalk

我正在尝试映射以下具有两组属性的源结构的部分 - 一组是扁平的,一组是环状的:

源文档

<root>
  <flat>
    <prop1>foo</prop1>
    <prop2>bar</prop2>
    ...
  </flat>
  <loop>
    <prop>
      <qual>propA</qual>
      <data>baz</data>
      <more>blah</more>
    </prop>
    <prop>
      <qual>propB</qual>
      <data>qux</data>
      <more>bhal</more>
    </prop>
    ...
  </loop>
</root>

具体来说,扁平部分是X12 850 EDI文档的PO1段,循环属性是后面的REF段。

这些应该映射到键值对的循环目标结构,如下所示:

目标文件

<root>
  <props>
    <prop>
      <name>prop1</name>
      <value>foo</value>
    </prop>
    <prop>
      <name>propA</name>
      <value>baz</value>
    </prop>
  </props>
</root>

我只想映射部分值,具体取决于 属性 名称。

我试过的

我已经使用 table 循环 functoid 和两个 table 提取器 functoid 成功地将平面部分映射到目标:

我还成功地将循环部分映射到目标,使用循环 functoid 和一些相等性检查 select 只有某些 qual 值:

当我尝试同时包含这两个映射时,映射成功,但没有生成组合输出。

问题

如何将源文档的两个部分映射到目标文档中的相同循环部分?

更新 1

原来我把问题简单化了;平面属性组实际上包含一个节点中的 属性 名称和另一个节点中的值。这就是它们的实际样子:

<flat>
  <name1>prop1</name1>
  <value1>foo</value1>
  <name2>prop2</name2>
  <value2>bar</value2>
  ...
</flat>

如果您使用值映射(扁平化)functoid 从正确的位置获取 属性 名称,@Dijkgraaf 的回答的概念仍然适用于此更改。

通常解决这个问题的唯一方法是

  • 通过脚本 Functoid 内联自定义 XSLT
  • 自定义 XSLT 设置整个地图的自定义 XSLT 路径
  • 具有包含两个选项节点和两个映射的中间模式。第一个将平面结构映射到一个节点,将循环映射到第二个节点。然后是第二个映射,循环遍历两者并映射到同一节点。
  • 然而,在你的情况下,你需要将 (prop1,prop2,..) 和循环道具 linked 到相同的循环 functoid,并且 linking 到名称和值并将 link 上的 link 属性从 prop1、prop2 等设置为复制名称而不是值。

根据您的样本输入,

<root>
    <props>
        <prop>
            <name>prop1</name>
            <value>foo</value>
        </prop>
        <prop>
            <name>prop2</name>
            <value>bar</value>
        </prop>
        <prop>
            <name>propA</name>
            <value>baz</value>
        </prop>
        <prop>
            <name>propB</name>
            <value>qux</value>
        </prop>
    </props>
</root>