将多个源结构映射到 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>
我正在尝试映射以下具有两组属性的源结构的部分 - 一组是扁平的,一组是环状的:
源文档
<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>