2011-09-01 11 views
5

Estoy intentando crear una transformación cuya salida será texto pero también incluirá el xml original. Simplemente recibí el mensaje xml que debería transformarse en inserción SQL, pero en el caso de un error SQL también quiero insertar el mensaje xml original en la base de datos.XSLT - cómo poner el XML original en el resultado de transformación en el modo de salida de texto

La entrada es, por ejemplo:

<message><tag name="foo">dummy</tag></message> 

El resultado de la transformación debe ser entonces:

INSERT INTO table (column) VALUES ('dummy') 
IF @@error <> 0 
BEGIN 
    INSERT INTO errMsgLog (message) VALUES ('<message><tag name="foo">dummy</tag></message>') 
END 

El problema es que si i establecer la salida en XSLT para 'texto' no hay xml etiquetas incluidas (solo los valores). Entonces, ¿hay algún modo de salida mixta o anulación de atributo?

Gracias por cualquier ayuda.

Respuesta

4

Antes de abordar esta solución (no sé si a través de XSLT puede encontrar una solución mejor), también considere los problemas que encontrará con entradas y salidas mucho más complejas.

Aunque los puristas rechazan esta respuesta (y la pregunta también), puede utilizar el método de salida "xml" para hacer una (muy feo) engaño:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:output omit-xml-declaration="yes"/>  
    <xsl:strip-space elements="*"/> 

    <xsl:template match="/"> 
     <xsl:text disable-output-escaping="yes">INSERT INTO table (column) VALUES ('dummy') 
IF @@error &lt;> 0 
BEGIN 
    INSERT INTO errMsgLog (message) VALUES ('</xsl:text> 
     <xsl:copy-of select="."/><xsl:text>') 
END</xsl:text> 
    </xsl:template> 

</xsl:stylesheet> 

salidas:

INSERT INTO table (column) VALUES ('dummy') 
IF @@error <> 0 
BEGIN 
    INSERT INTO errMsgLog (message) VALUES ('<message><tag name="foo">dummy</tag></message>') 
END 
+0

Gracias por una buena idea. Todo lo que tuve que hacer fue no establecer el modo de salida en absoluto (solo omit-xml-declaration = "yes"). –

+0

Sí, como en mi ejemplo. Esto es porque xml es el método de salida predeterminado. –

1

Algunos procesadores (por ejemplo, Saxon) tienen una función de extensión serialize() que le permite convertir un nodo XML en una representación XML serializada, que la función devuelve como una cadena. Puedes llamar esto y luego mostrarlo en tu resultado de texto. Si su procesador no tiene dicha función de extensión, entonces puede no ser difícil escribir una.

+0

Hay un ** [buen hilo] (http://stackoverflow.com/questions/6696382/xslt-how-to-convert-xml-node-to-string) ** en SO sobre esto, si estoy entendiendo lo que @Michael está sugiriendo (+1) –

Cuestiones relacionadas