1 // System.Xml.Xsl.XslTransform
\r
4 // Tim Coleman <tim@timcoleman.com>
\r
5 // Gonzalo Paniagua Javier (gonzalo@ximian.com)
\r
7 // (C) Copyright 2002 Tim Coleman
\r
8 // (c) 2003 Ximian Inc. (http://www.ximian.com)
\r
12 // Permission is hereby granted, free of charge, to any person obtaining
\r
13 // a copy of this software and associated documentation files (the
\r
14 // "Software"), to deal in the Software without restriction, including
\r
15 // without limitation the rights to use, copy, modify, merge, publish,
\r
16 // distribute, sublicense, and/or sell copies of the Software, and to
\r
17 // permit persons to whom the Software is furnished to do so, subject to
\r
18 // the following conditions:
\r
20 // The above copyright notice and this permission notice shall be
\r
21 // included in all copies or substantial portions of the Software.
\r
23 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
\r
24 // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
\r
25 // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
\r
26 // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
\r
27 // LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
\r
28 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
\r
29 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
\r
33 using System.Collections;
\r
36 using System.Runtime.InteropServices;
\r
37 using System.Security;
\r
38 using System.Security.Policy;
\r
39 using System.Xml.XPath;
\r
42 namespace System.Xml.Xsl {
\r
43 internal class SimpleXsltDebugger
\r
45 public void OnCompile (XPathNavigator style)
\r
47 Console.Write ("Compiling: ");
\r
48 PrintXPathNavigator (style);
\r
49 Console.WriteLine ();
\r
52 public void OnExecute (XPathNodeIterator currentNodeSet, XPathNavigator style, XsltContext xsltContext)
\r
54 Console.Write ("Executing: ");
\r
55 PrintXPathNavigator (style);
\r
56 Console.WriteLine (" / NodeSet: (type {1}) {0} / XsltContext: {2}", currentNodeSet, currentNodeSet.GetType (), xsltContext);
\r
59 void PrintXPathNavigator (XPathNavigator nav)
\r
61 IXmlLineInfo li = nav as IXmlLineInfo;
\r
62 li = li != null && li.HasLineInfo () ? li : null;
\r
63 Console.Write ("({0}, {1}) element {2}", li != null ? li.LineNumber : 0, li != null ? li.LinePosition : 0, nav.Name);
\r
67 public sealed class XslTransform {
\r
69 internal static readonly bool TemplateStackFrameError;
\r
70 internal static readonly TextWriter TemplateStackFrameOutput;
\r
72 static XslTransform ()
\r
74 string env = Environment.GetEnvironmentVariable ("MONO_XSLT_STACK_FRAME");
\r
77 TemplateStackFrameOutput = Console.Out;
\r
80 TemplateStackFrameOutput = Console.Error;
\r
83 TemplateStackFrameError = true;
\r
88 static object GetDefaultDebugger ()
\r
90 string env = Environment.GetEnvironmentVariable ("MONO_XSLT_DEBUGGER");
\r
93 if (env == "simple")
\r
94 return new SimpleXsltDebugger ();
\r
95 object obj = Activator.CreateInstance (Type.GetType (env));
\r
99 public XslTransform ()
\r
100 : this (GetDefaultDebugger ())
\r
104 internal XslTransform (object debugger)
\r
106 this.debugger = debugger;
\r
110 CompiledStylesheet s;
\r
111 XmlResolver xmlResolver = new XmlUrlResolver ();
\r
113 [MonoTODO] // FIXME: audit security check
\r
116 [Obsolete ("You should pass XmlResolver to Transform() method", false)]
\r
118 public XmlResolver XmlResolver {
\r
120 xmlResolver = value;
\r
127 [Obsolete ("You should pass XmlResolver to Transform() method", false)]
\r
129 public XmlReader Transform (IXPathNavigable input, XsltArgumentList args)
\r
131 return Transform (input.CreateNavigator (), args, xmlResolver);
\r
135 public XmlReader Transform (IXPathNavigable input, XsltArgumentList args, XmlResolver resolver)
\r
137 XmlReader Transform (IXPathNavigable input, XsltArgumentList args, XmlResolver resolver)
\r
140 return Transform (input.CreateNavigator (), args, resolver);
\r
145 [Obsolete ("You should pass XmlResolver to Transform() method", false)]
\r
147 public XmlReader Transform (XPathNavigator input, XsltArgumentList args)
\r
149 return Transform (input, args, xmlResolver);
\r
152 public XmlReader Transform (XPathNavigator input, XsltArgumentList args, XmlResolver resolver)
\r
154 XmlReader Transform (XPathNavigator input, XsltArgumentList args, XmlResolver resolver)
\r
157 // todo: is this right?
\r
158 MemoryStream stream = new MemoryStream ();
\r
159 Transform (input, args, new XmlTextWriter (stream, null), resolver);
\r
160 stream.Position = 0;
\r
161 return new XmlTextReader (stream, XmlNodeType.Element, null);
\r
166 [Obsolete ("You should pass XmlResolver to Transform() method", false)]
\r
168 public void Transform (IXPathNavigable input, XsltArgumentList args, TextWriter output)
\r
170 Transform (input.CreateNavigator (), args, output, xmlResolver);
\r
173 public void Transform (IXPathNavigable input, XsltArgumentList args, TextWriter output, XmlResolver resolver)
\r
175 void Transform (IXPathNavigable input, XsltArgumentList args, TextWriter output, XmlResolver resolver)
\r
178 Transform (input.CreateNavigator (), args, output, resolver);
\r
183 [Obsolete ("You should pass XmlResolver to Transform() method", false)]
\r
185 public void Transform (IXPathNavigable input, XsltArgumentList args, Stream output)
\r
187 Transform (input.CreateNavigator (), args, output, xmlResolver);
\r
190 public void Transform (IXPathNavigable input, XsltArgumentList args, Stream output, XmlResolver resolver)
\r
192 void Transform (IXPathNavigable input, XsltArgumentList args, Stream output, XmlResolver resolver)
\r
195 Transform (input.CreateNavigator (), args, output, resolver);
\r
200 [Obsolete ("You should pass XmlResolver to Transform() method", false)]
\r
202 public void Transform (IXPathNavigable input, XsltArgumentList args, XmlWriter output)
\r
204 Transform (input.CreateNavigator (), args, output, xmlResolver);
\r
207 public void Transform (IXPathNavigable input, XsltArgumentList args, XmlWriter output, XmlResolver resolver)
\r
209 void Transform (IXPathNavigable input, XsltArgumentList args, XmlWriter output, XmlResolver resolver)
\r
212 Transform (input.CreateNavigator (), args, output, resolver);
\r
217 [Obsolete ("You should pass XmlResolver to Transform() method", false)]
\r
219 public void Transform (XPathNavigator input, XsltArgumentList args, XmlWriter output)
\r
221 Transform (input, args, output, xmlResolver);
\r
224 public void Transform (XPathNavigator input, XsltArgumentList args, XmlWriter output, XmlResolver resolver)
\r
226 void Transform (XPathNavigator input, XsltArgumentList args, XmlWriter output, XmlResolver resolver)
\r
230 throw new XsltException ("No stylesheet was loaded.", null);
\r
232 Outputter outputter = new GenericOutputter (output, s.Outputs, null);
\r
233 new XslTransformProcessor (s, debugger).Process (input, outputter, args, resolver);
\r
239 [Obsolete ("You should pass XmlResolver to Transform() method", false)]
\r
241 public void Transform (XPathNavigator input, XsltArgumentList args, Stream output)
\r
243 Transform (input, args, output, xmlResolver);
\r
246 public void Transform (XPathNavigator input, XsltArgumentList args, Stream output, XmlResolver resolver)
\r
248 void Transform (XPathNavigator input, XsltArgumentList args, Stream output, XmlResolver resolver)
\r
251 XslOutput xslOutput = (XslOutput)s.Outputs[String.Empty];
\r
252 Transform (input, args, new StreamWriter (output, xslOutput.Encoding), resolver);
\r
257 [Obsolete ("You should pass XmlResolver to Transform() method", false)]
\r
259 public void Transform (XPathNavigator input, XsltArgumentList args, TextWriter output)
\r
261 Transform (input, args, output, xmlResolver);
\r
264 public void Transform (XPathNavigator input, XsltArgumentList args, TextWriter output, XmlResolver resolver)
\r
266 void Transform (XPathNavigator input, XsltArgumentList args, TextWriter output, XmlResolver resolver)
\r
270 throw new XsltException ("No stylesheet was loaded.", null);
\r
272 Outputter outputter = new GenericOutputter(output, s.Outputs, output.Encoding);
\r
273 new XslTransformProcessor (s, debugger).Process (input, outputter, args, resolver);
\r
280 [Obsolete ("You should pass XmlResolver to Transform() method", false)]
\r
282 public void Transform (string inputfile, string outputfile)
\r
284 Transform (inputfile, outputfile, xmlResolver);
\r
288 public void Transform (string inputfile, string outputfile, XmlResolver resolver)
\r
290 void Transform (string inputfile, string outputfile, XmlResolver resolver)
\r
293 using (Stream s = new FileStream (outputfile, FileMode.Create, FileAccess.ReadWrite)) {
\r
294 Transform(new XPathDocument (inputfile).CreateNavigator (), null, s, resolver);
\r
300 public void Load (string url)
\r
305 public void Load (string url, XmlResolver resolver)
\r
307 XmlResolver res = resolver;
\r
309 res = new XmlUrlResolver ();
\r
310 Uri uri = res.ResolveUri (null, url);
\r
311 using (Stream s = res.GetEntity (uri, null, typeof (Stream)) as Stream) {
\r
312 XmlTextReader xtr = new XmlTextReader (uri.ToString (), s);
\r
313 xtr.XmlResolver = res;
\r
314 XmlValidatingReader xvr = new XmlValidatingReader (xtr);
\r
315 xvr.XmlResolver = res;
\r
316 xvr.ValidationType = ValidationType.None;
\r
317 Load (new XPathDocument (xvr, XmlSpace.Preserve).CreateNavigator (), resolver, null);
\r
323 [Obsolete("You should pass evidence.", false)]
\r
325 public void Load (XmlReader stylesheet)
\r
327 Load (stylesheet, null, null);
\r
332 [Obsolete("You should pass evidence.", false)]
\r
334 public void Load (XmlReader stylesheet, XmlResolver resolver)
\r
336 Load (stylesheet, resolver, null);
\r
341 [Obsolete("You should pass evidence.", false)]
\r
343 public void Load (XPathNavigator stylesheet)
\r
345 Load (stylesheet, null, null);
\r
350 [Obsolete("You should pass evidence.", false)]
\r
352 public void Load (XPathNavigator stylesheet, XmlResolver resolver)
\r
354 Load (stylesheet, resolver, null);
\r
359 [Obsolete("You should pass evidence.", false)]
\r
361 public void Load (IXPathNavigable stylesheet)
\r
363 Load (stylesheet.CreateNavigator(), null);
\r
368 [Obsolete("You should pass evidence.", false)]
\r
370 public void Load (IXPathNavigable stylesheet, XmlResolver resolver)
\r
372 Load (stylesheet.CreateNavigator(), resolver);
\r
375 // Introduced in .NET 1.1
\r
377 public void Load (IXPathNavigable stylesheet, XmlResolver resolver, Evidence evidence)
\r
379 internal void Load (IXPathNavigable stylesheet, XmlResolver resolver, Evidence evidence)
\r
382 Load (stylesheet.CreateNavigator(), resolver, evidence);
\r
386 public void Load (XPathNavigator stylesheet, XmlResolver resolver, Evidence evidence)
\r
388 internal void Load (XPathNavigator stylesheet, XmlResolver resolver, Evidence evidence)
\r
391 s = new Compiler (debugger).Compile (stylesheet, resolver, evidence);
\r
395 public void Load (XmlReader stylesheet, XmlResolver resolver, Evidence evidence)
\r
397 internal void Load (XmlReader stylesheet, XmlResolver resolver, Evidence evidence)
\r
400 Load (new XPathDocument (stylesheet, XmlSpace.Preserve).CreateNavigator (), resolver, evidence);
\r