【问题标题】:Enrich message from within same message从同一消息中丰富消息
【发布时间】:2012-08-31 19:12:05
【问题描述】:

使用 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 的正确组合或解决此挑战的另一种方法时,我需要一些帮助。

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

非常欢迎任何提示、建议。

谢谢

【问题讨论】:

    标签: biztalk biztalk-2010


    【解决方案1】:

    似乎不止是眼前一亮

    1. 传入的 xml 似乎是嵌套的(根据可视化映射器中的架构),因此示例输入 xml 结构可能不太正确?
    2. 另外,RHS 上的架构可能是分批的,即每个公司 ID 有一条 PaymentTerms 消息,因此除非您只需要映射第一个公司,否则您需要为所有映射的公司创建一个包装器架构,其中任意根节点,然后在发送前将它们分批。

    也就是说,使用custom xslt instead of the visual mapper 获得输出的一般结构相对简单。我假设你的图表上的 RHS 模式是真正的输出模式(不是你的术语示例)。

    <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>
    

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

    HTH!

    【讨论】:

    • 嗨 HTH,谢谢,是的,我可以看到我在问题中遗漏了一些内容,所以这里有一个更新。我从源系统中获得了一些真实的输出。输出应该映射到所有“block id="Payment Terms" 和所有“更改日志条目”的目标,其中字段“更改类型”== 2。希望这应该更清楚:-)输入 xml 在这里:link 和预期输出 dl.dropbox.com/u/970327/xml_output.xml。谢谢 - 干杯弗兰克
    • 谢谢,使用带有地图的自定义 xslt 解决了问题。所以感谢 HTH 的输入。
    • @user155814 - 很高兴它有帮助 - apols,今天没有时间查看您更新的 xml。 #DayTimeJobSucks ;)
    猜你喜欢
    • 1970-01-01
    • 2014-03-12
    • 1970-01-01
    • 2012-07-30
    • 1970-01-01
    • 2020-08-12
    • 2013-03-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多