Frage

Ich erhalte XML in BizTalk. Ein Teil ist Element und der Wert ist IDs, die durch Komma getrennt sind

<Stores>15,34</Stores>

Ich muss das in verwandeln

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

Ich muss den Wert durch Komma explodieren, jeden Wert nehmen und Wert aus der Datenbank erhalten (15 -> Speicher 1, 34 -> Speicher 2).

Wie kann ich das Explode in XSLT machen, wie ca ich einen Wert aus der Datenbank für jeden explodierten Wert bekomme. Ich habe bereits ein Verfahren in DB dafür, muss nur wissen, wie man es nennt.

War es hilfreich?

Lösung

Hier ist eine XSLT 1.0 -kompatible Lösung, die explodiert:

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

Ausgabe für <Stores>15,34</Stores> wäre:

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

Die Lösung von David Hall scheint einen Zeiger zu enthalten, in dem eine XSLT -Erweiterungsfunktion verwendet wird, um Aufrufe dieser Datenbank von XSLT zu tätigen.

Andere Tipps

Der BizTalk Mapper unterstützt XSLT 2.0 nicht (siehe MSDN -Dokumentation http://msdn.microsoft.com/en-us/library/aa559261(BTS.10).aspx) So müssen Sie die ExSLT -Erweiterungen verwenden, wenn Sie den Mapper verwenden möchten.

Es gibt einen tollen Beitrag hier Von Richard Hallgren, der behandelt, wie EXSLT im BizTalk Mapper verwendet wird.

Ein weiterer Gedanke ist eine alternative Lösung. Es ist nicht klar, ob Sie Ihre Datenbank unbedingt einzeln aufrufen müssen - würde ein einzelner Anruf funktionieren?

Es ist möglich, eine gespeicherte Prozedur eine abgrenzte Zeichenfolge als Parameter vorzulegen und dann eine Funktion zu verwenden, um diese Zeichenfolge aufzubrechen. Ich habe nachstehend ein Beispiel für eine solche Funktion beigefügt, wobei das Beispiel eine Tabellenfunktion ist. Sie können viele andere Implementierungen im Web finden.

Mit der Tabellenfunktion können Sie sich dem in Ihrem Suchverfahren anschließen.

Wenn dies Ihren Anforderungen entspricht, sollte dies viel schneller sein, da Sie jetzt nur einen einzelnen Datenbank -Hit ausführen und festgelegte Vorgänge ausführen können, um Ihre Liste der Filialen zurückzugewinnen.

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

Ich gehe davon aus, dass Sie wissen, wie Sie die Gesamtumwandlung schreiben, aber Hilfe bei der Tokenisierung der Zeichenfolge, die die Speichernummern enthält.

Wenn Sie XSLT 2.0 verwenden, schauen Sie sich die Definition der Funktion tokenize () an. Dadurch wird der Zeichenfolgenwert bei einem bestimmten Trennzeichen aufgeteilt, sodass Sie diese Transformation durchführen können. In XSLT 1 können Sie sich die EXSLT -Regex -Erweiterungsfunktionen ansehen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top