System.Drawing: added email to icon and test file headers
[mono.git] / mcs / class / System.XML / System.Xml.Xsl / XslTransform.cs
1 // System.Xml.Xsl.XslTransform\r
2 //\r
3 // Authors:\r
4 //      Tim Coleman <tim@timcoleman.com>\r
5 //      Gonzalo Paniagua Javier (gonzalo@ximian.com)\r
6 //\r
7 // (C) Copyright 2002 Tim Coleman\r
8 // (c) 2003 Ximian Inc. (http://www.ximian.com)\r
9 //\r
10 \r
11 //\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
19 // \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
22 // \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
30 //\r
31 \r
32 using System;\r
33 using System.Collections;\r
34 using System.IO;\r
35 using System.Text;\r
36 using System.Runtime.InteropServices;\r
37 using System.Security;\r
38 using System.Security.Policy;\r
39 using System.Xml.XPath;\r
40 using Mono.Xml.Xsl;\r
41 \r
42 namespace System.Xml.Xsl {\r
43         internal class SimpleXsltDebugger\r
44         {\r
45                 public void OnCompile (XPathNavigator style)\r
46                 {\r
47                         Console.Write ("Compiling: ");\r
48                         PrintXPathNavigator (style);\r
49                         Console.WriteLine ();\r
50                 }\r
51 \r
52                 public void OnExecute (XPathNodeIterator currentNodeSet, XPathNavigator style, XsltContext xsltContext)\r
53                 {\r
54                         Console.Write ("Executing: ");\r
55                         PrintXPathNavigator (style);\r
56                         Console.WriteLine (" / NodeSet: (type {1}) {0} / XsltContext: {2}", currentNodeSet, currentNodeSet.GetType (), xsltContext);\r
57                 }\r
58 \r
59                 void PrintXPathNavigator (XPathNavigator nav)\r
60                 {\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
64                 }\r
65         }\r
66 \r
67         public sealed class XslTransform {\r
68 \r
69                 internal static readonly bool TemplateStackFrameError;\r
70                 internal static readonly TextWriter TemplateStackFrameOutput;\r
71 \r
72                 static XslTransform ()\r
73                 {\r
74                         string env = Environment.GetEnvironmentVariable ("MONO_XSLT_STACK_FRAME");\r
75                         switch (env) {\r
76                         case "stdout":\r
77                                 TemplateStackFrameOutput = Console.Out;\r
78                                 break;\r
79                         case "stderr":\r
80                                 TemplateStackFrameOutput = Console.Error;\r
81                                 break;\r
82                         case "error":\r
83                                 TemplateStackFrameError = true;\r
84                                 break;\r
85                         }\r
86                 }\r
87 \r
88                 static object GetDefaultDebugger ()\r
89                 {\r
90                         string env = Environment.GetEnvironmentVariable ("MONO_XSLT_DEBUGGER");\r
91                         if (env == null)\r
92                                 return null;\r
93                         if (env == "simple")\r
94                                 return new SimpleXsltDebugger ();\r
95                         object obj = Activator.CreateInstance (Type.GetType (env));\r
96                         return obj;\r
97                 }\r
98 \r
99                 public XslTransform ()\r
100                         : this (GetDefaultDebugger ())\r
101                 {\r
102                 }\r
103 \r
104                 internal XslTransform (object debugger)\r
105                 {\r
106                         this.debugger = debugger;\r
107                 }\r
108 \r
109                 object debugger;\r
110                 CompiledStylesheet s;\r
111                 XmlResolver xmlResolver = new XmlUrlResolver ();\r
112 \r
113                 [MonoTODO] // FIXME: audit security check\r
114 #if NET_2_0\r
115 #elif NET_1_1\r
116                 [Obsolete ("You should pass XmlResolver to Transform() method", false)]\r
117 #endif\r
118                 public XmlResolver XmlResolver {\r
119                         set {\r
120                                  xmlResolver = value;\r
121                         }\r
122                 }\r
123                 \r
124                 #region Transform\r
125 #if NET_2_0\r
126 #elif NET_1_1\r
127                 [Obsolete ("You should pass XmlResolver to Transform() method", false)]\r
128 #endif\r
129                 public XmlReader Transform (IXPathNavigable input, XsltArgumentList args)\r
130                 {\r
131                         return Transform (input.CreateNavigator (), args, xmlResolver);\r
132                 }\r
133 \r
134 #if NET_1_1\r
135                 public XmlReader Transform (IXPathNavigable input, XsltArgumentList args, XmlResolver resolver)\r
136 #else\r
137                 XmlReader Transform (IXPathNavigable input, XsltArgumentList args, XmlResolver resolver)\r
138 #endif\r
139                 {\r
140                         return Transform (input.CreateNavigator (), args, resolver);\r
141                 }\r
142 \r
143 #if NET_2_0\r
144 #elif NET_1_1\r
145                 [Obsolete ("You should pass XmlResolver to Transform() method", false)]\r
146 #endif\r
147                 public XmlReader Transform (XPathNavigator input, XsltArgumentList args)\r
148                 {\r
149                         return Transform (input, args, xmlResolver);\r
150                 }\r
151 #if NET_1_1\r
152                 public XmlReader Transform (XPathNavigator input, XsltArgumentList args, XmlResolver resolver)\r
153 #else\r
154                 XmlReader Transform (XPathNavigator input, XsltArgumentList args, XmlResolver resolver)\r
155 #endif\r
156                 {\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
162                 }\r
163 \r
164 #if NET_2_0\r
165 #elif NET_1_1\r
166                 [Obsolete ("You should pass XmlResolver to Transform() method", false)]\r
167 #endif\r
168                 public void Transform (IXPathNavigable input, XsltArgumentList args, TextWriter output)\r
169                 {\r
170                         Transform (input.CreateNavigator (), args, output, xmlResolver);\r
171                 }\r
172 #if NET_1_1\r
173                 public void Transform (IXPathNavigable input, XsltArgumentList args, TextWriter output, XmlResolver resolver)\r
174 #else\r
175                 void Transform (IXPathNavigable input, XsltArgumentList args, TextWriter output, XmlResolver resolver)\r
176 #endif\r
177                 {\r
178                         Transform (input.CreateNavigator (), args, output, resolver);\r
179                 }\r
180                 \r
181 #if NET_2_0\r
182 #elif NET_1_1\r
183                 [Obsolete ("You should pass XmlResolver to Transform() method", false)]\r
184 #endif\r
185                 public void Transform (IXPathNavigable input, XsltArgumentList args, Stream output)\r
186                 {\r
187                         Transform (input.CreateNavigator (), args, output, xmlResolver);\r
188                 }\r
189 #if NET_1_1\r
190                 public void Transform (IXPathNavigable input, XsltArgumentList args, Stream output, XmlResolver resolver)\r
191 #else\r
192                 void Transform (IXPathNavigable input, XsltArgumentList args, Stream output, XmlResolver resolver)\r
193 #endif\r
194                 {\r
195                         Transform (input.CreateNavigator (), args, output, resolver);\r
196                 }\r
197                 \r
198 #if NET_2_0\r
199 #elif NET_1_1\r
200                 [Obsolete ("You should pass XmlResolver to Transform() method", false)]\r
201 #endif\r
202                 public void Transform (IXPathNavigable input, XsltArgumentList args, XmlWriter output)\r
203                 {\r
204                         Transform (input.CreateNavigator (), args, output, xmlResolver);\r
205                 }\r
206 #if NET_1_1\r
207                 public void Transform (IXPathNavigable input, XsltArgumentList args, XmlWriter output, XmlResolver resolver)\r
208 #else\r
209                 void Transform (IXPathNavigable input, XsltArgumentList args, XmlWriter output, XmlResolver resolver)\r
210 #endif\r
211                 {\r
212                         Transform (input.CreateNavigator (), args, output, resolver);\r
213                 }\r
214 \r
215 #if NET_2_0\r
216 #elif NET_1_1\r
217                 [Obsolete ("You should pass XmlResolver to Transform() method", false)]\r
218 #endif\r
219                 public void Transform (XPathNavigator input, XsltArgumentList args, XmlWriter output)\r
220                 {\r
221                         Transform (input, args, output, xmlResolver);\r
222                 }\r
223 #if NET_1_1\r
224                 public void Transform (XPathNavigator input, XsltArgumentList args, XmlWriter output, XmlResolver resolver)\r
225 #else\r
226                 void Transform (XPathNavigator input, XsltArgumentList args, XmlWriter output, XmlResolver resolver)\r
227 #endif\r
228                 {\r
229                         if (s == null)\r
230                                 throw new XsltException ("No stylesheet was loaded.", null);\r
231 \r
232                         Outputter outputter = new GenericOutputter (output, s.Outputs, null);\r
233                         new XslTransformProcessor (s, debugger).Process (input, outputter, args, resolver);\r
234                         output.Flush ();\r
235                 }\r
236 \r
237 #if NET_2_0\r
238 #elif NET_1_1\r
239                 [Obsolete ("You should pass XmlResolver to Transform() method", false)]\r
240 #endif\r
241                 public void Transform (XPathNavigator input, XsltArgumentList args, Stream output)\r
242                 {\r
243                         Transform (input, args, output, xmlResolver);           \r
244                 }\r
245 #if NET_1_1\r
246                 public void Transform (XPathNavigator input, XsltArgumentList args, Stream output, XmlResolver resolver)\r
247 #else\r
248                 void Transform (XPathNavigator input, XsltArgumentList args, Stream output, XmlResolver resolver)\r
249 #endif\r
250                 {\r
251                         XslOutput xslOutput = (XslOutput)s.Outputs[String.Empty];\r
252                         Transform (input, args, new StreamWriter (output, xslOutput.Encoding), resolver);\r
253                 }\r
254 \r
255 #if NET_2_0\r
256 #elif NET_1_1\r
257                 [Obsolete ("You should pass XmlResolver to Transform() method", false)]\r
258 #endif\r
259                 public void Transform (XPathNavigator input, XsltArgumentList args, TextWriter output)\r
260                 {\r
261                         Transform (input, args, output, xmlResolver);\r
262                 }\r
263 #if NET_1_1\r
264                 public void Transform (XPathNavigator input, XsltArgumentList args, TextWriter output, XmlResolver resolver)\r
265 #else\r
266                 void Transform (XPathNavigator input, XsltArgumentList args, TextWriter output, XmlResolver resolver)\r
267 #endif\r
268                 {\r
269                         if (s == null)\r
270                                 throw new XsltException ("No stylesheet was loaded.", null);\r
271 \r
272                         Outputter outputter = new GenericOutputter(output, s.Outputs, output.Encoding);                 \r
273                         new XslTransformProcessor (s, debugger).Process (input, outputter, args, resolver);\r
274                         outputter.Done ();\r
275                         output.Flush ();\r
276                 }\r
277                 \r
278 #if NET_2_0\r
279 #elif NET_1_1\r
280                 [Obsolete ("You should pass XmlResolver to Transform() method", false)]\r
281 #endif\r
282                 public void Transform (string inputfile, string outputfile)\r
283                 { \r
284                         Transform (inputfile, outputfile, xmlResolver);\r
285                 }\r
286 \r
287 #if NET_1_1\r
288                 public void Transform (string inputfile, string outputfile, XmlResolver resolver)\r
289 #else\r
290                 void Transform (string inputfile, string outputfile, XmlResolver resolver)\r
291 #endif\r
292                 {\r
293                         using (Stream s = new FileStream (outputfile, FileMode.Create, FileAccess.ReadWrite)) {\r
294                                 Transform(new XPathDocument (inputfile).CreateNavigator (), null, s, resolver);\r
295                         }\r
296                 }\r
297                 #endregion\r
298 \r
299                 #region Load\r
300                 public void Load (string url)\r
301                 {\r
302                         Load (url, null);\r
303                 }\r
304                 \r
305                 public void Load (string url, XmlResolver resolver)\r
306                 {\r
307                         XmlResolver res = resolver;\r
308                         if (res == null)\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
318                         }\r
319                 }\r
320 \r
321 #if NET_2_0\r
322 #elif NET_1_1\r
323                 [Obsolete("You should pass evidence.", false)]\r
324 #endif\r
325                 public void Load (XmlReader stylesheet)\r
326                 {\r
327                         Load (stylesheet, null, null);\r
328                 }\r
329 \r
330 #if NET_2_0\r
331 #elif NET_1_1\r
332                 [Obsolete("You should pass evidence.", false)]\r
333 #endif\r
334                 public void Load (XmlReader stylesheet, XmlResolver resolver)\r
335                 {\r
336                         Load (stylesheet, resolver, null);\r
337                 }\r
338 \r
339 #if NET_2_0\r
340 #elif NET_1_1\r
341                 [Obsolete("You should pass evidence.", false)]\r
342 #endif\r
343                 public void Load (XPathNavigator stylesheet)\r
344                 {\r
345                         Load (stylesheet, null, null);\r
346                 }\r
347 \r
348 #if NET_2_0\r
349 #elif NET_1_1\r
350                 [Obsolete("You should pass evidence.", false)]\r
351 #endif\r
352                 public void Load (XPathNavigator stylesheet, XmlResolver resolver)\r
353                 {\r
354                         Load (stylesheet, resolver, null);\r
355                 }\r
356                 \r
357 #if NET_2_0\r
358 #elif NET_1_1\r
359                 [Obsolete("You should pass evidence.", false)]\r
360 #endif\r
361                 public void Load (IXPathNavigable stylesheet)\r
362                 {\r
363                         Load (stylesheet.CreateNavigator(), null);\r
364                 }\r
365 \r
366 #if NET_2_0\r
367 #elif NET_1_1\r
368                 [Obsolete("You should pass evidence.", false)]\r
369 #endif\r
370                 public void Load (IXPathNavigable stylesheet, XmlResolver resolver)\r
371                 {\r
372                         Load (stylesheet.CreateNavigator(), resolver);\r
373                 }\r
374 \r
375                 // Introduced in .NET 1.1\r
376 #if NET_1_1\r
377                 public void Load (IXPathNavigable stylesheet, XmlResolver resolver, Evidence evidence)\r
378 #else\r
379                 internal void Load (IXPathNavigable stylesheet, XmlResolver resolver, Evidence evidence)\r
380 #endif\r
381                 {\r
382                         Load (stylesheet.CreateNavigator(), resolver, evidence);\r
383                 }\r
384 \r
385 #if NET_1_1\r
386                 public void Load (XPathNavigator stylesheet, XmlResolver resolver, Evidence evidence)\r
387 #else\r
388                 internal void Load (XPathNavigator stylesheet, XmlResolver resolver, Evidence evidence)\r
389 #endif\r
390                 {\r
391                         s = new Compiler (debugger).Compile (stylesheet, resolver, evidence);\r
392                 }\r
393 \r
394 #if NET_1_1\r
395                 public void Load (XmlReader stylesheet, XmlResolver resolver, Evidence evidence)\r
396 #else\r
397                 internal void Load (XmlReader stylesheet, XmlResolver resolver, Evidence evidence)\r
398 #endif\r
399                 {\r
400                         Load (new XPathDocument (stylesheet, XmlSpace.Preserve).CreateNavigator (), resolver, evidence);\r
401                 }\r
402                 #endregion\r
403         }\r
404 }\r