93 messaggi dal 28 marzo 2004
ciao a a tutti!
sto realizzando una piccola newsletter per il mio sito.
ho qiundi creato un template xslt per il messaggio da inviare via email per la registrazione dell'utente.
A questo punto, una volta effettuata la registrazione, devo inviare la mail di conferma utilizzando il mio template.
Le informazioni dell'utente registrato sono nella pagina, quindi le leggo e le imposto in alcune variabili di tipo string.
poi ho scritto questo codice, in modo da creare un documento xml in memoria e inserirci le mie costanti con ciu effettuare la trasformazione dell'xslt.
            string xslPath = HttpContext.Current.Server.MapPath("../admin/template/newsletter_new_user.xslt");
            XslCompiledTransform xslt = new XslCompiledTransform();
            xslt.Load(xslPath);
            StringBuilder sb = new StringBuilder();
            XmlWriterSettings settings = new XmlWriterSettings();
            settings.ConformanceLevel = ConformanceLevel.Auto;
            MemoryStream stream = new MemoryStream();
            XmlWriter writer = XmlWriter.Create(sb, settings);
            writer.WriteStartElement("data");
            writer.WriteElementString("nome", pNome);
            writer.WriteElementString("cognome", pCognome);
            writer.WriteEndElement();
            writer.Flush();
            stream.Position = 0;
            XmlReader xmlDoc = new XmlTextReader(stream);
            xslt.Transform(xmlDoc, writer);
            result = writer.ToString();
            writer.Close();
            writer = null;
            settings.Reset();
            settings = null;
            sb = null;
            xslt = null;


al momento dell'esecusione del Trasform però mi viene segnalato questo errore:
"Elemento di primo livello mancante."

vi mando anche il codice del file xslt

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl">
    <xsl:output method="html" indent="yes"/>
    <xsl:template match="data">
        <html>
            Benvenuto <xsl:value-of select="nome" /> <xsl:value-of select="cognome" />!<br/>
            Da oggi potrai ricevere tutte le novità di <strong>ITALSOFT</strong>            
        </html>
    </xsl:template>
</xsl:stylesheet>


mi sapreste dire il motivo?
grazie!
3.121 messaggi dal 29 ottobre 2001
Contributi | Blog
Nel tuo codice c'è parecchia confusione tra i reader e i writer, per l'oggetto che passa i dati al trasform e per l'oggetto che avrà come risultato la trasformazione. Inoltre nel foglio xslt c'è un errore.

Parto da quest'ultimo punto. Il primo tipo nel match del template dovrebbe essere sempre la root (/). Modifica il tuo codice in questo modo:

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:msxsl="urn:schemas-microsoft-com:xslt"
exclude-result-prefixes="msxsl">
    <xsl:output method="html" indent="yes"/>
    <xsl:template match="/">
        <html>
            Benvenuto <xsl:value-of select="data/nome" /><xsl:text> </xsl:text><xsl:value-of
select="data/cognome" />!<br/>
            Da oggi potrai ricevere tutte le novità di
            <strong>ITALSOFT</strong>
        </html>
    </xsl:template>
</xsl:stylesheet>


Quindi, prendendo del codice che avevo già scritto e modificato per il tuo scopo, per eseguire la trasformazione:

        XmlWriterSettings settings = new XmlWriterSettings();
        settings.ConformanceLevel = ConformanceLevel.Auto;
        StringBuilder sb1=new StringBuilder();
        XmlWriter x1 = XmlWriter.Create(sb1, settings);
        x1.WriteStartDocument();
        x1.WriteStartElement("data");
        x1.WriteElementString("nome", "a"); // da modificare
        x1.WriteElementString("cognome", "z"); // da modificare
        x1.WriteEndElement();
        x1.WriteEndDocument();
        x1.Close();
        XmlReader re = XmlTextReader.Create(new StringReader(sb1.ToString()));

        StringBuilder sb2=new StringBuilder();
        XmlWriterSettings settings2 = new XmlWriterSettings();
        settings2.ConformanceLevel = ConformanceLevel.Auto;
        XmlWriter we = XmlWriter.Create(sb2, settings2);

        string xslPath = Request.MapPath("test.xslt"); // da modificare
        XslCompiledTransform xslt = new XslCompiledTransform();
        xslt.Load(xslPath);

        xslt.Transform(re, we);
        re.Close();
        we.Flush();
        we.Close();
        result = sb2.ToString();

Ciao
Modificato da andrewz il 24 febbraio 2008 22.01 -
93 messaggi dal 28 marzo 2004
ciao andrea.
come al solito ti ringrazio molto per la disponibilità
93 messaggi dal 28 marzo 2004
riprendo questo thread per un nuovo problema riscontrato in questa funzione.
In particolare vorrei assegnare ad una variabile del file xsl una stringa contenente caratteri html (per esempio: <p>testo</p> ).
Nella successiva trasformazione dell' XmlWriter però, non viene ricostruita la stringa html ma vengono lasciati dei caratteri di escape.
(nell'esempio &lt;p&gt;test&lt;/p&gt; ).
Vorrei quindi sapere come posso fare per far in modo di riottenere il codice html corretto.
altrimenti avevo pensato a dei replace della stringa risultante dopo la trasformazione, ma se si riesce a fare in altro modo preferirei...

grazie

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.