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