2003-11-24 Atsushi Enomoto <ginga@kit.hi-ho.ne.jp>
[mono.git] / mcs / class / System.XML / Mono.Xml.Xsl.Operations / XslCopy.cs
index 8ecfa5ca190bbafe77ce5a78f1ab0662d387234c..23ef3223a39f9fa4371863ab02c892a8d5906da3 100644 (file)
@@ -43,18 +43,28 @@ namespace Mono.Xml.Xsl.Operations {
                                if (children != null) children.Evaluate (p);
                                break;
                        case XPathNodeType.Element:
+                               bool cdataStarted = false;
+                               if (!p.InsideCDataElement && p.PushCDataState (p.CurrentNode.LocalName, p.CurrentNode.NamespaceURI))
+                                       cdataStarted = true;
                                p.Out.WriteStartElement (p.CurrentNode.Prefix, p.CurrentNode.LocalName, p.CurrentNode.NamespaceURI);
                                
-                               p.TryStylesheetNamespaceOutput ();
+                               p.TryStylesheetNamespaceOutput (null);
                                if (useAttributeSets != null)
                                        foreach (XmlQualifiedName s in useAttributeSets)
                                                p.ResolveAttributeSet (s).Evaluate (p);
+
+                               if (p.CurrentNode.MoveToFirstNamespace (XPathNamespaceScope.Local)) {
+                                       do {
+                                               p.Out.WriteNamespaceDecl (p.CurrentNode.LocalName, p.CurrentNode.Value);
+                                       } while (p.CurrentNode.MoveToNextNamespace (XPathNamespaceScope.Local));
+                                       p.CurrentNode.MoveToParent ();
+                               }
                        
                                if (children != null) children.Evaluate (p);
-                               if (p.CurrentNode.IsEmptyElement)
-                                       p.Out.WriteEndElement ();
-                               else
-                                       p.Out.WriteFullEndElement ();
+
+                               p.Out.WriteFullEndElement ();
+                               if (cdataStarted)
+                                       p.PopCDataState ();
                                break;
                        case XPathNodeType.Attribute:
                                p.Out.WriteAttributeString (p.CurrentNode.Prefix, p.CurrentNode.LocalName, p.CurrentNode.NamespaceURI, p.CurrentNode.Value);