Biztalk 在 XSLT 转换方面呈爆炸式增长
-
12-09-2019 - |
题
我正在将 XML 接收到 BizTalk 中。一部分是element,值是用逗号分隔的ids
<Stores>15,34</Stores>
我需要将其转换为
<Stores>
<Store>Store 1</Store>
<Store>Store 4</Store>
</Stores>
我需要做的是用逗号分解值,取出每个值并从数据库中获取值(15 -> Store 1, 34 -> Store 2)。
如何在 xslt 中进行爆炸,如何从数据库中获取每个爆炸值的值。我已经在数据库中有相应的过程,只需要知道如何调用它。
解决方案
下面是确实的XSLT 1.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>
大卫·霍尔的解决方案似乎包含指向如何使用XSLT扩展功能,使从XSLT该数据库调用。
其他提示
BizTalk 映射器不支持 XSLT 2.0(请参阅 MSDN 文档 http://msdn.microsoft.com/en-us/library/aa559261(BTS.10).aspx)因此,如果您想使用映射器,则需要使用 EXSLT 扩展。
有一个很棒的帖子 这里 作者:Richard Hallgren,介绍了如何在 BizTalk Mapper 中使用 EXSLT。
另外一个想法是关于替代解决方案。目前尚不清楚您是否绝对必须逐一进行数据库调用 - 进行一次调用是否有效?
可以向存储过程提供分隔字符串作为参数,然后使用函数来分解该字符串。我在下面提供了此类函数的示例,该示例是表函数。您将能够在网络上找到许多其他实现。
使用表函数,您可以在存储查找过程中对此进行连接。
如果这满足您的需求,它应该会快得多,因为您现在只需执行一次数据库命中,并且可以执行设置操作来取回商店列表。
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
我假设你知道如何写的整体转换,但需要与包含商店数字字符串的标记化帮助。
如果您使用XSLT 2.0,看记号化()函数的定义。这将在指定的分隔符分割字符串值,让您进行这种转变。在XSLT 1你可以看看EXSLT正则表达式的扩展功能。