ManagedXslTransform.cs 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. //
  2. // ManagedXslTransform
  3. //
  4. // Authors:
  5. // Ben Maurer ([email protected])
  6. //
  7. // (C) 2003 Ben Maurer
  8. //
  9. using System;
  10. using System.Collections;
  11. using System.IO;
  12. using System.Security.Policy;
  13. using System.Text;
  14. using System.Xml.XPath;
  15. using Mono.Xml.Xsl;
  16. namespace System.Xml.Xsl {
  17. internal class ManagedXslTransform : XslTransformImpl {
  18. CompiledStylesheet s;
  19. public override void Load (XPathNavigator stylesheet, XmlResolver resolver, Evidence evidence)
  20. {
  21. s = new Compiler ().Compile (stylesheet, resolver, evidence);
  22. }
  23. public override void Transform (XPathNavigator input, XsltArgumentList args, XmlWriter output, XmlResolver resolver)
  24. {
  25. Outputter outputter = new XmlOutputter(output, s.Style.Outputs);
  26. bool wroteStartDocument = false;
  27. if (output.WriteState == WriteState.Start) {
  28. outputter.WriteStartDocument ();
  29. wroteStartDocument = true;
  30. }
  31. new XslTransformProcessor (s).Process (input, outputter, args, resolver);
  32. if (wroteStartDocument)
  33. outputter.WriteEndDocument ();
  34. }
  35. public override void Transform (XPathNavigator input, XsltArgumentList args, TextWriter output, XmlResolver resolver) {
  36. XslOutput xslOutput = (XslOutput)s.Style.Outputs[String.Empty];
  37. if (xslOutput == null) {
  38. //No xsl:output - subject to output method autodetection, XML for a while
  39. Transform(input, args, new XmlTextWriter(output), resolver);
  40. return;
  41. }
  42. switch (xslOutput.Method) {
  43. case OutputMethod.XML:
  44. Transform(input, args, new XmlTextWriter(output), resolver);
  45. break;
  46. case OutputMethod.HTML:
  47. throw new NotImplementedException("HTML output method is not implemented yet.");
  48. case OutputMethod.Text:
  49. new XslTransformProcessor (s).Process (input, new TextOutputter(output), args, resolver);
  50. break;
  51. case OutputMethod.Custom:
  52. throw new NotImplementedException("Custom output method is not implemented yet.");
  53. }
  54. }
  55. }
  56. }