public static string Transform( string xmlPath, XsltArgumentList argList ) { string html = null; try { string transformFile = RulesEngineUtils.GetResourcePath( RulesEngineUtils.ReportBuilderFolder.Resources, "InstanceReport.xslt" ); XslCompiledTransform transform = new XslCompiledTransform(); transform.Load( transformFile ); using( MemoryStream ms = new MemoryStream() ) { XmlWriterSettings xSettings = new XmlWriterSettings(); xSettings.ConformanceLevel = ConformanceLevel.Fragment; xSettings.Encoding = Encoding.ASCII; xSettings.Indent = true; xSettings.OmitXmlDeclaration = true; //we REALLY need to set this to HTML xSettings.GetType().GetProperty( "OutputMethod" ).SetValue( xSettings, XmlOutputMethod.Html, null ); using( XmlWriter xWriter = XmlWriter.Create( ms, xSettings ) ) { transform.Transform( xmlPath, argList, xWriter ); } ms.Flush(); html = Encoding.ASCII.GetString( ms.ToArray() ); } } catch( Exception ex ) { html = "<h2>Error <small>generating preview</small></h2>"+ "<pre>"+ ex.Message +"</pre>"; } return html; }
/// <summary> /// Generates HTML report files if allowed by this.<see cref="ReportFormat"/> and as specified by this.<see cref="HtmlReportFormat"/>. /// </summary> /// <returns>True on success, false on fail.</returns> private bool GenerateHtmlFiles() { // Use custom XSLT if provided string transformFile = String.Empty; if (!String.IsNullOrEmpty(this.xsltStylesheetPath)) { //executor.Invoke(this.xsltStylesheetPath); transformFile = this.xsltStylesheetPath; } else { transformFile = RulesEngineUtils.GetResourcePath( RulesEngineUtils.ReportBuilderFolder.Resources, RulesEngineUtils.TransformFile ); //executor.Invoke(transformFile); } if( !File.Exists( transformFile ) ) { executor.Invoke("Conversion aborted"); Trace.TraceError( "Error: Transform File not found at:\n\t" + transformFile + "\nHtml Conversion aborted." ); return false; } bool anyFiles = false; //load the transform once for all R-files XslCompiledTransform transform = new XslCompiledTransform(); try { transform.Load(transformFile); } catch ( XmlException ) { Trace.TraceError("Error: Transform File contains invalid XML:\n\t" + transformFile + "\nHtml Conversion aborted."); return false; } catch ( XsltException ) { Trace.TraceError("Error: Transform File contains invalid XSLT:\n\t" + transformFile + "\nHtml Conversion aborted."); return false; } XsltArgumentList argList = new XsltArgumentList(); argList.Clear(); if( this.HtmlReportFormat == HtmlReportFormat.Complete ) { argList.AddParam( "asPage", string.Empty, "true" ); } argList.AddParam( "numberDecimalSeparator", string.Empty, Thread.CurrentThread.CurrentCulture.NumberFormat.NumberDecimalSeparator ); argList.AddParam( "numberGroupSeparator", string.Empty, Thread.CurrentThread.CurrentCulture.NumberFormat.NumberGroupSeparator ); argList.AddParam( "numberGroupSize", string.Empty, Thread.CurrentThread.CurrentCulture.NumberFormat.NumberGroupSizes[ 0 ].ToString() ); XmlWriterSettings writerSettings = new XmlWriterSettings(); writerSettings.Encoding = InstanceReport.Encoding; writerSettings.Indent = true; writerSettings.OmitXmlDeclaration = true; //set intelligent HTML output writerSettings.GetType().GetProperty( "OutputMethod" ).SetValue( writerSettings, XmlOutputMethod.Html, null ); foreach( ReportHeader header in this.currentFilingSummary.MyReports ) { switch( header.ReportType ) { case ReportHeaderType.Notes: case ReportHeaderType.Sheet: break; default: continue; } string inFile = Path.Combine( this.currentReportDirectory, header.XmlFileName ); if( !File.Exists( inFile ) ) { Trace.TraceWarning( "Warning: The FilingSummary provided '"+ header.XmlFileName +"' but the file was not found." + separator +"\tReport skipped: "+ header.LongName ); continue; } int extLen = Path.GetExtension( header.XmlFileName ).Length; string outFile = inFile.Substring( 0, inFile.Length - extLen ) +".htm"; using( XmlReader xReader = XmlReader.Create( inFile ) ) { using( FileStream msOut = new FileStream( outFile, FileMode.Create, FileAccess.Write ) ) { try { using( RivetXmlWriter xWriter = new RivetXmlWriter( msOut, writerSettings ) ) { transform.Transform( xReader, argList, xWriter ); } anyFiles = true; header.HtmlFileName = Path.GetFileName( outFile ); } catch( Exception ex ) { Trace.TraceWarning( "Warning: An error occurred while converting '" + header.XmlFileName + "' to HTML." + separator + "\tError: " + ex.Message + separator + "\tReport skipped: " + header.LongName ); } } } } if( !anyFiles ) return true; string styleSheetTo = Path.Combine( this.currentReportDirectory, RulesEngineUtils.StylesheetFile ); string stylesheetFrom = RulesEngineUtils.GetResourcePath( RulesEngineUtils.ReportBuilderFolder.Resources, RulesEngineUtils.StylesheetFile ); FileUtilities.Copy( stylesheetFrom, styleSheetTo ); string javascriptTo = Path.Combine( this.currentReportDirectory, RulesEngineUtils.JavascriptFile ); string javascriptFrom = RulesEngineUtils.GetResourcePath( RulesEngineUtils.ReportBuilderFolder.Resources, RulesEngineUtils.JavascriptFile ); FileUtilities.Copy( javascriptFrom, javascriptTo ); return true; }