使用BizTalk Map从两个输入模式生成交叉产品

时间:2014-12-29 16:45:43

标签: biztalk biztalk-2010 biztalk-mapper

我在BizTalk中使用多对一映射,以生成输出模式,其中包含使用输入模式节点上的跨产品逻辑生成的数据。

下图描绘了我已经完成的事情:

enter image description here

示例输入xmls如下:

<!-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. 没有循环functoid的输出
  2. 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
    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
      2. 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 个答案:

答案 0 :(得分:1)

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

这就是我的进展:

  1. 从地图中删除所有连接和functoid
  2. 添加脚本功能
  3. 将InputMesagePart_0连接到脚本functoid的输入
  4. 将Scripting functoid连接到输出架构的第一个元素节点
  5. 在Script Functoid Configuration中,添加转换逻辑。例如,在我的情况下,逻辑是:
  6. <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>

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