1 //------------------------------------------------------------------------------
2 // <copyright file="XslTransform.cs" company="Microsoft">
3 // Copyright (c) Microsoft Corporation. All rights reserved.
5 // <owner current="true" primary="true">Microsoft</owner>
6 //------------------------------------------------------------------------------
8 namespace System
.Xml
.Xsl
{
9 using System
.Reflection
;
10 using System
.Diagnostics
;
12 using System
.Xml
.XPath
;
13 using System
.Xml
.Xsl
.XsltOld
;
14 using MS
.Internal
.Xml
.XPath
;
15 using MS
.Internal
.Xml
.Cache
;
16 using System
.Collections
.Generic
;
17 using System
.Xml
.Xsl
.XsltOld
.Debugger
;
18 using System
.Security
.Policy
;
19 using System
.Security
.Permissions
;
20 using System
.Runtime
.Versioning
;
21 using System
.Xml
.XmlConfiguration
;
23 [Obsolete("This class has been deprecated. Please use System.Xml.Xsl.XslCompiledTransform instead. http://go.microsoft.com/fwlink/?linkid=14202")]
24 public sealed class XslTransform
{
25 private XmlResolver _documentResolver
= null;
26 private bool isDocumentResolverSet
= false;
27 private XmlResolver _DocumentResolver
{
29 if (isDocumentResolverSet
)
30 return _documentResolver
;
32 return XsltConfigSection
.CreateDefaultResolver();
38 // Compiled stylesheet state
40 private Stylesheet _CompiledStylesheet
;
41 private List
<TheQuery
> _QueryStore
;
42 private RootAction _RootAction
;
44 private IXsltDebugger debugger
;
46 public XslTransform() {}
48 public XmlResolver XmlResolver
{
50 _documentResolver
= value;
51 isDocumentResolverSet
= true;
55 public void Load(XmlReader stylesheet
) {
56 Load(stylesheet
, XsltConfigSection
.CreateDefaultResolver());
58 public void Load(XmlReader stylesheet
, XmlResolver resolver
) {
59 Load(new XPathDocument(stylesheet
, XmlSpace
.Preserve
), resolver
);
62 public void Load(IXPathNavigable stylesheet
) {
63 Load(stylesheet
, XsltConfigSection
.CreateDefaultResolver());
65 public void Load(IXPathNavigable stylesheet
, XmlResolver resolver
) {
66 if (stylesheet
== null) {
67 throw new ArgumentNullException("stylesheet");
69 Load(stylesheet
.CreateNavigator(), resolver
);
72 public void Load(XPathNavigator stylesheet
) {
73 if (stylesheet
== null) {
74 throw new ArgumentNullException("stylesheet");
76 Load(stylesheet
, XsltConfigSection
.CreateDefaultResolver());
78 public void Load(XPathNavigator stylesheet
, XmlResolver resolver
) {
79 if (stylesheet
== null) {
80 throw new ArgumentNullException("stylesheet");
82 Compile(stylesheet
, resolver
, /*evidence:*/null);
85 [ResourceConsumption(ResourceScope
.Machine
)]
86 [ResourceExposure(ResourceScope
.Machine
)]
87 public void Load(string url
) {
88 XmlTextReaderImpl tr
= new XmlTextReaderImpl(url
);
89 Evidence evidence
= XmlSecureResolver
.CreateEvidenceForUrl(tr
.BaseURI
); // We should ask BaseURI before we start reading because it's changing with each node
90 Compile(Compiler
.LoadDocument(tr
).CreateNavigator(), XsltConfigSection
.CreateDefaultResolver(), evidence
);
93 [ResourceConsumption(ResourceScope
.Machine
)]
94 [ResourceExposure(ResourceScope
.Machine
)]
95 public void Load(string url
, XmlResolver resolver
) {
96 XmlTextReaderImpl tr
= new XmlTextReaderImpl(url
); {
97 tr
.XmlResolver
= resolver
;
99 Evidence evidence
= XmlSecureResolver
.CreateEvidenceForUrl(tr
.BaseURI
); // We should ask BaseURI before we start reading because it's changing with each node
100 Compile(Compiler
.LoadDocument(tr
).CreateNavigator(), resolver
, evidence
);
103 public void Load(IXPathNavigable stylesheet
, XmlResolver resolver
, Evidence evidence
) {
104 if (stylesheet
== null) {
105 throw new ArgumentNullException("stylesheet");
107 Load(stylesheet
.CreateNavigator(), resolver
, evidence
);
109 public void Load(XmlReader stylesheet
, XmlResolver resolver
, Evidence evidence
) {
110 if (stylesheet
== null) {
111 throw new ArgumentNullException("stylesheet");
113 Load(new XPathDocument(stylesheet
, XmlSpace
.Preserve
), resolver
, evidence
);
115 public void Load(XPathNavigator stylesheet
, XmlResolver resolver
, Evidence evidence
) {
116 if (stylesheet
== null) {
117 throw new ArgumentNullException("stylesheet");
120 if (evidence
== null) {
121 evidence
= new Evidence();
124 new SecurityPermission(SecurityPermissionFlag
.ControlEvidence
).Demand();
127 Compile(stylesheet
, resolver
, evidence
);
130 // ------------------------------------ Transform() ------------------------------------ //
132 private void CheckCommand() {
133 if (_CompiledStylesheet
== null) {
134 throw new InvalidOperationException(Res
.GetString(Res
.Xslt_NoStylesheetLoaded
));
138 public XmlReader
Transform(XPathNavigator input
, XsltArgumentList args
, XmlResolver resolver
) {
140 Processor processor
= new Processor(input
, args
, resolver
, _CompiledStylesheet
, _QueryStore
, _RootAction
, debugger
);
141 return processor
.StartReader();
144 public XmlReader
Transform(XPathNavigator input
, XsltArgumentList args
) {
145 return Transform(input
, args
, _DocumentResolver
);
148 public void Transform(XPathNavigator input
, XsltArgumentList args
, XmlWriter output
, XmlResolver resolver
) {
150 Processor processor
= new Processor(input
, args
, resolver
, _CompiledStylesheet
, _QueryStore
, _RootAction
, debugger
);
151 processor
.Execute(output
);
154 public void Transform(XPathNavigator input
, XsltArgumentList args
, XmlWriter output
) {
155 Transform(input
, args
, output
, _DocumentResolver
);
157 public void Transform(XPathNavigator input
, XsltArgumentList args
, Stream output
, XmlResolver resolver
) {
159 Processor processor
= new Processor(input
, args
, resolver
, _CompiledStylesheet
, _QueryStore
, _RootAction
, debugger
);
160 processor
.Execute(output
);
163 public void Transform(XPathNavigator input
, XsltArgumentList args
, Stream output
) {
164 Transform(input
, args
, output
, _DocumentResolver
);
167 public void Transform(XPathNavigator input
, XsltArgumentList args
, TextWriter output
, XmlResolver resolver
) {
169 Processor processor
= new Processor(input
, args
, resolver
, _CompiledStylesheet
, _QueryStore
, _RootAction
, debugger
);
170 processor
.Execute(output
);
173 public void Transform(XPathNavigator input
, XsltArgumentList args
, TextWriter output
) {
175 Processor processor
= new Processor(input
, args
, _DocumentResolver
, _CompiledStylesheet
, _QueryStore
, _RootAction
, debugger
);
176 processor
.Execute(output
);
179 public XmlReader
Transform(IXPathNavigable input
, XsltArgumentList args
, XmlResolver resolver
) {
181 throw new ArgumentNullException("input");
183 return Transform(input
.CreateNavigator(), args
, resolver
);
186 public XmlReader
Transform(IXPathNavigable input
, XsltArgumentList args
) {
188 throw new ArgumentNullException("input");
190 return Transform(input
.CreateNavigator(), args
, _DocumentResolver
);
192 public void Transform(IXPathNavigable input
, XsltArgumentList args
, TextWriter output
, XmlResolver resolver
) {
194 throw new ArgumentNullException("input");
196 Transform(input
.CreateNavigator(), args
, output
, resolver
);
199 public void Transform(IXPathNavigable input
, XsltArgumentList args
, TextWriter output
) {
201 throw new ArgumentNullException("input");
203 Transform(input
.CreateNavigator(), args
, output
, _DocumentResolver
);
206 public void Transform(IXPathNavigable input
, XsltArgumentList args
, Stream output
, XmlResolver resolver
) {
208 throw new ArgumentNullException("input");
210 Transform(input
.CreateNavigator(), args
, output
, resolver
);
213 public void Transform(IXPathNavigable input
, XsltArgumentList args
, Stream output
) {
215 throw new ArgumentNullException("input");
217 Transform(input
.CreateNavigator(), args
, output
, _DocumentResolver
);
220 public void Transform(IXPathNavigable input
, XsltArgumentList args
, XmlWriter output
, XmlResolver resolver
) {
222 throw new ArgumentNullException("input");
224 Transform(input
.CreateNavigator(), args
, output
, resolver
);
227 public void Transform(IXPathNavigable input
, XsltArgumentList args
, XmlWriter output
) {
229 throw new ArgumentNullException("input");
231 Transform(input
.CreateNavigator(), args
, output
, _DocumentResolver
);
234 [ResourceConsumption(ResourceScope
.Machine
)]
235 [ResourceExposure(ResourceScope
.Machine
)]
236 public void Transform(String inputfile
, String outputfile
, XmlResolver resolver
) {
237 FileStream fs
= null;
239 // We should read doc before creating output file in case they are the same
240 XPathDocument doc
= new XPathDocument(inputfile
);
241 fs
= new FileStream(outputfile
, FileMode
.Create
, FileAccess
.ReadWrite
);
242 Transform(doc
, /*args:*/null, fs
, resolver
);
251 [ResourceConsumption(ResourceScope
.Machine
)]
252 [ResourceExposure(ResourceScope
.Machine
)]
253 public void Transform(String inputfile
, String outputfile
) {
254 Transform(inputfile
, outputfile
, _DocumentResolver
);
259 private void Compile(XPathNavigator stylesheet
, XmlResolver resolver
, Evidence evidence
) {
260 Debug
.Assert(stylesheet
!= null);
262 Compiler compiler
= (Debugger
== null) ? new Compiler() : new DbgCompiler(this.Debugger
);
263 NavigatorInput input
= new NavigatorInput(stylesheet
);
264 compiler
.Compile(input
, resolver
?? XmlNullResolver
.Singleton
, evidence
);
266 Debug
.Assert(compiler
.CompiledStylesheet
!= null);
267 Debug
.Assert(compiler
.QueryStore
!= null);
268 Debug
.Assert(compiler
.QueryStore
!= null);
269 _CompiledStylesheet
= compiler
.CompiledStylesheet
;
270 _QueryStore
= compiler
.QueryStore
;
271 _RootAction
= compiler
.RootAction
;
274 internal IXsltDebugger Debugger
{
275 get { return this.debugger; }
279 internal XslTransform(IXsltDebugger debugger
) {
280 this.debugger
= debugger
;
284 internal XslTransform(object debugger
) {
285 if (debugger
!= null) {
286 this.debugger
= new DebuggerAddapter(debugger
);
290 private class DebuggerAddapter
: IXsltDebugger
{
291 private object unknownDebugger
;
292 private MethodInfo getBltIn
;
293 private MethodInfo onCompile
;
294 private MethodInfo onExecute
;
295 public DebuggerAddapter(object unknownDebugger
) {
296 this.unknownDebugger
= unknownDebugger
;
297 BindingFlags flags
= BindingFlags
.NonPublic
| BindingFlags
.Public
| BindingFlags
.Instance
| BindingFlags
.Static
;
298 Type unknownType
= unknownDebugger
.GetType();
299 getBltIn
= unknownType
.GetMethod("GetBuiltInTemplatesUri", flags
);
300 onCompile
= unknownType
.GetMethod("OnInstructionCompile" , flags
);
301 onExecute
= unknownType
.GetMethod("OnInstructionExecute" , flags
);
303 // ------------------ IXsltDebugger ---------------
304 public string GetBuiltInTemplatesUri() {
305 if (getBltIn
== null) {
308 return (string) getBltIn
.Invoke(unknownDebugger
, new object[] {});
310 public void OnInstructionCompile(XPathNavigator styleSheetNavigator
) {
311 if (onCompile
!= null) {
312 onCompile
.Invoke(unknownDebugger
, new object[] { styleSheetNavigator }
);
315 public void OnInstructionExecute(IXsltProcessor xsltProcessor
) {
316 if (onExecute
!= null) {
317 onExecute
.Invoke(unknownDebugger
, new object[] { xsltProcessor }
);