+2002-09-23 Duncan Mak <duncan@ximian.com>
+
+ * XslTransform.cs (Laod): Implemented the simple version that
+ takes one XPathNavigator as argument.
+ (Save): New private method for recreating the XML in text from a
+ XPathNavigator
+ (WriteCurrentNode):
+ (WriteTree): private methods for generating the text XML from the
+ XPathNavigator tree.
+
2002-09-20 Duncan Mak <duncan@ximian.com>
- * XslTransform.cs (Load): Implemented the methods, not
+ * XslTransform.cs (Load): Implemented the methods, not
including the ones that deal with XPathNavigator (hopefully those
will come later).
(Transform): Implemented the version that saves directly to a file.
Save (stylesheet, stylesheet_file);\r
}\r
\r
- [MonoTODO]\r
// Loads the XSLT stylesheet contained in the XPathNavigator\r
public void Load (XPathNavigator stylesheet)\r
{\r
- throw new NotImplementedException ();\r
+ stylesheet_file = Path.GetTempFileName ();\r
+ Save (stylesheet, stylesheet_file);\r
}\r
\r
[MonoTODO]\r
\r
writer.Close ();\r
}\r
+\r
+ static void Save (XPathNavigator navigator, string filename)\r
+ {\r
+ XmlTextWriter writer = new XmlTextWriter (filename, new UTF8Encoding ());\r
+ XPathNodeType type = XPathNodeType.All;\r
+\r
+ WriteTree (navigator, writer, type);\r
+ }\r
+\r
+ // Walks the XPathNavigator tree recursively \r
+ static void WriteTree (XPathNavigator navigator, XmlTextWriter writer, XPathNodeType type)\r
+ {\r
+ WriteCurrentNode (navigator, writer, ref type);\r
+\r
+ if (navigator.HasAttributes) {\r
+ navigator.MoveToFirstAttribute ();\r
+ \r
+ do {\r
+ WriteCurrentNode (navigator, writer, ref type);\r
+ } while ( navigator.MoveToNextAttribute ());\r
+\r
+ navigator.MoveToParent ();\r
+ } \r
+\r
+ if (navigator.HasChildren) {\r
+ navigator.MoveToFirstChild ();\r
+\r
+ do {\r
+ WriteTree (navigator, writer, type);\r
+ } while (navigator.MoveToNext ());\r
+\r
+ navigator.MoveToParent ();\r
+ }\r
+ }\r
+\r
+ // Format the output \r
+ static void WriteCurrentNode (XPathNavigator navigator, XmlTextWriter writer, ref XPathNodeType current_type)\r
+ {\r
+ switch (navigator.NodeType) {\r
+ case XPathNodeType.Attribute:\r
+ current_type = XPathNodeType.Attribute;\r
+ writer.WriteAttributeString (navigator.LocalName, navigator.Value);\r
+ break;\r
+\r
+ case XPathNodeType.Comment:\r
+ writer.WriteComment (navigator.Value);\r
+ break;\r
+\r
+ case XPathNodeType.Element:\r
+ current_type = XPathNodeType.Element;\r
+ writer.WriteStartElement (navigator.Name);\r
+ break;\r
+ \r
+ case XPathNodeType.ProcessingInstruction:\r
+ writer.WriteProcessingInstruction (navigator.Name, navigator.Value);\r
+ break;\r
+\r
+ case XPathNodeType.Text:\r
+ writer.WriteString (navigator.Value);\r
+\r
+ if (current_type == XPathNodeType.Element) {\r
+ writer.WriteEndElement ();\r
+ current_type = XPathNodeType.All;\r
+ }\r
+\r
+ break;\r
+\r
+ case XPathNodeType.SignificantWhitespace:\r
+ case XPathNodeType.Whitespace:\r
+ writer.WriteWhitespace (navigator.Value);\r
+ break;\r
+ }\r
+ }\r
#endregion\r
}\r
}\r