2

我正在将 XML 接收到 BizTalk 中。一部分是元素,值是用逗号分隔的 ids

<Stores>15,34</Stores>

我需要将其转换为

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

我需要做的是用逗号分解值,获取每个值并从数据库中获取值(15 -> Store 1, 34 -> Store 2)。

如何在 xslt 中进行分解,如何从数据库中获取每个分解值的值。我已经在 db 中有程序,只需要知道如何调用它。

4

3 回答 3

2

BizTalk Mapper 不支持 XSLT 2.0(请参阅 MSDN 文档http://msdn.microsoft.com/en-us/library/aa559261(BTS.10).aspx),因此您需要使用 EXSLT 扩展使用映射器。

Richard Hallgren在这里发表了一篇很棒的文章,其中介绍了如何在 BizTalk Mapper 中使用 EXSLT。

另一个想法是关于替代解决方案。目前尚不清楚您是否绝对必须一个一个地调用您的数据库 - 进行一次调用会起作用吗?

可以为存储过程提供一个分隔字符串作为参数,然后使用一个函数来分解这个字符串。我在下面包含了一个这样的函数的例子,这个例子是一个表函数。您将能够在网络上找到许多其他实现。

使用 table 函数,您可以在存储查找过程中加入反对这一点。

如果这满足您的需求,它应该会快很多,因为您现在只执行一次数据库命中,并且可以执行集合操作来取回您的商店列表。

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 回答
2

这是一个与 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>

David Hall 的解决方案似乎包含如何使用 XSLT 扩展函数从 XSLT 调用该数据库的指针。

于 2009-09-23T17:10:47.230 回答
1

我假设您知道如何编写整体转换,但在包含商店编号的字符串的标记化方面需要帮助。

如果您使用的是 XSLT 2.0,请查看 tokenize() 函数的定义。这将在指定的分隔符处拆分字符串值,允许您执行此转换。在 XSLT 1 中,您可以查看 EXSLT 正则表达式扩展函数。

于 2009-09-21T20:35:42.977 回答