2

BizTalk マッパーを使用して 2 つのドキュメントをマップしようとしていますが、ターゲット ドキュメントは次のようになります。

<root>
  <complexType>
     <property>example</property>
  </complexType>
  <filler>
     <padding>9999999</padding>
  </filler>
  <filler>
     <padding>9999999</padding>
  </filler>
  <filler>
     <padding>9999999</padding>
  </filler>
</root>

作成するノードの数<filler>は可変 (0 から 9) です。これは基本的に計算の結果です (ソース ドキュメントで提供されたデータに基づく)。

<filler>Functoid を組み合わせてこれらのノードを作成する方法はありますか?

テーブル ループ Functoid を使用しようとしました (1 つの列のみ、パディング char '9' を持つテーブルを作成) を使用しようとしましたが<filler>、テーブルで定義されている行と同じ数のノードを作成するため、実際には機能しません。行数は可変でなければならないためです(これも計算に基づいています)。私が現在行っていることは、メッセージ (XmlDocument) を C# メソッドに渡し、プログラムで<filler>ノードを追加することです。Mapper でこれを行うための、より "BizTalk-y" な方法があることを願っています。

4

2 に答える 2

1

指摘したように、XSLTはターゲットドキュメント上にノードを自由に作成できます(私はこれを知りませんでした。これが重要な部分でした)。私が必要としていたのは、XSLTの単純なforループであることがわかりました。これに気づいたら、グーグルですばやく検索すると、次の結果が得られました。

http://quomon.com/question-How-to-make-a-for-loop-in-xslt-not-for-each-809.aspx

http://snippets.dzone.com/posts/show/930

注目に値するもう1つの点は、(最初​​のリンクで指摘されているように)XSLTは手続き型ではなく関数型言語であるため、再帰または拡張を使用する必要がある場合があります。xsl:for-eachのselect属性を使用してノードを慎重に選択することができなかったため、このケースは間違いなくその1つです(このフィラーデータはソースドキュメントの一部ではなかったため)。

具体的には、この場合、私がしたことは次のとおりです。

ScriptingFunctoidを追加します。2つの入力を追加します。

  • 値が「1」の定数(これはi変数の初期値です)
  • ループの長さ(ループの本体を繰り返す回数)

次のXSLTテンプレートを「インラインXSLT呼び出しテンプレート」スクリプトとして貼り付けます。

<xsl:template name="ForLoop"> 
<xsl:param name="i" />      <!-- index counter, 1-based, will be incremented with every recursive call -->
<xsl:param name="length" /> <!-- exit loop when i >= length -->

<!-- Output the desired node(s) if we're still looping -->
<!-- The base case is when i > length (in that case, do nothing) -->
<xsl:if test="$i &lt;= $length"> 
<Filler>
    <Padding>999999</Padding>
</Filler>
</xsl:if> 

<!-- Call the ForLoop template recursively, incrementing i -->
<xsl:if test="$i &lt;= $length"> 
<xsl:call-template name="ForLoop"> 
<xsl:with-param name="i"> 
<xsl:value-of select="$i + 1"/> 
</xsl:with-param> 
<xsl:with-param name="length"> 
<xsl:value-of select="$length"/> 
</xsl:with-param> 
</xsl:call-template> 
</xsl:if> 
</xsl:template>
于 2011-09-21T18:01:39.257 に答える
1

XSLT を変更して、この問題を解決する必要があると思います。

いくつかのロジックを追加して、計算の結果に応じた数のフィラー ノードを作成します。新しいフィラー セクションを追加するループ内で呼び出すテンプレートを作成できます。

これがあなたを正しい方向に向けることを願っています。

于 2011-09-21T09:47:01.597 に答える