1 // XslCompiledTransform.cs
4 // Atsushi Enomoto <atsushi@ximian.com>
6 // Copyright (C) 2005 Novell Inc. http://www.novell.com
10 // Permission is hereby granted, free of charge, to any person obtaining
11 // a copy of this software and associated documentation files (the
12 // "Software"), to deal in the Software without restriction, including
13 // without limitation the rights to use, copy, modify, merge, publish,
14 // distribute, sublicense, and/or sell copies of the Software, and to
15 // permit persons to whom the Software is furnished to do so, subject to
16 // the following conditions:
18 // The above copyright notice and this permission notice shall be
19 // included in all copies or substantial portions of the Software.
21 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
22 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
23 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
24 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
25 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
26 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
27 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
33 using System.CodeDom.Compiler;
34 using System.Collections;
37 using System.Runtime.InteropServices;
38 using System.Security;
39 using System.Security.Policy;
40 using System.Xml.XPath;
43 namespace System.Xml.Xsl
46 // FIXME: Of cource this is just a stub for now.
47 public sealed class XslCompiledTransform
52 #if !TARGET_JVM && !MOBILE
53 // TempFileCollection temporary_files;
55 XmlWriterSettings output_settings = new XmlWriterSettings ();
57 public XslCompiledTransform ()
62 public XslCompiledTransform (bool enableDebug)
64 enable_debug = enableDebug;
66 debugger = new NoOperationDebugger ();
67 output_settings.ConformanceLevel = ConformanceLevel.Fragment;
71 public XmlWriterSettings OutputSettings {
72 get { return output_settings; }
75 #if !TARGET_JVM && !MOBILE
77 public TempFileCollection TemporaryFiles {
78 get { return null; /*temporary_files;*/ }
84 public void Transform (string inputfile, string outputfile)
86 using (Stream outStream = File.Create (outputfile)) {
87 Transform (new XPathDocument (inputfile, XmlSpace.Preserve), null, outStream);
91 public void Transform (string inputfile, XmlWriter output)
93 Transform (inputfile, null, output);
96 public void Transform (string inputfile, XsltArgumentList args, Stream output)
98 Transform (new XPathDocument (inputfile, XmlSpace.Preserve), args, output);
101 public void Transform (string inputfile, XsltArgumentList args, TextWriter output)
103 Transform (new XPathDocument (inputfile, XmlSpace.Preserve), args, output);
106 public void Transform (string inputfile, XsltArgumentList args, XmlWriter output)
108 Transform (new XPathDocument (inputfile, XmlSpace.Preserve), args, output);
111 public void Transform (XmlReader reader, XmlWriter output)
113 Transform (reader, null, output);
116 public void Transform (XmlReader reader, XsltArgumentList args, Stream output)
118 Transform (new XPathDocument (reader, XmlSpace.Preserve), args, output);
121 public void Transform (XmlReader reader, XsltArgumentList args, TextWriter output)
123 Transform (new XPathDocument (reader, XmlSpace.Preserve), args, output);
126 public void Transform (XmlReader reader, XsltArgumentList args, XmlWriter output)
128 Transform (reader, args, output, null);
131 public void Transform (IXPathNavigable input, XsltArgumentList args, TextWriter output)
133 Transform (input.CreateNavigator (), args, output);
136 public void Transform (IXPathNavigable input, XsltArgumentList args, Stream output)
138 Transform (input.CreateNavigator (), args, output);
141 public void Transform (IXPathNavigable input, XmlWriter output)
143 Transform (input, null, output);
146 public void Transform (IXPathNavigable input, XsltArgumentList args, XmlWriter output)
148 Transform (input.CreateNavigator (), args, output, null);
151 public void Transform (XmlReader input, XsltArgumentList args, XmlWriter output, XmlResolver resolver)
153 Transform (new XPathDocument (input, XmlSpace.Preserve).CreateNavigator (), args, output, resolver);
156 void Transform (XPathNavigator input, XsltArgumentList args, XmlWriter output, XmlResolver resolver)
159 throw new XsltException ("No stylesheet was loaded.", null);
161 Outputter outputter = new GenericOutputter (output, s.Outputs, null);
162 new XslTransformProcessor (s, debugger).Process (input, outputter, args, resolver);
166 void Transform (XPathNavigator input, XsltArgumentList args, Stream output)
168 XslOutput xslOutput = (XslOutput)s.Outputs[String.Empty];
169 Transform (input, args, new StreamWriter (output, xslOutput.Encoding));
172 void Transform (XPathNavigator input, XsltArgumentList args, TextWriter output)
175 throw new XsltException ("No stylesheet was loaded.", null);
177 Outputter outputter = new GenericOutputter(output, s.Outputs, output.Encoding);
178 new XslTransformProcessor (s, debugger).Process (input, outputter, args, null);
187 private XmlReader GetXmlReader (string url)
189 XmlResolver res = new XmlUrlResolver ();
190 Uri uri = res.ResolveUri (null, url);
191 Stream s = res.GetEntity (uri, null, typeof (Stream)) as Stream;
192 XmlTextReader xtr = new XmlTextReader (uri.ToString (), s);
193 xtr.XmlResolver = res;
194 XmlValidatingReader xvr = new XmlValidatingReader (xtr);
195 xvr.XmlResolver = res;
196 xvr.ValidationType = ValidationType.None;
200 public void Load (string url)
202 using (XmlReader r = GetXmlReader (url)) {
207 public void Load (XmlReader stylesheet)
209 Load (stylesheet, null, null);
212 public void Load (IXPathNavigable stylesheet)
214 Load (stylesheet.CreateNavigator(), null, null);
217 public void Load (IXPathNavigable stylesheet, XsltSettings settings, XmlResolver resolver)
219 Load (stylesheet.CreateNavigator(), settings, resolver);
222 public void Load (XmlReader stylesheet, XsltSettings settings, XmlResolver resolver)
224 Load (new XPathDocument (stylesheet, XmlSpace.Preserve).CreateNavigator (), settings, resolver);
227 public void Load (string stylesheet, XsltSettings settings, XmlResolver resolver)
229 Load (new XPathDocument (stylesheet, XmlSpace.Preserve).CreateNavigator (), settings, resolver);
232 private void Load (XPathNavigator stylesheet,
233 XsltSettings settings, XmlResolver resolver)
235 s = new Compiler (debugger).Compile (stylesheet, resolver, null);
241 class NoOperationDebugger
243 protected void OnCompile (XPathNavigator input)
247 protected void OnExecute (XPathNodeIterator currentNodeset, XPathNavigator style, XsltContext context)
249 //ShowLocationInTrace (style);
252 string ShowLocationInTrace (XPathNavigator style)
254 IXmlLineInfo li = style as IXmlLineInfo;
255 return li != null ? String.Format ("at {0} ({1},{2})", style.BaseURI, li.LineNumber, li.LinePosition) : "(no debug info available)";