Pregunta

Estoy recibiendo XML en BizTalk. Una parte es elemento y el valor se ids separados por comas

<Stores>15,34</Stores>

Necesito transformar esto en

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

Lo que tengo que hacer es hacer explotar el valor de coma, tome cada valor y obtener valor a partir de la base de datos (15 -> Tienda 1, 34 -> Tienda 2).

¿Cómo puedo hacer que la explotan en XSLT, cómo CA consigo el valor de la base de datos para cada valor explotado. Ya tengo procedimiento en dB para eso, sólo tiene que saber cómo llamarlo.

¿Fue útil?

Solución

Aquí es un 1,0 solución compatible XSLT que hace el explotar:

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

Salida para <Stores>15,34</Stores> sería:

<Stores>
  <Store>Store 15</Store>
  <Store>Store 34</Store>
</Stores>
La solución de

David Hall parece contener un puntero cómo utilizar una función de extensión XSLT para realizar llamadas a la base de datos de XSLT.

Otros consejos

El BizTalk Mapper no soporta XSLT 2.0 (ver MSDN Documentación http://msdn.microsoft.com/en-us/library/aa559261 (BTS.10) .aspx ) por lo que tendrá que utilizar las extensiones EXSLT si desea utilizar el asignador.

Hay un gran post aquí por Richard Hallgren que cubre cómo utilizar EXSLT dentro del asignador de BizTalk.

Un pensamiento adicional se trata de una solución alternativa. No está claro si es absolutamente necesario que su base de datos de llamadas de uno a uno? - sería hacer un solo identificador de llamada

Es posible proporcionar un procedimiento almacenado una cadena delimitada como parámetro y a continuación, utilizar una función de romper esta cadena arriba. He incluido un ejemplo de una función de este tipo a continuación, el ejemplo es una función de tabla. Podrás encontrar un montón de otras implementaciones en la web.

Con la función de tabla puede unirse contra esta en ti almacenar procedimiento de búsqueda.

Si esto se adapte a sus necesidades debe ser mucho más rápido ya que ahora realiza una sola base de datos de golpe y puede realizar operaciones de ajuste para volver a su lista de tiendas.

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

Asumo que sabe cómo escribir la transformación global, pero necesitan ayuda con la tokenización de la cadena que contiene los números de las tiendas.

Si está utilizando XSLT 2.0, mirar a la definición de la función tokenize (). Esto dividirá el valor de cadena a un delimitador especificado, lo que permite realizar esta transformación. En XSLT 1 usted podría mirar a EXSLT funciones de extensión de expresiones regulares.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top