public override object Invoke(XsltContext xsltContext, object[] args, XPathNavigator docContext) {
XsltCompileContext xsltCompileContext = (XsltCompileContext) xsltContext;
string local, prefix;
PrefixQName.ParseQualifiedName(ToString(args[0]), out prefix, out local);
string ns = xsltContext.LookupNamespace(prefix);
XmlQualifiedName keyName = new XmlQualifiedName(local, ns);
XPathNavigator root = docContext.Clone();
root.MoveToRoot();
ArrayList resultCollection = null;
foreach (Key key in xsltCompileContext.processor.KeyList) {
if (key.Name == keyName) {
Hashtable keyTable = key.GetKeys(root);
if (keyTable == null) {
keyTable = xsltCompileContext.BuildKeyTable(key, root);
key.AddKey(root, keyTable);
}
XPathNodeIterator it = args[1] as XPathNodeIterator;
if (it != null) {
it = it.Clone();
while (it.MoveNext()) {
resultCollection = AddToList(resultCollection, (ArrayList) keyTable[it.Current.Value]);
}
} else {
resultCollection = AddToList(resultCollection, (ArrayList) keyTable[ToString(args[1])]);
}
}
}
if (resultCollection == null) {
return XPathEmptyIterator.Instance;
} else if (resultCollection[0] is XPathNavigator) {
return new XPathArrayIterator(resultCollection);
} else {
return new XPathMultyIterator(resultCollection);
}
}