2

私はこのスキーマを持っています:

<Root>
  <Customers>
    <Customer>
      <ID>123</ID>
      <Name>John</Name>
    </Customer>
  </Customers>
  <Order>
    <ID>ABC</ID>
    <Title>Boat</Title>
  </Order>
</Root>

2つの異なるレコードを次のように1つの繰り返しレコードにマップする必要があります。

<Root>
  <Data>
    <ID>123</ID>
    <Text>John</Text>
  </Data>
  <Data>
    <ID>ABC</ID>
    <Text>Boat</Text>
  </Data>
</Root>

2つのテーブルループ(1つは顧客用、もう1つは注文用)を作成しようとしましたが、次のようになりました。

<Root>
  <Data>
    <ID>ABC</ID>
    <Text>Boat</Text>
  </Data>
</Root>

2行でループする1つのテーブルを試し、同じ結果を得ました。(ゲートオプションを使用して、違いがないかどうかを確認しました)

実際には、スキーマは巨大で、マップは非常に複雑で(私が作成したものではありません)、多くのファンクトイドと多くのワイヤーがあります。そのため、カスタムXSLの作成は避けたいと思います。これは、このタスクでは簡単ですが、保守が難しくなります。これは私が変更する必要がある唯一の部分です。

誰か?ありがとう。

4

3 に答える 3

3

複雑なマッピングの場合、カスタムXSLTを使用すると、ほとんどの場合、BizTalkマップでよく見られるクモの巣よりも単純で保守しやすくなります。ただし、あなたが述べたように、あなたは小さなセクションを変更するだけなので、完全なマップを再コーディングすることを避ける必要があります。

Scripting Functoidで「インラインXSLT呼び出しテンプレート」スクリプトタイプを使用して、最高のBizTalkマップとカスタムXSLTを組み合わせることができるはずです。

Sean B. Durkinの回答を拡張して、2つのCall Templateファンクトイドを設定する必要があります。最初のファンクトイドは、出力の「データ」ノードに接続されています。

<xsl:template name="DataTemplate">
    <xsl:apply-templates select="//*[local-name()='Customer']|//*[local-name()='Order']" />
</xsl:template>

2番目の呼び出しテンプレートは、関連するデータを現在の出力「データ」ノードに出力します。この2番目のFunctoidは、出力ドキュメントのどのノードにも配線する必要がないことに注意してください。

<xsl:template match="*[local-name()='Customer']|*[local-name()='Order']">
    <xsl:element name="Data">
      <xsl:element name="ID">
          <xsl:value-of select="*[local-name()='ID']"/>
      </xsl:element>
      <xsl:element name="Text">
          <xsl:value-of select="*[local-name()='Name']|*[local-name()='Title']" />
      </xsl:element>
    </xsl:element>
</xsl:template>
于 2012-09-05T01:16:20.527 に答える
2

ここでXSLTを使用する必要はありません。ループするファンクトイドをマップ上にドラッグするだけです。Functoidへの入力としてCustomerレコードとOrderレコードの両方を接続します(はい、複数の入力を持つことができます)。ファンクトイドの出力をデータレコードに接続します。次に、フィールドを直接接続します(ID-> ID、名前->テキスト)。これは機能します。

Looping Functoidへの個々の入力レコードは、それ自体でレコードを繰り返す必要はありません。複数の入力をFunctoidに接続することにより、インスタンスのコレクションをループします。

于 2014-02-03T23:20:01.963 に答える
1
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes"/>

<xsl:template match="/">
 <Root>
   <xsl:apply-templates select="*/Customers/Customer|*/Order"/>
 </Root>
</xsl:template>

<xsl:template match="Customer|Order">
 <Data>
   <ID><xsl:value-of select="ID" /></ID>
   <Text><xsl:value-of select="Name|Title" /></Text>
 </Data>
</xsl:template>

</xsl:stylesheet>
于 2012-09-04T15:38:02.237 に答える