Просмотр исходного кода

2002-06-23 Piers Haken <[email protected]>

	* DefaultContext.cs: implemented XPathFUnctionId
	* Iterator.cs: new ArrayListIterator for id() support

svn path=/trunk/mcs/; revision=5426
Piers Haken 23 лет назад
Родитель
Сommit
2dfdf317d6

+ 5 - 0
mcs/class/System.XML/System.Xml.XPath/ChangeLog

@@ -1,3 +1,8 @@
+2002-06-23  Piers Haken <[email protected]>
+
+	* DefaultContext.cs: implemented XPathFUnctionId
+	* Iterator.cs: new ArrayListIterator for id() support
+
 2002-06-23  Piers Haken <[email protected]>
 
 	* XPathNavigator.cs: implement:

+ 19 - 1
mcs/class/System.XML/System.Xml.XPath/DefaultContext.cs

@@ -217,6 +217,7 @@ namespace System.Xml.XPath
 	}
 	internal class XPathFunctionId : XPathFunction
 	{
+		private static char [] rgchWhitespace = {' ', '\t', '\r', '\n'};
 		public override XPathResultType ReturnType { get { return XPathResultType.Number; }}
 		public override int Minargs { get { return 1; }}
 		public override int Maxargs { get { return 1; }}
@@ -224,7 +225,24 @@ namespace System.Xml.XPath
 		[MonoTODO]
 		public override object TypesafeInvoke (XsltContext xsltContext, object[] args, XPathNavigator docContext)
 		{
-			throw new NotImplementedException ();
+			String strArgs;
+			BaseIterator iter = args [0] as BaseIterator;
+			if (iter != null)
+			{
+				strArgs = "";
+				while (!iter.MoveNext ())
+					strArgs += iter.Current.Value + " ";
+			}
+			else
+				strArgs = XPathFunctions.ToString (args [0]);
+			string [] rgstrArgs = strArgs.Split (rgchWhitespace);
+			ArrayList rgNodes = new ArrayList ();
+			foreach (string strArg in rgstrArgs)
+			{
+				if (docContext.MoveToId (strArg))
+					rgNodes.Add (docContext.Clone ());
+			}
+			return new ArrayListIterator (iter, rgNodes);
 		}
 		public override string Name { get { return "id"; }}
 	}

+ 26 - 0
mcs/class/System.XML/System.Xml.XPath/Iterator.cs

@@ -539,4 +539,30 @@ namespace System.Xml.XPath
 		public override XPathNavigator Current { get { return _iter.Current; }}
 		public override int CurrentPosition { get { return _pos; }}
 	}
+	internal class ArrayListIterator : BaseIterator
+	{
+		protected ArrayList _rgNodes;
+		protected int _pos;
+
+		public ArrayListIterator (BaseIterator iter, ArrayList rgNodes) : base (iter)
+		{
+			_rgNodes = rgNodes;
+		}
+
+		protected ArrayListIterator (ArrayListIterator other) : base (other)
+		{
+			_rgNodes = other._rgNodes;
+		}
+		public override XPathNodeIterator Clone () { return new ArrayListIterator (this); }
+
+		public override bool MoveNext ()
+		{
+			if (_pos >= _rgNodes.Count)
+				return false;
+			_pos++;
+			return true;
+		}
+		public override XPathNavigator Current { get { return (XPathNavigator) _rgNodes [_pos - 1]; }}
+		public override int CurrentPosition { get { return _pos; }}
+	}
 }