BizTalk explodiert in XSLT -Transformationen
-
12-09-2019 - |
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.
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.