/// <summary> /// Add parameters to a transform /// </summary> /// <param name="parameterList"></param> /// <param name="xslProc"></param> private static void AddParameters(XSLParameter[] parameterList, MSXML2.IXSLProcessor xslProc) { if (parameterList != null) { foreach (XSLParameter rParam in parameterList) { // Following is a specially recognized parameter name if (rParam.Name == "prmSDateTime") { xslProc.addParameter(rParam.Name, GetCurrentDateTime(), ""); } else xslProc.addParameter(rParam.Name, rParam.Value, ""); } } }
/// <summary> /// Apply an XSLT transform on a file to produce a resulting file /// </summary> /// <param name="sTransformName">full path name of the XSLT transform</param> /// <param name="parameterList">list of parameters to pass to the transform</param> /// <param name="sInputPath">full path of the input file</param> /// <param name="sOutputName">full path of the resulting output file</param> public static void TransformFileToFile(string sTransformName, XSLParameter[] parameterList, string sInputPath, string sOutputName) { #if UsingDotNetTransforms #if DEBUG DateTime start = DateTime.Now; Debug.WriteLine("\tStarting at: " + start.TimeOfDay.ToString()); #endif TextWriter writer = null; XmlTextReader reader = null; try { // set up transform var transformer = new XslCompiledTransform(); var settings = XsltSettings.TrustedXslt; var resolver = new XmlUrlResolver(); resolver.Credentials = System.Net.CredentialCache.DefaultCredentials; transformer.Load(sTransformName, XsltSettings.TrustedXslt, resolver); // add any parameters XsltArgumentList args; AddParameters(out args, parameterList); // setup output file writer = File.CreateText(sOutputName); // load input file reader = new XmlTextReader(sInputPath) {ProhibitDtd = false, EntityHandling = EntityHandling.ExpandEntities}; // Apply transform transformer.Transform(reader, args, writer); } finally { if (writer != null) writer.Close(); if (reader != null) reader.Close(); } /* TextWriter writer = null; try { // set up transform XslTransform transformer = new XslTransform(); transformer.Load(sTransformName); // add any parameters XsltArgumentList args; AddParameters(out args, parameterList); // setup output file writer = File.CreateText(sOutputName); // load input file #if DEBUG DateTime beforeDom = DateTime.Now; Debug.WriteLine("\t\tBefore loading DOM, time is: " + beforeDom.TimeOfDay.ToString()); #endif XPathDocument inputDOM = new XPathDocument(sInputPath); #if DEBUG DateTime afterDom = DateTime.Now; Debug.WriteLine("\t\tAfter loading DOM, time is: " + afterDom.TimeOfDay.ToString()); System.TimeSpan diffDom = afterDom.Subtract(beforeDom); Debug.WriteLine("\t\tDom load took " + diffDom.ToString()); #endif // Apply transform transformer.Transform(inputDOM, args, writer, null); #if DEBUG DateTime afterXSLT = DateTime.Now; Debug.WriteLine("\t\tAfter transform, time is: " + afterXSLT.TimeOfDay.ToString()); System.TimeSpan diffXSLT = afterXSLT.Subtract(afterDom); Debug.WriteLine("\t\tTransform took " + diffXSLT.ToString()); #endif } finally { if (writer != null) writer.Close(); } */ #if DEBUG DateTime end = DateTime.Now; Debug.WriteLine("\tEnding at: " + end.TimeOfDay.ToString()); System.TimeSpan diff = end.Subtract(start); Debug.WriteLine("\tProcess took: " + diff.ToString() + " " + sOutputName); #endif #else // not UsingDotNetTransforms //.Net framework XML transform is still slower than something like MSXML2 // (this is so especially for transforms using xsl:key). try { bool fShowOutput = true; //if (sTransformName.Contains("PAWSSKHtmlMapper.xsl")) // fShowOutput = true; MessageBox.Show("in transform file"); MSXML2.XSLTemplate40Class xslt = new MSXML2.XSLTemplate40Class(); MSXML2.FreeThreadedDOMDocument40Class xslDoc = new MSXML2.FreeThreadedDOMDocument40Class(); MSXML2.DOMDocument40Class xmlDoc = new MSXML2.DOMDocument40Class(); MSXML2.IXSLProcessor xslProc; xslDoc.async = false; //if (fShowOutput) //MessageBox.Show("before load transform: " + sTransformName); xslDoc.load(sTransformName); xslt.stylesheet = xslDoc; xmlDoc.async = false; //if (fShowOutput) // MessageBox.Show("before load input path: " + sInputPath); xmlDoc.load(sInputPath); xslProc = xslt.createProcessor(); xslProc.input = xmlDoc; //if (fShowOutput) //MessageBox.Show("before add parameters"); AddParameters(parameterList, xslProc); if (fShowOutput) MessageBox.Show("before transform file"); xslProc.transform(); if (fShowOutput) MessageBox.Show("before write output to |" + sOutputName + "|"); StreamWriter sr = File.CreateText(sOutputName); sr.Write(xslProc.output); sr.Close(); if (fShowOutput) MessageBox.Show("after write output to |" + sOutputName + "|"); } catch (Exception exc) { MessageBox.Show("Exception caught in transform files: " + exc.Message + "inner: " + exc.InnerException.Message); } #endif // UsingDotNetTransforms }
private static void AddParameters(out XsltArgumentList args, XSLParameter[] parameterList) { args = new XsltArgumentList(); if (parameterList != null) { foreach(XSLParameter rParam in parameterList) { // Following is a specially recognized parameter name if (rParam.Name == "prmSDateTime") { args.AddParam(rParam.Name, "", GetCurrentDateTime()); } else args.AddParam(rParam.Name, "", rParam.Value); } } }
/// <summary> /// Apply an XSLT transform on a file to produce a resulting file /// </summary> /// <param name="sTransformName">full path name of the XSLT transform</param> /// <param name="parameterList">list of parameters to pass to the transform</param> /// <param name="sInputPath">full path of the input file</param> /// <param name="sOutputName">full path of the resulting output file</param> public static void TransformFileToFile(string sTransformName, XSLParameter[] parameterList, string sInputPath, string sOutputName) { #if DEBUG Debug.WriteLine("Transform: " + sTransformName + " input file: " + sInputPath); DateTime start = DateTime.Now; Debug.WriteLine("\tStarting at: " + start.TimeOfDay.ToString()); #endif #if UsingDotNetTransforms // set up transform XslCompiledTransform transformer = new XslCompiledTransform(); transformer.Load(sTransformName); // add any parameters XsltArgumentList args; AddParameters(out args, parameterList); // setup output file using (var writer = File.CreateText(sOutputName)) { // load input file using (var reader = new XmlTextReader(sInputPath)) { #if NET_4_0 && !__MonoCS__ reader.DtdProcessing = DtdProcessing.Parse; #else reader.ProhibitDtd = false; #endif reader.EntityHandling = EntityHandling.ExpandEntities; // Apply transform transformer.Transform(reader, args, writer); } } #else // not UsingDotNetTransforms //.Net framework XML transform is still slower than something like MSXML2 // (this is so especially for transforms using xsl:key). MSXML2.XSLTemplate60Class xslt = new MSXML2.XSLTemplate60Class(); MSXML2.FreeThreadedDOMDocument60Class xslDoc = new MSXML2.FreeThreadedDOMDocument60Class(); MSXML2.DOMDocument60Class xmlDoc = new MSXML2.DOMDocument60Class(); MSXML2.IXSLProcessor xslProc; xslDoc.async = false; xslDoc.setProperty("ResolveExternals", true); xslDoc.setProperty("ProhibitDTD", false); xslDoc.load(sTransformName); xslt.stylesheet = xslDoc; xmlDoc.setProperty("ResolveExternals", true); xmlDoc.setProperty("ProhibitDTD", false); xmlDoc.async = false; xmlDoc.load(sInputPath); xslProc = xslt.createProcessor(); xslProc.input = xmlDoc; AddParameters(parameterList, xslProc); xslProc.transform(); StreamWriter sr = File.CreateText(sOutputName); sr.Write(xslProc.output); sr.Close(); #endif // UsingDotNetTransforms #if DEBUG DateTime end = DateTime.Now; Debug.WriteLine("\tEnding at: " + end.TimeOfDay.ToString()); System.TimeSpan diff = end.Subtract(start); Debug.WriteLine("\tProcess took: " + diff.ToString() + " " + sOutputName); #endif }