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 の適切な組み合わせ、またはこの課題を解決するための別のアプローチを選択する際に、助けが必要です。

「レベル」値を持つすべてのブロックを選択し、「変更」ブロックを除外することはできますが、2 つの組み合わせを作成することはできません。

ヒント、提案は大歓迎です。

ありがとう

4

1 に答える 1

0

目に見える以上のものがあるようです

  1. 着信xmlは(ビジュアルマッパーのスキーマに従って)ネストされているように見えるので、入力xml構造の例は完全に正しくない可能性がありますか?
  2. また、RHSのスキーマがデバッチされている可能性があります。つまり、会社IDごとに1つの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>

ネストされたブロックがどのようにマップされるかについて多くの情報を提供しなかったので、その間にプレースホルダーを提供しました。

HTH!

于 2012-09-01T08:34:44.143 に答える