Here comes managed XSLT! WOOOOOHOOOOOO!
[mono.git] / mcs / class / System.XML / Mono.Xml.Xsl.Operations / XslLiteralElement.cs
1 //
2 // XslLiteralElement.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 XslLiteralElement : XslCompiledElement {
20                 XslOperation children;
21                 string localname, prefix, nsUri;
22                 ArrayList attrs = new ArrayList ();
23                 XmlQualifiedName [] useAttributeSets;
24                 
25                 public XslLiteralElement (Compiler c) : base (c) {}
26                         
27                 class XslLiteralAttribute {
28                         string localname, prefix, nsUri;
29                         XslAvt val;
30                         
31                         public XslLiteralAttribute (Compiler c)
32                         {
33                                 this.prefix = c.Input.Prefix;
34                                 this.nsUri = c.Input.NamespaceURI;
35                                 this.localname = c.Input.LocalName;
36                                 this.val = new XslAvt (c.Input.Value, c);
37                         }
38                         
39                         public void Evaluate (XslTransformProcessor p)
40                         {
41                                 p.Out.WriteAttributeString (prefix, localname, nsUri, val.Evaluate (p));
42                         }
43                 }
44                 
45                 protected override void Compile (Compiler c)
46                 {
47                         
48                         this.prefix = c.Input.Prefix;
49                         this.nsUri = c.Input.NamespaceURI;
50                         this.localname = c.Input.LocalName;
51                         this.useAttributeSets = c.ParseQNameListAttribute ("use-attribute-sets", XsltNamespace);
52                         
53                         if (c.Input.MoveToFirstAttribute ())
54                         {
55                                 do {
56                                         if (c.Input.NamespaceURI == XsltNamespace)
57                                                 continue; //already handled
58                                         attrs.Add (new XslLiteralAttribute (c));
59                                 } while (c.Input.MoveToNextAttribute());
60                                 c.Input.MoveToParent ();
61                         }
62                         
63                         if (!c.Input.MoveToFirstChild ()) return;
64                         children = c.CompileTemplateContent ();
65                         c.Input.MoveToParent ();
66                 }
67                 
68                 public override void Evaluate (XslTransformProcessor p)
69                 {
70                         p.Out.WriteStartElement (prefix, localname, nsUri);
71
72                         foreach (XslLiteralAttribute a in attrs)
73                                 a.Evaluate (p);
74                         
75                         if (useAttributeSets != null)
76                                 foreach (XmlQualifiedName s in useAttributeSets)
77                                         p.ResolveAttributeSet (s).Evaluate (p);
78                                                 
79                         if (children != null) children.Evaluate (p);
80                         p.Out.WriteEndElement ();
81                 }
82         }
83 }