Biztalk 从同一消息中丰富消息

Biztalk 从同一消息中丰富消息,biztalk,biztalk-2010,Biztalk,Biztalk 2010,使用Biztalk 2010,我收到了具有以下结构的传入消息: <xml><blocks> <block id="level"> <message id="code">100</message> <message id="description">Some description</message> </block> <block id="level"> <message id="c

使用Biztalk 2010,我收到了具有以下结构的传入消息:

<xml><blocks>
<block id="level">
<message id="code">100</message>
<message id="description">Some description</message>
</block>
<block id="level">
<message id="code">101</message>
<message id="description">More description</message>
</block>
</blocks>
<blocks>
<block id="change">
<message id="table">1</message>
<message id="oldvalue">100</message>
<message id="newvalue">101</message>
</block>
</blocks>
</xml>
<terms>
<termItem>
<code>100</code>
<description>Some description</description>
<deleted>false</deleted>
</termItem>
<termItem>
.....and so on with values from the above xml file, except that the item from the "change" block should be added as a new record to output, so the total output will be 3 items (<block>). 
地图视图如下所示:

我需要一些帮助来选择要使用的functoid的正确组合,或者选择另一种方法来解决这个难题

我可以选择所有具有“level”值的块并过滤掉“change”块,但无法将两者结合起来

欢迎任何提示和建议


谢谢

这里似乎有很多东西

  • 传入的xml似乎是嵌套的(根据VisualMapper中的模式),因此示例输入xml结构可能不太正确
  • 此外,可能是RHS上的架构已取消匹配,即每个公司id有一条PaymentTerms消息,因此,除非您只需要映射第一个公司,否则您将需要为所有映射的公司创建一个包装架构(具有任意根节点),然后在发送之前取消匹配
  • 也就是说,通过使用。我假设您的图表上的RHS模式是真实的输出模式(不是您的示例)

    关于如何映射嵌套块,您没有提供太多信息,因此我同时提供了占位符


    您好,谢谢,是的,我可以看到我的问题遗漏了一些东西,所以这里有一个更新。我从源系统得到了一些真实的输出。应该将输出映射到所有“block id=“Payment Terms”和所有“Change Log Entry”的目标,其中字段“Type of Change" == 2. 希望这能让事情变得更清楚:-)输入xml在这里:和预期的输出。谢谢-谢谢,使用自定义xslt和地图解决了问题。因此,感谢HTH的输入。@user155814-很高兴它有帮助-apols,今天没有时间查看更新的xml#DaytimeJobs很差劲;)
    <xsl:stylesheet version="1.0"
      xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      exclude-result-prefixes="xsl xsi">
      <xsl:output method="xml" indent="yes" />
      <xsl:strip-space elements="*" />
    
      <!--Outer template-->
      <xsl:template match="/">
        <PaymentTerms CompanyCode="Unsure">
          <xsl:apply-templates />
        </PaymentTerms>
      </xsl:template>
    
      <!--Root blocks only-->
      <xsl:template match="block[@id='level']">
        <PaymentTerm>
          <Code>
            <xsl:value-of select="message[@id='code']/text()"/>
          </Code>
          <Description>
            <xsl:value-of select="message[@id='description']/text()"/>
          </Description>
          <Deleted>
            <!--No idea how you want this populated-->
            <xsl:value-of select="'false'"/>
          </Deleted>
        </PaymentTerm>
        <xsl:apply-templates select="blocks/block"></xsl:apply-templates>
      </xsl:template>
    
      <!--Nested blocks only-->
      <xsl:template match="block[@id='change']">
        <PaymentTerm>
          <Code>
            NestedCode
          </Code>
          <Description>
            NestedDescription
          </Description>
          <Deleted>
            NestedDeleted
          </Deleted>
        </PaymentTerm>
      </xsl:template>
    </xsl:stylesheet>