我正在将 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正则表达式的扩展功能。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top