1

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

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

任何提示,建议都非常受欢迎。

谢谢

4

1 回答 1

0

似乎有更多的东西

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

也就是说,通过使用自定义 xslt 而不是视觉映射器来获得输出的一般结构相对简单。我假设你的图表上的 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>

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

于 2012-09-01T08:34:44.143 回答