J'ai un programme.
Il génère un flux XML.
J'ai une feuille XSL.
Je veux récupérer, sous forme d'un TextWriter, le résultat de la transformation de mon flux XML.
Comment je fais ?
Là franchement, je cherche à droite à gauche, à chaque fois je trouve des exemple qui partent de fichiers sur le disque, et les écrivent sur le disque...
http://msdn2.microsoft.com/fr-fr/library/66f54faw.aspx
Moi je veux bien que XslCompiledTransform soit plus rapide, mais si c'est pour passer obligatoirement par le disque, je ne vois pas trop là où je gagne...
En gros, ce truc me va bien, sauf que mon "books.xml" est un XmlDocument.
Je veux bien passer par un XPathDocument, mais il est readonly.
Et bosser dans un XmlDocument, faire un save dans un ms, puis recharger le ms dans un XPathDocument, faire la transformation, et enfin envoyer à mon TextWriter, je trouve ça plus que moyen... Surtout si le document Xml en question est volumineux !
Code :
- // Execute the transformation.
- XslCompiledTransform xslt = new XslCompiledTransform();
- xslt.Load("output.xsl" );
- MemoryStream ms = new MemoryStream();
- xslt.Transform(new XPathDocument("books.xml" ), null, ms);
- // Load the results into an XPathDocument object.
- ms.Seek(0, SeekOrigin.Begin);
- XPathDocument doc = new XPathDocument(ms);
|
Une idée ?
Actuellement, j'ai ça :
Code :
- protected override void Render(System.Web.UI.HtmlTextWriter writer)
- {
- Response.Clear();
- Response.ContentEncoding = System.Text.Encoding.UTF8;
- Response.ContentType = "text/html";
- XmlDocument xmlPage = new XmlDocument();
- xmlPage.Load(MapPath(string.Format("Pages/{0}.xml", this.page)));
- XmlDocument resPage = RenderPage(xmlPage);
- XslTransform xslPage = new XslTransform();
- xslPage.Load(MapPath(string.Format("Pages/xsl/{0}.xsl", xmlPage.SelectSingleNode("page/template" ).Attributes["name"].Value)));
- xslPage.Transform(resPage.CreateNavigator(), null, Response.Output);
- if (Request.QueryString["debug"] != null)
- {
- resPage.Save(MapPath("/debug.xml" ));
- }
- resPage = null;
- xslPage = null;
- xmlPage = null;
- }
|
Note de fin de post : c'est résolu (Arjuna, ou comment se prendre la tête deux heures pour rien)
En fait :
Code :
- XslCompiledTransform xslPage = new XslCompiledTransform(true);
- xslPage.Load(MapPath(string.Format("Pages/xsl/{0}.xsl", xmlPage.SelectSingleNode("page/template" ).Attributes["name"].Value)));
- xslPage.Transform(resPage.CreateNavigator(), null, Response.Output);
|
C'est la même syntaxe, y'a pas un caractère de différent
Faut dire qu'ils sont cons, XPathNavigator et XPathNavigable c'est la même chose
(du moins, le cast est implicite entre les deux)
Et moi qui trouvais pas comment faire un Navigable à partir du Navigator 