使用 BizTalk 映射器将单个重复节点添加到目标架构
Adding a single repeating node to target schema using BizTalk mapper
我目前正在处理一个 BizTalk 项目,我遇到了一个我确信应该可以在映射中解决的问题。但是,我似乎无法弄清楚如何。希望有人能帮助我。
情况如下:在源模式和目标模式中,都有一个重复节点,其下有大致相同的 child 元素(不涉及记录或属性)。源中的重复节点具有如下结构:
<fruit>
<item>
<sort>Apple</sort>
<size>5cm</size>
<colour>red</colour>
</item>
<item>
<sort>Pear</sort>
<size>8cm</size>
<colour>green</colour>
</item>
</fruit>
虽然目标中的重复节点看起来更像这样:
<FRUIT>
<SORT>Apple</SORT>
<SIZE>5cm</SIZE>
<COLOUR>red</COLOUR>
</FRUIT>
<FRUIT>
<SORT>Pear</SORT>
<SIZE>8cm</SIZE>
<COLOUR>green</COLOUR>
</FRUIT>
我需要映射做的是确保如果有任何可用的水果,则目标中至少有两条记录 'fruit' 可用。这应该通过向目标添加一种通用水果(如果您愿意,可以考虑一些任意的菠萝)来实现,如果源中只有一种水果可用的话。
作为第一步,我尝试向目标再添加一个水果节点,但没有成功。我非常有信心,如果我知道如何做到这一点,我可以通过将它与 'count records' 和 'logical equality'(=1) functoids 结合来解决实际问题。
所以问题归结为:如何将单个记录添加到映射内的目标?
我尝试了几个选项(以及这些选项的组合),即:
- 在元素 "fruit" 或 "item" 上使用循环 functoid 以及一些额外的值映射。
- 直接添加额外的值映射
- 在 "item" 或 "fruit" 和 "FRUIT" 之间添加直接链接,中间有或没有循环 functoid。
在大多数情况下,要么我得到的结果包含 children like
<FRUIT>
<SORT>Pear</SORT>
<SORT>Pineapple</SORT>
<SIZE>8cm</SIZE>
<COLOUR>green</COLOUR>
</FRUIT>
(以及相应的错误,因为这不满足模式 - 不允许对多个元素进行排序),或者一大堆菠萝。两者都不是希望的。
谁能帮帮我?
遗憾的是,在 BizTalk 映射器中没有简单的方法来执行此操作。当您使用循环 functoid 时,它会创建一个 xsl:for-each
并会创建与它在源架构中出现的次数完全相同的目标节点。
由于您的目标节点没有那么复杂,您最好的选择可能是使用带有内联 XSLT 的脚本 Functoid,使用以下内容:
<xsl:for-each select="/fruit/item">
<FRUIT>
<SORT><xsl:value-of select="sort"/></SORT>
<SIZE><xsl:value-of select="size"/></SIZE>
<COLOUR><xsl:value-of select="colour"/></COLOUR>
</FRUIT>
<xsl:if test="last() = 1"> <!-- there's only one node here, we want at least two -->
<FRUIT>
<SORT>pineapple</SORT>
<SIZE>8cm</SIZE>
<COLOUR>green</COLOUR>
</FRUIT>
</xsl:if>
</xsl:for-each>
Link 输出到目标模式中的 FRUIT 节点。
我目前正在处理一个 BizTalk 项目,我遇到了一个我确信应该可以在映射中解决的问题。但是,我似乎无法弄清楚如何。希望有人能帮助我。
情况如下:在源模式和目标模式中,都有一个重复节点,其下有大致相同的 child 元素(不涉及记录或属性)。源中的重复节点具有如下结构:
<fruit>
<item>
<sort>Apple</sort>
<size>5cm</size>
<colour>red</colour>
</item>
<item>
<sort>Pear</sort>
<size>8cm</size>
<colour>green</colour>
</item>
</fruit>
虽然目标中的重复节点看起来更像这样:
<FRUIT>
<SORT>Apple</SORT>
<SIZE>5cm</SIZE>
<COLOUR>red</COLOUR>
</FRUIT>
<FRUIT>
<SORT>Pear</SORT>
<SIZE>8cm</SIZE>
<COLOUR>green</COLOUR>
</FRUIT>
我需要映射做的是确保如果有任何可用的水果,则目标中至少有两条记录 'fruit' 可用。这应该通过向目标添加一种通用水果(如果您愿意,可以考虑一些任意的菠萝)来实现,如果源中只有一种水果可用的话。
作为第一步,我尝试向目标再添加一个水果节点,但没有成功。我非常有信心,如果我知道如何做到这一点,我可以通过将它与 'count records' 和 'logical equality'(=1) functoids 结合来解决实际问题。
所以问题归结为:如何将单个记录添加到映射内的目标?
我尝试了几个选项(以及这些选项的组合),即:
- 在元素 "fruit" 或 "item" 上使用循环 functoid 以及一些额外的值映射。
- 直接添加额外的值映射
- 在 "item" 或 "fruit" 和 "FRUIT" 之间添加直接链接,中间有或没有循环 functoid。
在大多数情况下,要么我得到的结果包含 children like
<FRUIT>
<SORT>Pear</SORT>
<SORT>Pineapple</SORT>
<SIZE>8cm</SIZE>
<COLOUR>green</COLOUR>
</FRUIT>
(以及相应的错误,因为这不满足模式 - 不允许对多个元素进行排序),或者一大堆菠萝。两者都不是希望的。
谁能帮帮我?
遗憾的是,在 BizTalk 映射器中没有简单的方法来执行此操作。当您使用循环 functoid 时,它会创建一个 xsl:for-each
并会创建与它在源架构中出现的次数完全相同的目标节点。
由于您的目标节点没有那么复杂,您最好的选择可能是使用带有内联 XSLT 的脚本 Functoid,使用以下内容:
<xsl:for-each select="/fruit/item">
<FRUIT>
<SORT><xsl:value-of select="sort"/></SORT>
<SIZE><xsl:value-of select="size"/></SIZE>
<COLOUR><xsl:value-of select="colour"/></COLOUR>
</FRUIT>
<xsl:if test="last() = 1"> <!-- there's only one node here, we want at least two -->
<FRUIT>
<SORT>pineapple</SORT>
<SIZE>8cm</SIZE>
<COLOUR>green</COLOUR>
</FRUIT>
</xsl:if>
</xsl:for-each>
Link 输出到目标模式中的 FRUIT 节点。