2

我在 BizTalk 中使用多对一映射来生成输出架构,其中包含使用输入架构节点上的叉积逻辑生成的数据。

下图描述了我已经完成的工作:

在此处输入图像描述

示例输入 xml 如下:

<!-Schema1 Instance-->
<Root>
    <Data>
        <ItemCode>10</ItemCode>
        <ItemCost>1024</ItemCost>
    </Data>
    <Data>
        <ItemCode>20</ItemCode>
        <ItemCost>2048</ItemCost>
    </Data>
</Root>

<!-Schema2 Instance-->
<Root>
    <Data>
        <Code>10</Code>
        <ShipAddr>addr11101</ShipAddr>
    </Data>
    <Data>
        <Code>30</Code>
        <ShipAddr>addr33301</ShipAddr>
    </Data>
    <Data>
        <Code>20</Code>
        <ShipAddr>addr22201</ShipAddr>
    </Data>
    <Data>
        <Code>10</Code>
        <ShipAddr>addr11102</ShipAddr>
    </Data>
</Root>

所需的输出基于基于 Schema1.ItemCode 和 Schema2.Code 的相等性执行的叉积。样品如下:

<!--Output Schema Instance required; Order of records is irrelevant-->
<Root>
    <Data>
        <Code>10</Code>
        <ItemCost>1024</ItemCost>
        <ShipAddr>addr11101</ShipAddr>
    </Data>
    <Data>
        <Code>20</Code>
        <ItemCost>2048</ItemCost>
        <ShipAddr>addr22201</ShipAddr>
    </Data>
    <Data>
        <Code>10</Code>
        <ItemCost>1024</ItemCost>
        <ShipAddr>addr11102</ShipAddr>
    </Data>
</Root>

实际输出:

  1. 没有循环仿函数的输出

XML 输出

<ns0:Root xmlns:ns0="http://TestTO_DELETE.SchemaOut">
    <Data>
        <Code>10</Code><ItemCost>1024</ItemCost><ShipAddr>addr11101</ShipAddr>
    </Data>
    <Data><Code>20</Code></Data>
</ns0:Root>
  1. 带有两个循环 functoid 连接 1 和 2 的输出

XML 输出

<ns0:Root xmlns:ns0="http://TestTO_DELETE.SchemaOut">
    <Data>
        <Code>10</Code>
    </Data>
    <Data>
        <Code>20</Code>
    </Data>
    <Data />
    <Data />
    <Data />
    <Data />
</ns0:Root>
  1. 单循环 functoid 连接的输出 1

XML 输出

<ns0:Root xmlns:ns0="http://TestTO_DELETE.SchemaOut">
    <Data>
        <Code>10</Code><ItemCost>1024</ItemCost><ShipAddr>addr11101</ShipAddr>
    </Data>
    <Data>
        <Code>20</Code>
    </Data>
</ns0:Root>

请建议在这种情况下如何进行?

4

1 回答 1

1

我尝试了各种 functoid 组合来获得所需的输出模式,但没有任何效果。所以,我终于开始使用脚本functoid,这符合我的目的。我发布我的发现,因为它可能对其他人有帮助。

我就是这样进行的:

  1. 从地图中删除所有连接和仿函数
  2. 添加脚本 functoid
  3. 将 InputMesagePart_0 连接到脚本 functoid 的输入
  4. 将 Scripting functoid 连接到输出模式的第一个元素节点
  5. 在 Script Functoid Configuration 中,添加转换逻辑。例如,在我的情况下,逻辑是:

<xsl:template name="Template1">
    <xsl:param name="MessagePart_0_Xml" /> <!--Not used anywhere-->
    <xsl:variable name="Msg_0_RootNode" select="/*[local-name()='Root']/*[local-name()='InputMessagePart_0']/*[local-name()='Root']" />
    <xsl:variable name="Msg_1_RootNode" select="/*[local-name()='Root']/*[local-name()='InputMessagePart_1']/*[local-name()='Root']" />
    <xsl:for-each select="$Msg_0_RootNode/Data">
        <xsl:variable name="Msg_0_DataNode" select="." />
        <xsl:for-each select="$Msg_1_RootNode/Data">
	        <xsl:variable name="Msg_1_DataNode" select="." />
	        <xsl:if test="$Msg_0_DataNode/ItemCode/text() = $CostCenterDataNode/Code/text()">
	            <ItemCost>
	                <xsl:value-of select="$Msg_0_DataNode/ItemCost/text()" />
                </ItemCost>
	            <ShipAddr>
                    <xsl:value-of select="$CostCenterDataNode/ShipAddr/text()" />
	            </ShipAddr>
            </xsl:if>
        </xsl:for-each>
    </xsl:for-each>
</xsl:template>

如果有更好的方法来解决这个问题,请提出建议。

于 2014-12-30T17:43:14.533 回答