我目前正在开发一个BizTalk项目,但我遇到了一个我确定应该在映射中可以解决的问题。但是,我似乎无法弄清楚如何。希望有人可以帮助我。
情况如下:在源模式和目标模式中,有一个重复节点,其下面有大致相同的子元素(不涉及记录或属性)。源中的重复节点具有如下结构:
<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>
我需要做的映射,确保如果有任何可用的水果,至少有两个记录&#39;水果&#39;在目标中可用。这应该通过在目标上添加一种通用水果(只要想一些任意菠萝,如果你愿意的话)来实现,如果只有一种水果可以来源。
作为第一步,我尝试向目标添加一个水果节点,但未能这样做。我非常有信心,如果我知道如何做到这一点,我可以通过将它与“计数记录”相结合来解决实际问题。和&#39;逻辑相等&#39;(= 1)functoid。
所以问题归结为:如何在映射中向目标添加单个记录?
我尝试了几种选择(以及这些选项的组合),即:
在大多数情况下,我得到的结果都包含像
这样的孩子<FRUIT>
<SORT>Pear</SORT>
<SORT>Pineapple</SORT>
<SIZE>8cm</SIZE>
<COLOUR>green</COLOUR>
</FRUIT>
(以及相应的错误,因为它不满足模式 - 它不允许多个元素SORT),或者一大堆菠萝。这两者都不是希望的。
任何人都可以帮助我吗?
答案 0 :(得分:0)
不幸的是,在BizTalk映射器中没有简单的方法可以做到这一点。当您使用循环functoid时,它将创建一个xsl:for-each
,并将创建目标节点,完全是它在源模式中出现的次数。
由于您的目标节点不是那么复杂,您最好的选择可能是使用带有内联XSLT的Scripting 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>
将其输出链接到目标架构中的FRUIT节点。