5 votes

XSLT - comment mettre le XML original dans le résultat de la transformation en mode de sortie texte

J'essaie de créer une transformation dont la sortie sera du texte mais incluant aussi le xml original. J'ai simplement obtenu le message xml qui doit être transformé en insertion SQL, mais en cas d'erreur SQL, je veux également insérer le message xml original dans la base de données.

L'entrée est par exemple :

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

Le résultat de la transformation devrait être alors :

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

Le problème est que si je règle la sortie dans XSLT sur 'text', aucune balise xml n'est incluse (seulement les valeurs). Existe-t-il donc un mode de sortie mixte ou un remplacement d'attribut ?

Merci pour toute aide.

4voto

empo Points 12803

Avant d'aborder cette solution (je ne sais pas si vous pouvez trouver une meilleure solution grâce à XSLT), considérez également les problèmes que vous rencontrerez avec des entrées et sorties beaucoup plus complexes.

Même si les puristes rejetteront cette réponse (et la question aussi), vous pouvez utiliser la méthode de sortie "xml" pour faire une astuce (très moche) :

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

sorties :

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

1voto

Michael Kay Points 52194

Certains processeurs (par exemple Saxon) disposent d'une fonction d'extension serialize() qui vous permet de convertir un nœud XML en une représentation XML sérialisée, que la fonction renvoie sous forme de chaîne. Vous pouvez appeler cette fonction et l'afficher dans votre résultat textuel. Si votre processeur ne dispose pas d'une telle fonction d'extension, il n'est pas difficile d'en écrire une.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X