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 using QName = System.Xml.XmlQualifiedName;
20 namespace Mono.Xml.Xsl.Operations {
21 public abstract class XslGeneralVariable : XslCompiledElement, IXsltContextVariable {
23 protected XPathExpression select;
24 protected XslOperation content;
25 protected object value;
26 protected bool busy, evaluated;
29 public XslGeneralVariable (Compiler c) : base (c) {}
31 protected override void Compile (Compiler c)
33 c.AssertAttribute ("name");
34 name = c.ParseQNameAttribute ("name");
36 string sel = c.GetAttribute ("select");
37 if (sel != null && sel != "" ) {
38 select = c.CompileExpression (c.GetAttribute ("select"));
40 } else if (c.Input.MoveToFirstChild ()) {
41 content = c.CompileTemplateContent ();
42 c.Input.MoveToParent ();
46 public override void Evaluate (XslTransformProcessor p) {
47 Debug.WriteLine ("EVALUATING : " + name);
51 protected virtual void Evaluate (XslTransformProcessor p, bool isFromXPath)
54 if (busy) throw new Exception ("Circular dependency");
58 value = p.Evaluate (select);
59 } else if (content != null) {
60 XmlNodeWriter w = new XmlNodeWriter ();
64 value = w.Document.CreateNavigator ().SelectChildren (XPathNodeType.All);
68 if (value is XPathNodeIterator)
69 Debug.WriteLine (name + " has " + ((XPathNodeIterator)value).Count + " elements.");
77 public QName Name {get {return this.name;}}
79 public XPathResultType VariableType {
81 if (value != null) return Functions.XPFuncImpl.GetXPathType (value.GetType ());
82 return XPathResultType.Any;
86 public object Evaluate (XsltContext xsltContext)
89 Evaluate (((XsltCompiledContext)xsltContext).Processor, true);
91 if (value is XPathNodeIterator)
92 return ((XPathNodeIterator)value).Clone ();
99 public virtual void Clear ()
105 public bool Evaluated { get { return evaluated; }}
106 public abstract bool IsLocal { get; }
107 public abstract bool IsParam { get; }
110 public class XslGlobalVariable : XslGeneralVariable {
111 public XslGlobalVariable (Compiler c) : base (c) {}
112 public override bool IsLocal { get { return false; }}
113 public override bool IsParam { get { return false; }}
116 public class XslGlobalParam : XslGlobalVariable {
120 public XslGlobalParam (Compiler c) : base (c) {}
122 public void Override (object paramVal)
125 throw new Exception ("why was i called again?");
128 this.value = paramVal;
130 public override bool IsParam { get { return true; }}
133 public class XslLocalVariable : XslGeneralVariable {
134 protected Stack values;
136 public XslLocalVariable (Compiler c) : base (c)
138 c.AddVariable (this);
140 public override bool IsLocal { get { return true; }}
141 public override bool IsParam { get { return false; }}
143 protected override void Evaluate (XslTransformProcessor p, bool isFromXPath)
145 if (!evaluated && isFromXPath)
146 throw new Exception ("Variable used before decleration");
148 if (evaluated && !isFromXPath) {
150 values = new Stack ();
154 base.Evaluate (p, isFromXPath);
157 public override void Clear ()
160 if (values != null && values.Count != 0) {
161 value = values.Pop ();
167 public class XslLocalParam : XslLocalVariable {
171 public XslLocalParam (Compiler c) : base (c) {}
173 public void Override (object paramVal)
177 values = new Stack ();
182 this.value = paramVal;
184 public override bool IsParam { get { return true; }}
187 public class XslWithParam : XslGeneralVariable {
188 public XslWithParam (Compiler c) : base (c) {}
189 public override bool IsLocal { get { return false; }}
190 public override bool IsParam { get { return false; }}
192 public object Value {
194 if (!evaluated) throw new Exception ("why wasn't I evaluated");
195 if (value is XPathNodeIterator) return ((XPathNodeIterator)value).Clone ();