2

入力スキーマのノードでクロス積ロジックを使用して生成されたデータで出力スキーマを生成するために、BizTalk で多対 1 マッピングを使用しています。

次の図は、私がまだ行ったことを示しています。

ここに画像の説明を入力

サンプルの入力 xml は次のとおりです。

<!-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 のない出力

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 の両方を含む出力

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

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>

そのようなシナリオでどのように進めるかを提案してください。

4

1 に答える 1

1

Functoid のさまざまな組み合わせを試して、必要な出力スキーマを取得しましたが、何も機能しませんでした。そのため、最終的にスクリプト Functoid を使用するようになりました。これは私の目的を果たしました。他の誰かに役立つかもしれないので、私の発見を投稿します。

これが私が進めた方法です:

  1. マップからすべての接続と Functoid を削除します
  2. スクリプト Functoid を追加する
  3. InputMesagePart_0 をスクリプト Functoid の入力に接続します
  4. スクリプト Functoid を出力スキーマの最初の要素ノードに接続します。
  5. スクリプト Functoid 構成で、変換ロジックを追加します。たとえば、私の場合、ロジックは次のとおりです。

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

この問題にアプローチするより良い方法がある場合は、提案してください。

于 2014-12-30T17:43:14.533 に答える