2011-09-01 10 views
5

sto provando a creare una trasformazione il cui output sarà testo ma anche xml originale. Semplicemente ho ricevuto il messaggio xml che dovrebbe essere trasformato in SQL insert ma in caso di errore SQL voglio inserire anche il messaggio xml originale nel database.XSLT: come trasformare l'XML originale in trasformazione in modalità di output testo

L'ingresso è ad esempio:

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

Il risultato della trasformazione dovrebbe essere quindi:

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

Il problema è che se i impostare l'uscita in XSLT 'testo' non ci sono XML tag inclusi (solo i valori). Quindi c'è qualche modalità di output mista o override di attributo?

Grazie per qualsiasi aiuto.

risposta

4

Prima di affrontare questa soluzione (non so se tramite XSLT puoi trovare qualche soluzione migliore), considera anche i problemi che incontrerai con input e output molto più complessi.

Anche se i puristi rifiuteranno questa risposta (e la questione anche), è possibile utilizzare il metodo di uscita "xml" per fare un (molto brutta) inganno:

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

uscite:

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

Grazie per la buona idea. Tutto quello che dovevo fare era non impostare affatto la modalità di output (solo omit-xml-declaration = "yes"). –

+0

Sì come nel mio esempio. Questo perché xml è il metodo di output predefinito. –

1

Alcuni processori (ad esempio Saxon) hanno una funzione di estensione serialize() che consente di convertire un nodo XML in una rappresentazione XML serializzata, che la funzione restituisce come stringa. Potresti chiamare questo e quindi emetterlo nel risultato del tuo testo. Se il tuo processore non ha questa funzione di estensione, potrebbe non essere difficile scriverne uno.

+0

C'è un ** [buon thread] (http://stackoverflow.com/questions/6696382/xslt-how-to-convert-xml-node-to-string) ** in SO su questo, se sono capire cosa sta suggerendo @Michael (+1) –

Problemi correlati