2003-11-24 Atsushi Enomoto <ginga@kit.hi-ho.ne.jp>
[mono.git] / mcs / class / System.XML / Mono.Xml.Xsl.Operations / XslCopy.cs
1 //
2 // XslCopy.cs
3 //
4 // Authors:
5 //      Ben Maurer (bmaurer@users.sourceforge.net)
6 //      Atsushi Enomoto (ginga@kit.hi-ho.ne.jp)
7 //      
8 // (C) 2003 Ben Maurer
9 // (C) 2003 Atsushi Enomoto
10 //
11
12 using System;
13 using System.Collections;
14 using System.Xml;
15 using System.Xml.XPath;
16 using System.Xml.Xsl;
17
18 namespace Mono.Xml.Xsl.Operations {
19         public class XslCopy : XslCompiledElement {
20                 XslOperation children;
21                 XmlQualifiedName [] useAttributeSets;
22                 
23                 public XslCopy (Compiler c) : base (c) {}
24                 
25                 protected override void Compile (Compiler c)
26                 {
27                         useAttributeSets = c.ParseQNameListAttribute ("use-attribute-sets");
28                         
29                         if (!c.Input.MoveToFirstChild ()) return;
30                         children = c.CompileTemplateContent();
31                         c.Input.MoveToParent ();
32                 }
33
34                 public override void Evaluate (XslTransformProcessor p)
35                 {
36                         switch (p.CurrentNode.NodeType)
37                         {
38                         case XPathNodeType.Root:
39                                 if (p.Out.CanProcessAttributes && useAttributeSets != null)
40                                         foreach (XmlQualifiedName s in useAttributeSets)
41                                                 p.ResolveAttributeSet (s).Evaluate (p);
42
43                                 if (children != null) children.Evaluate (p);
44                                 break;
45                         case XPathNodeType.Element:
46                                 bool cdataStarted = false;
47                                 if (!p.InsideCDataElement && p.PushCDataState (p.CurrentNode.LocalName, p.CurrentNode.NamespaceURI))
48                                         cdataStarted = true;
49                                 p.Out.WriteStartElement (p.CurrentNode.Prefix, p.CurrentNode.LocalName, p.CurrentNode.NamespaceURI);
50                                 
51                                 p.TryStylesheetNamespaceOutput (null);
52                                 if (useAttributeSets != null)
53                                         foreach (XmlQualifiedName s in useAttributeSets)
54                                                 p.ResolveAttributeSet (s).Evaluate (p);
55
56                                 if (p.CurrentNode.MoveToFirstNamespace (XPathNamespaceScope.Local)) {
57                                         do {
58                                                 p.Out.WriteNamespaceDecl (p.CurrentNode.LocalName, p.CurrentNode.Value);
59                                         } while (p.CurrentNode.MoveToNextNamespace (XPathNamespaceScope.Local));
60                                         p.CurrentNode.MoveToParent ();
61                                 }
62                         
63                                 if (children != null) children.Evaluate (p);
64
65                                 p.Out.WriteFullEndElement ();
66                                 if (cdataStarted)
67                                         p.PopCDataState ();
68                                 break;
69                         case XPathNodeType.Attribute:
70                                 p.Out.WriteAttributeString (p.CurrentNode.Prefix, p.CurrentNode.LocalName, p.CurrentNode.NamespaceURI, p.CurrentNode.Value);
71                                 break;
72                         
73                         case XPathNodeType.SignificantWhitespace:
74                         case XPathNodeType.Text:
75                         case XPathNodeType.Whitespace:
76                                 p.Out.WriteString (p.CurrentNode.Value);
77                                 break;
78                         
79                         case XPathNodeType.Comment:
80                                 p.Out.WriteComment (p.CurrentNode.Value);
81                                 break;
82                         
83                         case XPathNodeType.ProcessingInstruction:
84                                 p.Out.WriteProcessingInstruction (p.CurrentNode.Name, p.CurrentNode.Value);
85                                 break;
86                         
87                         default:
88                                 Console.WriteLine ("unhandled node type {0}", p.CurrentNode.NodeType);
89                                 break;
90                         }
91                 }
92         }
93 }