Xsd 使用BizTalk映射器将单个重复节点添加到目标架构

Xsd 使用BizTalk映射器将单个重复节点添加到目标架构,xsd,biztalk,biztalk-mapper,Xsd,Biztalk,Biztalk Mapper,我目前正在从事一个BizTalk项目,我遇到了一个问题,我相信这个问题应该可以在映射中解决。然而,我似乎不知道怎么做。希望有人能帮我 情况如下:在源模式和目标模式中,都有一个重复节点,其下的子元素大致相同,不涉及记录或属性。源中的重复节点具有如下结构: <fruit> <item> <sort>Apple</sort> <size>5cm</size> <colo

我目前正在从事一个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>
而目标中的重复节点看起来更像这样:

<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 functoid来解决实际问题

因此,问题归结为:如何在映射中向目标添加单个记录

我尝试了几种选项和组合,即:

在元素水果或项目上使用循环functoid,以及一些额外的值映射。 直接添加额外的值映射 在项目或水果和水果之间添加直接链接,在两者之间添加或不添加循环functoid。 在大多数情况下,要么我得到了一个包含如下儿童的结果

<FRUIT>
    <SORT>Pear</SORT>
    <SORT>Pineapple</SORT>
    <SIZE>8cm</SIZE>
    <COLOUR>green</COLOUR>
</FRUIT>
还有一个相应的错误,因为这不满足模式-不允许多个元素排序,或者一堆菠萝。这两个都不是我想要的


有人能帮我吗?

不幸的是,在BizTalk mapper中没有简单的方法可以做到这一点。当您使用循环functoid时,它将为每个节点创建一个xsl:for,并将创建与它在源架构中出现的次数完全相同的目标节点

由于您的目标节点没有那么复杂,因此最好使用脚本Functoid和内联XSLT,使用以下命令:

<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节点。

在我们进一步讨论之前,您的输出示例不是有效的XML,因此使用任何工具都很难生成此示例。您确定这就是您需要的吗?要添加到@Johns-305的注释中:具体地说,XML必须有一个根元素。您还忘了在收尾尺寸标记中添加>。最后,如果您发布XSLT,将更容易为您提供更好的帮助。谢谢。我希望从我的措辞中可以清楚地看到,我只给出了重复节点的可能结构。这只是一个更大的XML的一部分,当然,在某个地方有一个根节点。至于XSLT:因为我尝试了几个选项,但都没有给出期望的结果,而且因为我实际上认为可视化映射器应该足够了,所以我看不出这会给问题增加什么。请随意纠正我!不要给出任何实际的模式:对于这个问题,只要做最简单的事情就可以了:添加一个根,添加您喜欢的名称空间,使水果或项目成为maxoccurs unbounded的ComplexType;排序、大小或颜色元素。给所有需要类型的东西类型string.FRUIT确实是某个东西的子元素,我希望从我提供的上下文中可以清楚地看到这一点。唉,事实并非如此。然而,即使这样,这也不能回答我的问题。我不希望每个项目节点都有一个对应的结果节点,我希望在这个节点上再添加一个带子树的节点结果。事实上,我希望避免在编排中使用XPath。建议的编辑:将问题重命名为如何确保循环functoid至少循环两次或更多,并从问题的一开始就明确表示希望目标节点至少出现两次。