2002-09-23 Duncan Mak <duncan@ximian.com>
authorDuncan Mak <duncan@mono-cvs.ximian.com>
Mon, 23 Sep 2002 22:19:25 +0000 (22:19 -0000)
committerDuncan Mak <duncan@mono-cvs.ximian.com>
Mon, 23 Sep 2002 22:19:25 +0000 (22:19 -0000)
* 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.

svn path=/trunk/mcs/; revision=7744

mcs/class/System.XML/System.Xml.Xsl/ChangeLog
mcs/class/System.XML/System.Xml.Xsl/XslTransform.cs

index 41ac6173bf586433cf346b5194ca5152fbed05af..fb4b40c200ddc488854d083bf865df9f0fc16dc9 100644 (file)
@@ -1,6 +1,16 @@
+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.
index ec6a17fed6c88dd845f4b95bcddcf054123f5269..8af60b669752d2953e7e2907b7351ca92bd7542e 100644 (file)
@@ -58,11 +58,11 @@ namespace System.Xml.Xsl
                        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
@@ -237,6 +237,79 @@ namespace System.Xml.Xsl
 \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