Browse Source

2004-04-01 Atsushi Enomoto <[email protected]>

	* XslVariable.cs : When evaluated variable was BaseIterator, its
	  iterated nodes must be collected in prior. Otherwise, it might be
	  evaluated later with inconsistent level of variable stack in
	  XslTransformProcessor. This fixes bug #55876.

svn path=/trunk/mcs/; revision=24895
Atsushi Eno 22 năm trước cách đây
mục cha
commit
7cce1f15e4

+ 7 - 0
mcs/class/System.XML/Mono.Xml.Xsl.Operations/ChangeLog

@@ -1,3 +1,10 @@
+2004-04-01 Atsushi Enomoto <[email protected]>
+
+	* XslVariable.cs : When evaluated variable was BaseIterator, its
+	  iterated nodes must be collected in prior. Otherwise, it might be
+	  evaluated later with inconsistent level of variable stack in
+	  XslTransformProcessor. This fixes bug #55876.
+
 2004-03-22 Atsushi Enomoto <[email protected]>
 
 	* XslApplyTemplates.cs,

+ 14 - 1
mcs/class/System.XML/Mono.Xml.Xsl.Operations/XslVariable.cs

@@ -63,7 +63,20 @@ namespace Mono.Xml.Xsl.Operations {
 		public object Evaluate (XslTransformProcessor p)
 		{
 			if (select != null) {
-				return p.Evaluate (select);
+				object o = p.Evaluate (select);
+				// To resolve variable references correctly, we
+				// have to collect all the target nodes here.
+				// (otherwise, variables might be resolved with
+				// different level of variable stack in
+				// XslTransformProcessor).
+				if (o is XPathNodeIterator) {
+					ArrayList al = new ArrayList ();
+					XPathNodeIterator iter = (XPathNodeIterator) o;
+					while (iter.MoveNext ())
+						al.Add (iter.Current);
+					o = new ListIterator (al, p.XPathContext, false);
+				}
+				return o;
 			} else if (content != null) {
 //				XmlNodeWriter w = new XmlNodeWriter (false);
 				DTMXPathDocumentWriter w = new DTMXPathDocumentWriter (p.CurrentNode.NameTable, 200);