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