From: Oleg T. <he...@us...> - 2005-11-12 21:29:06
|
Update of /cvsroot/mvp-xml/Common/v2/src/Xsl In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv17018/v2/src/Xsl Modified Files: XslReader.cs Added Files: MvpXslTransform.cs Log Message: --- NEW FILE: MvpXslTransform.cs --- using System; using System.IO; using System.Xml; using System.Xml.Xsl; using System.Xml.XPath; namespace Mvp.Xml.Common.Xsl { public class MvpXslTransform { XslCompiledTransform compiledTransform; public MvpXslTransform(XslCompiledTransform transform) { if (transform == null) throw new ArgumentNullException("transform"); this.compiledTransform = transform; } #if false // do we want support old transform here as well? XslTransform oldTransform; public MvpXslTransform(XslTransform transform) { if (transform == null) throw new ArgumentNullException("transform"); this.oldTransform = transform; } #endif public virtual void Transform(XmlInput defaulDocument, XsltArgumentList args, XmlOutput output) { XmlWriter xmlWriter = output.destination as XmlWriter; bool closeWriter = false; if (xmlWriter != null) { closeWriter = true; while (true) { TextWriter txtWriter = output.destination as TextWriter; if (txtWriter != null) { xmlWriter = XmlWriter.Create(txtWriter, this.compiledTransform.OutputSettings); break; } Stream strm = output.destination as Stream; if (strm != null) { xmlWriter = XmlWriter.Create(strm, this.compiledTransform.OutputSettings); break; } String str = output.destination as String; if (str != null) { // BugBug: We should read doc before creating output file in case they are the same xmlWriter = XmlWriter.Create(str, this.compiledTransform.OutputSettings); break; } throw new Exception("Unexpected XmlOutput"); } } try { TransformToWriter(defaulDocument, args, xmlWriter); } finally { if (closeWriter) { xmlWriter.Close(); } } } private static XmlReaderSettings ReaderSettings; static MvpXslTransform() { ReaderSettings = new XmlReaderSettings(); ReaderSettings.ProhibitDtd = true; } private void TransformToWriter(XmlInput defaulDocument, XsltArgumentList args, XmlWriter xmlWriter) { XmlReader xmlReader = defaulDocument.source as XmlReader; if (xmlReader != null) { compiledTransform.Transform(xmlReader, args, xmlWriter, defaulDocument.resolver); return; } string str = defaulDocument.source as string; if (str != null) { using (XmlReader reader = XmlReader.Create(str, ReaderSettings)) { compiledTransform.Transform(reader, args, xmlWriter, defaulDocument.resolver); } return; } Stream strm = defaulDocument.source as Stream; if (strm != null) { using (XmlReader reader = XmlReader.Create(strm, ReaderSettings)) { compiledTransform.Transform(reader, args, xmlWriter, defaulDocument.resolver); } return; } TextReader txtReader = defaulDocument.source as TextReader; if (txtReader != null) { using (XmlReader reader = XmlReader.Create(txtReader, ReaderSettings)) { compiledTransform.Transform(reader, args, xmlWriter, defaulDocument.resolver); } return; } IXPathNavigable nav = defaulDocument.source as IXPathNavigable; if (nav != null) { if (defaulDocument.resolver is XmlUrlResolver) { compiledTransform.Transform(nav, args, xmlWriter); } else { // ToDo: It s just API limitation. We can implement it though reflection. // Limitatio of this approach is that part of MvpXslransform will work only in FullTrust scenarious. throw new NotImplementedException("IXPathNavigable + XmlResolver is not suported by XslCompiledTransform."); } return; } throw new Exception("Unexpected XmlInput"); } XmlWriterSettings DefaultWriterSettings { get { if (this.compiledTransform != null) { return this.compiledTransform.OutputSettings; } else { return new XmlWriterSettings(); } } } } } Index: XslReader.cs =================================================================== RCS file: /cvsroot/mvp-xml/Common/v2/src/Xsl/XslReader.cs,v retrieving revision 1.2 retrieving revision 1.3 diff -u -d -r1.2 -r1.3 --- XslReader.cs 12 Nov 2005 15:44:06 -0000 1.2 +++ XslReader.cs 12 Nov 2005 21:28:59 -0000 1.3 @@ -1,3 +1,4 @@ +#region using using System; using System.Collections.Generic; using System.Text; @@ -6,10 +7,20 @@ using System.Xml.Xsl; using System.Xml.XPath; using System.Diagnostics; -using System.Threading; +using System.Threading; +#endregion namespace Mvp.Xml.Common.Xsl { - class XslReader : XmlReader { + + /// <summary> + /// <para>XslReader provides an efficient way to read results of an XSL + /// transformation via an <see cref="XmlReader"/> API. Due to + /// architectural and performance reasons the <see cref="XslCompiledTransform"/> + /// class doesn't support transforming to an <see cref="XmlReader"/> as obsolete + /// <see cref="XslTransform"/> class did and XslReader's goal is to + /// supplement such functionality.</para> + /// </summary> + public class XslReader : XmlReader { static string NsXml = "http://www.w3.org/XML/1998/namespace"; static string NsXmlNs = "http://www.w3.org/2000/xmlns/"; static int defaultBufferSize = 256; @@ -67,14 +78,14 @@ this.depth = 0; SetUndefinedState(ReadState.Initial); if (multiThread) { - this.thread = new Thread(new ThreadStart(this.StrartTransform)); + this.thread = new Thread(new ThreadStart(this.StartTransform)); this.thread.Start(); } else { - StrartTransform(); + StartTransform(); } } - private void StrartTransform() { + private void StartTransform() { try { while (true) { XmlReader xmlReader = defaulDocument.source as XmlReader; |