1

我目前正在做一个 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>

我需要映射做的是确保如果有任何可用的水果,则目标中至少有两条记录“水果”可用。这应该通过向目标添加通用水果(如果您愿意,可以考虑一些任意菠萝)来实现,如果源中只有一种水果可用。

作为第一步,我尝试在目标中再添加一个水果节点,但没有这样做。我非常有信心,如果我知道如何做到这一点,我可以通过将其与“计数记录”和“逻辑相等”(=1)functoids 相结合来解决实际问题。

所以问题归结为:如何将单个记录添加到映射内的目标?

我尝试了几个选项(以及这些选项的组合),即:

  • 在元素“fruit”或“item”上使用循环functoid,以及一些额外的值映射。
  • 直接添加额外的值映射
  • 在“item”或“fruit”和“FRUIT”之间添加直接链接,中间有或没有循环functoid。

在大多数情况下,要么我得到一个包含像这样的孩子的结果

<FRUIT>
    <SORT>Pear</SORT>
    <SORT>Pineapple</SORT>
    <SIZE>8cm</SIZE>
    <COLOUR>green</COLOUR>
</FRUIT>

(以及相应的错误,因为这不满足模式 - 它不允许多个元素排序),或者一大堆菠萝。这两者都不是所希望的。

谁能帮我吗?

4

1 回答 1

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>

将 go 的输出链接到目标模式中的 FRUIT 节点。

于 2015-04-15T18:56:18.493 回答