merged Sys.Web.Services 2.0 support in my branch:
[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         public sealed class XslTransform {\r
44 \r
45                 internal static readonly bool TemplateStackFrameError;\r
46                 internal static readonly TextWriter TemplateStackFrameOutput;\r
47 \r
48                 static XslTransform ()\r
49                 {\r
50                         string env = Environment.GetEnvironmentVariable ("MONO_XSLT_STACK_FRAME");\r
51                         switch (env) {\r
52                         case "stdout":\r
53                                 TemplateStackFrameOutput = Console.Out;\r
54                                 break;\r
55                         case "stderr":\r
56                                 TemplateStackFrameOutput = Console.Error;\r
57                                 break;\r
58                         case "error":\r
59                                 TemplateStackFrameError = true;\r
60                                 break;\r
61                         }\r
62                 }\r
63 \r
64                 CompiledStylesheet s;\r
65                 XmlResolver xmlResolver = new XmlUrlResolver ();\r
66 \r
67                 [MonoTODO] // FIXME: audit security check\r
68 #if NET_2_0\r
69 #elif NET_1_1\r
70                 [Obsolete ("You should pass XmlResolver to Transform() method", false)]\r
71 #endif\r
72                 public XmlResolver XmlResolver {\r
73                         set {\r
74                                  xmlResolver = value;\r
75                         }\r
76                 }\r
77                 \r
78                 #region Transform\r
79 #if NET_2_0\r
80 #elif NET_1_1\r
81                 [Obsolete ("You should pass XmlResolver to Transform() method", false)]\r
82 #endif\r
83                 public XmlReader Transform (IXPathNavigable input, XsltArgumentList args)\r
84                 {\r
85                         return Transform (input.CreateNavigator (), args, xmlResolver);\r
86                 }\r
87 \r
88 #if NET_1_1\r
89                 public XmlReader Transform (IXPathNavigable input, XsltArgumentList args, XmlResolver resolver)\r
90 #else\r
91                 XmlReader Transform (IXPathNavigable input, XsltArgumentList args, XmlResolver resolver)\r
92 #endif\r
93                 {\r
94                         return Transform (input.CreateNavigator (), args, resolver);\r
95                 }\r
96 \r
97 #if NET_2_0\r
98 #elif NET_1_1\r
99                 [Obsolete ("You should pass XmlResolver to Transform() method", false)]\r
100 #endif\r
101                 public XmlReader Transform (XPathNavigator input, XsltArgumentList args)\r
102                 {\r
103                         return Transform (input, args, xmlResolver);\r
104                 }\r
105 #if NET_1_1\r
106                 public XmlReader Transform (XPathNavigator input, XsltArgumentList args, XmlResolver resolver)\r
107 #else\r
108                 XmlReader Transform (XPathNavigator input, XsltArgumentList args, XmlResolver resolver)\r
109 #endif\r
110                 {\r
111                         // todo: is this right?\r
112                         MemoryStream stream = new MemoryStream ();\r
113                         Transform (input, args, new XmlTextWriter (stream, null), resolver);\r
114                         stream.Position = 0;\r
115                         return new XmlTextReader (stream, XmlNodeType.Element, null);\r
116                 }\r
117 \r
118 #if NET_2_0\r
119 #elif NET_1_1\r
120                 [Obsolete ("You should pass XmlResolver to Transform() method", false)]\r
121 #endif\r
122                 public void Transform (IXPathNavigable input, XsltArgumentList args, TextWriter output)\r
123                 {\r
124                         Transform (input.CreateNavigator (), args, output, xmlResolver);\r
125                 }\r
126 #if NET_1_1\r
127                 public void Transform (IXPathNavigable input, XsltArgumentList args, TextWriter output, XmlResolver resolver)\r
128 #else\r
129                 void Transform (IXPathNavigable input, XsltArgumentList args, TextWriter output, XmlResolver resolver)\r
130 #endif\r
131                 {\r
132                         Transform (input.CreateNavigator (), args, output, resolver);\r
133                 }\r
134                 \r
135 #if NET_2_0\r
136 #elif NET_1_1\r
137                 [Obsolete ("You should pass XmlResolver to Transform() method", false)]\r
138 #endif\r
139                 public void Transform (IXPathNavigable input, XsltArgumentList args, Stream output)\r
140                 {\r
141                         Transform (input.CreateNavigator (), args, output, xmlResolver);\r
142                 }\r
143 #if NET_1_1\r
144                 public void Transform (IXPathNavigable input, XsltArgumentList args, Stream output, XmlResolver resolver)\r
145 #else\r
146                 void Transform (IXPathNavigable input, XsltArgumentList args, Stream output, XmlResolver resolver)\r
147 #endif\r
148                 {\r
149                         Transform (input.CreateNavigator (), args, output, resolver);\r
150                 }\r
151                 \r
152 #if NET_2_0\r
153 #elif NET_1_1\r
154                 [Obsolete ("You should pass XmlResolver to Transform() method", false)]\r
155 #endif\r
156                 public void Transform (IXPathNavigable input, XsltArgumentList args, XmlWriter output)\r
157                 {\r
158                         Transform (input.CreateNavigator (), args, output, xmlResolver);\r
159                 }\r
160 #if NET_1_1\r
161                 public void Transform (IXPathNavigable input, XsltArgumentList args, XmlWriter output, XmlResolver resolver)\r
162 #else\r
163                 void Transform (IXPathNavigable input, XsltArgumentList args, XmlWriter output, XmlResolver resolver)\r
164 #endif\r
165                 {\r
166                         Transform (input.CreateNavigator (), args, output, resolver);\r
167                 }\r
168 \r
169 #if NET_2_0\r
170 #elif NET_1_1\r
171                 [Obsolete ("You should pass XmlResolver to Transform() method", false)]\r
172 #endif\r
173                 public void Transform (XPathNavigator input, XsltArgumentList args, XmlWriter output)\r
174                 {\r
175                         Transform (input, args, output, xmlResolver);\r
176                 }\r
177 #if NET_1_1\r
178                 public void Transform (XPathNavigator input, XsltArgumentList args, XmlWriter output, XmlResolver resolver)\r
179 #else\r
180                 void Transform (XPathNavigator input, XsltArgumentList args, XmlWriter output, XmlResolver resolver)\r
181 #endif\r
182                 {\r
183                         if (s == null)\r
184                                 throw new XsltException ("No stylesheet was loaded.", null);\r
185 \r
186                         Outputter outputter = new GenericOutputter (output, s.Outputs, null);\r
187                         new XslTransformProcessor (s).Process (input, outputter, args, resolver);\r
188                         output.Flush ();\r
189                 }\r
190 \r
191 #if NET_2_0\r
192 #elif NET_1_1\r
193                 [Obsolete ("You should pass XmlResolver to Transform() method", false)]\r
194 #endif\r
195                 public void Transform (XPathNavigator input, XsltArgumentList args, Stream output)\r
196                 {\r
197                         Transform (input, args, output, xmlResolver);           \r
198                 }\r
199 #if NET_1_1\r
200                 public void Transform (XPathNavigator input, XsltArgumentList args, Stream output, XmlResolver resolver)\r
201 #else\r
202                 void Transform (XPathNavigator input, XsltArgumentList args, Stream output, XmlResolver resolver)\r
203 #endif\r
204                 {\r
205                         XslOutput xslOutput = (XslOutput)s.Outputs[String.Empty];\r
206                         Transform (input, args, new StreamWriter (output, xslOutput.Encoding), resolver);\r
207                 }\r
208 \r
209 #if NET_2_0\r
210 #elif NET_1_1\r
211                 [Obsolete ("You should pass XmlResolver to Transform() method", false)]\r
212 #endif\r
213                 public void Transform (XPathNavigator input, XsltArgumentList args, TextWriter output)\r
214                 {\r
215                         Transform (input, args, output, xmlResolver);\r
216                 }\r
217 #if NET_1_1\r
218                 public void Transform (XPathNavigator input, XsltArgumentList args, TextWriter output, XmlResolver resolver)\r
219 #else\r
220                 void Transform (XPathNavigator input, XsltArgumentList args, TextWriter output, XmlResolver resolver)\r
221 #endif\r
222                 {\r
223                         if (s == null)\r
224                                 throw new XsltException ("No stylesheet was loaded.", null);\r
225 \r
226                         Outputter outputter = new GenericOutputter(output, s.Outputs, output.Encoding);                 \r
227                         new XslTransformProcessor (s).Process (input, outputter, args, resolver);\r
228                         outputter.Done ();\r
229                         output.Flush ();\r
230                 }\r
231                 \r
232 #if NET_2_0\r
233 #elif NET_1_1\r
234                 [Obsolete ("You should pass XmlResolver to Transform() method", false)]\r
235 #endif\r
236                 public void Transform (string inputfile, string outputfile)\r
237                 { \r
238                         Transform (inputfile, outputfile, xmlResolver);\r
239                 }\r
240 \r
241 #if NET_1_1\r
242                 public void Transform (string inputfile, string outputfile, XmlResolver resolver)\r
243 #else\r
244                 void Transform (string inputfile, string outputfile, XmlResolver resolver)\r
245 #endif\r
246                 {\r
247                         using (Stream s = new FileStream (outputfile, FileMode.Create, FileAccess.ReadWrite)) {\r
248                                 Transform(new XPathDocument (inputfile).CreateNavigator (), null, s, resolver);\r
249                         }\r
250                 }\r
251                 #endregion\r
252 \r
253                 #region Load\r
254                 public void Load (string url)\r
255                 {\r
256                         Load (url, null);\r
257                 }\r
258                 \r
259                 public void Load (string url, XmlResolver resolver)\r
260                 {\r
261                         XmlResolver res = resolver;\r
262                         if (res == null)\r
263                                 res = new XmlUrlResolver ();\r
264                         Uri uri = res.ResolveUri (null, url);\r
265                         using (Stream s = res.GetEntity (uri, null, typeof (Stream)) as Stream) {\r
266                                 XmlTextReader xtr = new XmlTextReader (uri.ToString (), s);\r
267                                 xtr.XmlResolver = res;\r
268                                 XmlValidatingReader xvr = new XmlValidatingReader (xtr);\r
269                                 xvr.XmlResolver = res;\r
270                                 xvr.ValidationType = ValidationType.None;\r
271                                 Load (new XPathDocument (xvr, XmlSpace.Preserve).CreateNavigator (), resolver, null);\r
272                         }\r
273                 }\r
274 \r
275 #if NET_2_0\r
276 #elif NET_1_1\r
277                 [Obsolete("You should pass evidence.", false)]\r
278 #endif\r
279                 public void Load (XmlReader stylesheet)\r
280                 {\r
281                         Load (stylesheet, null, null);\r
282                 }\r
283 \r
284 #if NET_2_0\r
285 #elif NET_1_1\r
286                 [Obsolete("You should pass evidence.", false)]\r
287 #endif\r
288                 public void Load (XmlReader stylesheet, XmlResolver resolver)\r
289                 {\r
290                         Load (stylesheet, resolver, null);\r
291                 }\r
292 \r
293 #if NET_2_0\r
294 #elif NET_1_1\r
295                 [Obsolete("You should pass evidence.", false)]\r
296 #endif\r
297                 public void Load (XPathNavigator stylesheet)\r
298                 {\r
299                         Load (stylesheet, null, null);\r
300                 }\r
301 \r
302 #if NET_2_0\r
303 #elif NET_1_1\r
304                 [Obsolete("You should pass evidence.", false)]\r
305 #endif\r
306                 public void Load (XPathNavigator stylesheet, XmlResolver resolver)\r
307                 {\r
308                         Load (stylesheet, resolver, null);\r
309                 }\r
310                 \r
311 #if NET_2_0\r
312 #elif NET_1_1\r
313                 [Obsolete("You should pass evidence.", false)]\r
314 #endif\r
315                 public void Load (IXPathNavigable stylesheet)\r
316                 {\r
317                         Load (stylesheet.CreateNavigator(), null);\r
318                 }\r
319 \r
320 #if NET_2_0\r
321 #elif NET_1_1\r
322                 [Obsolete("You should pass evidence.", false)]\r
323 #endif\r
324                 public void Load (IXPathNavigable stylesheet, XmlResolver resolver)\r
325                 {\r
326                         Load (stylesheet.CreateNavigator(), resolver);\r
327                 }\r
328 \r
329                 // Introduced in .NET 1.1\r
330 #if NET_1_1\r
331                 public void Load (IXPathNavigable stylesheet, XmlResolver resolver, Evidence evidence)\r
332 #else\r
333                 internal void Load (IXPathNavigable stylesheet, XmlResolver resolver, Evidence evidence)\r
334 #endif\r
335                 {\r
336                         Load (stylesheet.CreateNavigator(), resolver, evidence);\r
337                 }\r
338 \r
339 #if NET_1_1\r
340                 public void Load (XPathNavigator stylesheet, XmlResolver resolver, Evidence evidence)\r
341 #else\r
342                 internal void Load (XPathNavigator stylesheet, XmlResolver resolver, Evidence evidence)\r
343 #endif\r
344                 {\r
345                         s = new Compiler ().Compile (stylesheet, resolver, evidence);\r
346                 }\r
347 \r
348 #if NET_1_1\r
349                 public void Load (XmlReader stylesheet, XmlResolver resolver, Evidence evidence)\r
350 #else\r
351                 internal void Load (XmlReader stylesheet, XmlResolver resolver, Evidence evidence)\r
352 #endif\r
353                 {\r
354                         Load (new XPathDocument (stylesheet, XmlSpace.Preserve).CreateNavigator (), resolver, evidence);\r
355                 }\r
356                 #endregion\r
357         }\r
358 }\r