2

BizTalkにXMLを受信して​​います。一部は要素であり、値はコンマで区切られたIDです

<Stores>15,34</Stores>

これをに変換する必要があります

<Stores>
    <Store>Store 1</Store>
    <Store>Store 4</Store>
</Stores>

私がする必要があるのは、値をコンマで分解し、各値を取得してデータベースから値を取得することです(15->ストア1、34->ストア2)。

xsltで分解を行うにはどうすればよいですか、分解された値ごとにデータベースから値を取得するにはどうすればよいですか。私はすでにそのためのプロシージャをdbに持っています、ただそれを呼び出す方法を知る必要があります。

4

3 に答える 3

2

爆発を実行するXSLT1.0互換ソリューションは次のとおりです。

<!-- straightforward -->
<xsl:template match="Stores">
  <xsl:copy>
    <xsl:call-template name="explode">
      <xsl:with-param name="str" select="text()" />
    </xsl:call-template>
  </xsl:copy>
</xsl:template>

<!-- string processing through recursion -->
<xsl:template name="explode">
  <xsl:param name="str" select="''" />

  <xsl:variable name="temp" select="concat($str, ',')" />
  <xsl:variable name="head" select="substring-before($temp, ',')" />
  <xsl:variable name="tail" select="substring-after($temp, ',')" />

  <xsl:if test="$head != ''">
    <Store>
      <xsl:value-of select="$head" />
    </Store>
    <xsl:call-template name="explode">
      <xsl:with-param name="str" select="$tail" />
    </xsl:call-template>
  </xsl:if>
</xsl:template>

の出力は次の<Stores>15,34</Stores>ようになります。

<Stores>
  <Store>Store 15</Store>
  <Store>Store 34</Store>
</Stores>

David Hallのソリューションには、XSLT拡張関数を使用してXSLTからそのデータベースを呼び出す方法へのポインターが含まれているようです。

于 2009-09-23T17:10:47.230 に答える
2

BizTalk マッパーは XSLT 2.0 をサポートしていません (MSDN ドキュメントhttp://msdn.microsoft.com/en-us/library/aa559261(BTS.10).aspxを参照) 。マッパーを使用します。

BizTalk マッパー内で EXSLT を使用する方法について説明している、Richard Hallgren による素晴らしい投稿があります。

もう1つの考えは、代替ソリューションについてです。データベース呼び出しを 1 つずつ行う必要があるかどうかは明確ではありません。1 回の呼び出しでうまくいくのでしょうか。

ストアド プロシージャに区切り文字列をパラメーターとして指定し、関数を使用してこの文字列を分割することができます。そのような関数の例を以下に示します。その例はテーブル関数です。ウェブ上で他の多くの実装を見つけることができます。

テーブル関数を使用すると、ストア ルックアップ プロシージャでこれに対して結合できます。

これでニーズが満たされる場合は、データベース ヒットを 1 回だけ実行し、セット操作を実行してストアのリストを取得できるため、はるかに高速になるはずです。

CREATE function fn_ParseCSVString
(   
    @INPUTCSV varchar(MAX)
)
RETURNS @TBL TABLE 
( 
    COL1 INT
)
AS
BEGIN
DECLARE @NUM_STR NVARCHAR(MAX)
SET @NUM_STR = @INPUTCSV

SET @NUM_STR = REPLACE(@NUM_STR,' ','')     
-- this will trim any intermediate spaces

WHILE LEN(@NUM_STR) >= 0
BEGIN 

DECLARE @@SUBSTR VARCHAR(100) 
IF CHARINDEX(',',@NUM_STR,0) <> 0   
BEGIN   
SET @@SUBSTR = SUBSTRING(@NUM_STR,0,CHARINDEX(',',@NUM_STR,0))   
INSERT INTO @TBL VALUES(@@SUBSTR)  
END 
ELSE   
BEGIN   
INSERT INTO @TBL VALUES(@NUM_STR)   
BREAK   
END  

SET @@SUBSTR = @@SUBSTR + ',' 

SET @NUM_STR = SUBSTRING(@NUM_STR, CHARINDEX(',',@NUM_STR,0) + 1, LEN(@NUM_STR)) 

END
RETURN
END
于 2009-09-22T22:19:33.087 に答える
1

全体的な変換の書き方はわかっているものの、店舗番号を含む文字列のトークン化については助けが必要だと思います。

XSLT 2.0 を使用している場合は、tokenize() 関数の定義を確認してください。これにより、指定された区切り文字で文字列値が分割され、この変換を実行できるようになります。XSLT 1 では、EXSLT 正規表現拡張関数を見ることができます。

于 2009-09-21T20:35:42.977 に答える