2 // XslLiteralElement.cs
5 // Ben Maurer (bmaurer@users.sourceforge.net)
6 // Atsushi Enomoto (ginga@kit.hi-ho.ne.jp)
9 // (C) 2003 Atsushi Enomoto
13 using System.Collections;
15 using System.Xml.XPath;
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;
25 public XslLiteralElement (Compiler c) : base (c) {}
27 class XslLiteralAttribute {
28 string localname, prefix, nsUri;
31 public XslLiteralAttribute (Compiler c)
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);
39 public void Evaluate (XslTransformProcessor p)
41 p.Out.WriteAttributeString (prefix, localname, nsUri, val.Evaluate (p));
45 protected override void Compile (Compiler c)
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);
53 if (c.Input.MoveToFirstAttribute ())
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 ();
63 if (!c.Input.MoveToFirstChild ()) return;
64 children = c.CompileTemplateContent ();
65 c.Input.MoveToParent ();
68 public override void Evaluate (XslTransformProcessor p)
70 p.Out.WriteStartElement (prefix, localname, nsUri);
72 foreach (XslLiteralAttribute a in attrs)
75 if (useAttributeSets != null)
76 foreach (XmlQualifiedName s in useAttributeSets)
77 p.ResolveAttributeSet (s).Evaluate (p);
79 if (children != null) children.Evaluate (p);
80 p.Out.WriteEndElement ();