public override object Invoke(XsltContext xsltContext, object[] args, XPathNavigator docContext)
        {
            string actor = ToString(args[0]);
            string e = string.Format(CultureInfo.InvariantCulture, "/s11:Envelope/s11:Header/*[@s11:actor='{0}'] | /s12:Envelope/s12:Header/*[@s12:role='{1}']", actor, actor);
            XPathExpression expr = docContext.Compile(e);
            expr.SetContext(xsltContext);
            return docContext.Evaluate(expr);

#if NO
            // PERF, [....], I drafted this implementation before we found out that a bug in the Fx implementation would 
            //               prevent us from constructing an XPathNodeIterator that they would accept.  I'm keeping it
            //               around in the hope that I will be able to use it by M5.4.  If not, it will be deleted.
            
            XPathNavigator basicNav = docContext.Clone();
            SeekableXPathNavigator nav = basicNav as SeekableXPathNavigator;
            if(nav == null)
            {
                nav = new GenericSeekableNavigator(basicNav);
            }
            
            string actor = (string)args[0];
            NodeSequence seq = new NodeSequence();
            XPathNodeIterator result = new NodeSequenceIterator(seq);
            
            nav.MoveToRoot();
            if(!nav.MoveToFirstChild())
            {
                return result;
            }

            if(nav.LocalName != "Envelope")
            {
                return result;
            }
            
            if(nav.NamespaceURI == XPathMessageContext.S11NS)
            {
                // Move to Header
                if(nav.MoveToFirstChild() && nav.LocalName == "Header" && nav.NamespaceURI == XPathMessageContext.S11NS)
                {
                    // Move to first Header block
                    if(nav.MoveToFirstChild())
                    {
                        // Iterate over header blocks
                        do
                        {
                            if(nav.MoveToAttribute("actor", XPathMessageContext.S11NS))
                            {
                                if(nav.Value == actor)
                                {
                                    seq.Add(nav);
                                }
                                nav.MoveToParent();
                            }
                                    
                        } while(nav.MoveToNext());
                    }
                }
            }
            else if(nav.NamespaceURI == XPathMessageContext.S12NS)
            {
                // Move to Header
                if(nav.MoveToFirstChild() && nav.LocalName == "Header" && nav.NamespaceURI == XPathMessageContext.S12NS)
                {
                    // Move to first Header block
                    if(nav.MoveToFirstChild())
                    {
                        // Iterate over header blocks
                        do
                        {
                            if(nav.MoveToAttribute("role", XPathMessageContext.S12NS))
                            {
                                if(nav.Value == actor)
                                {
                                    seq.Add(nav);
                                }
                                nav.MoveToParent();
                            }
                                    
                        } while(nav.MoveToNext());
                    }
                }
            }

            return result;
#endif
        }
        internal override Opcode Eval(ProcessingContext context)
        {
            XPathNavigator nav = context.Processor.ContextNode;
            if (nav != null && context.Processor.ContextMessage != null)
            {
                ((SeekableMessageNavigator)nav).Atomize();
            }

            if (this.argCount == 0)
            {
                context.PushFrame();
                int count = context.IterationCount;
                if (count > 0)
                {
                    object ret = this.function.Invoke(this.xsltContext, NullArgs, nav);
                    switch (this.function.ReturnType)
                    {
                        case XPathResultType.String:
                            context.Push((string)ret, count);
                            break;

                        case XPathResultType.Number:
                            context.Push((double)ret, count);
                            break;

                        case XPathResultType.Boolean:
                            context.Push((bool)ret, count);
                            break;

                        case XPathResultType.NodeSet:
                            NodeSequence seq = context.CreateSequence();
                            XPathNodeIterator iter = (XPathNodeIterator)ret;
                            seq.Add(iter);
                            context.Push(seq, count);
                            break;

                        default:
                            // This should never be reached
                            throw DiagnosticUtility.ExceptionUtility.ThrowHelperCritical(new QueryProcessingException(QueryProcessingError.Unexpected, SR.GetString(SR.QueryFunctionTypeNotSupported, this.function.ReturnType.ToString())));
                    }
                }
            }
            else
            {
                // PERF, [....], see if we can cache these arrays to avoid allocations
                object[] xsltArgs = new object[this.argCount];
                int iterationCount = context.TopArg.Count;
                for (int iteration = 0; iteration < iterationCount; ++iteration)
                {
                    for (int i = 0; i < this.argCount; ++i)
                    {
                        StackFrame arg = context[i];
                        Fx.Assert(iteration < arg.Count, "");

                        switch (this.function.ArgTypes[i])
                        {
                            case XPathResultType.String:
                                xsltArgs[i] = context.PeekString(arg[iteration]);
                                break;

                            case XPathResultType.Number:
                                xsltArgs[i] = context.PeekDouble(arg[iteration]);
                                break;

                            case XPathResultType.Boolean:
                                xsltArgs[i] = context.PeekBoolean(arg[iteration]);
                                break;

                            case XPathResultType.NodeSet:
                                NodeSequenceIterator iter = new NodeSequenceIterator(context.PeekSequence(arg[iteration]));
                                xsltArgs[i] = iter;
                                this.iterList.Add(iter);
                                break;

                            default:
                                // This should never be reached
                                throw DiagnosticUtility.ExceptionUtility.ThrowHelperCritical(new QueryProcessingException(QueryProcessingError.Unexpected, SR.GetString(SR.QueryFunctionTypeNotSupported, this.function.ArgTypes[i].ToString())));
                        }
                    }

                    object ret = this.function.Invoke(this.xsltContext, xsltArgs, nav);

                    if (this.iterList != null)
                    {
                        for (int i = 0; i < this.iterList.Count; ++i)
                        {
                            this.iterList[i].Clear();
                        }
                        this.iterList.Clear();
                    }

                    switch (this.function.ReturnType)
                    {
                        case XPathResultType.String:
                            context.SetValue(context, context[this.argCount - 1][iteration], (string)ret);
                            break;

                        case XPathResultType.Number:
                            context.SetValue(context, context[this.argCount - 1][iteration], (double)ret);
                            break;

                        case XPathResultType.Boolean:
                            context.SetValue(context, context[this.argCount - 1][iteration], (bool)ret);
                            break;

                        case XPathResultType.NodeSet:
                            NodeSequence seq = context.CreateSequence();
                            XPathNodeIterator iter = (XPathNodeIterator)ret;
                            seq.Add(iter);
                            context.SetValue(context, context[this.argCount - 1][iteration], seq);
                            break;

                        default:
                            // This should never be reached
                            throw DiagnosticUtility.ExceptionUtility.ThrowHelperCritical(new QueryProcessingException(QueryProcessingError.Unexpected, SR.GetString(SR.QueryFunctionTypeNotSupported, this.function.ReturnType.ToString())));
                    }
                }

                for (int i = 0; i < this.argCount - 1; ++i)
                {
                    context.PopFrame();
                }
            }
            return this.next;
        }
        internal override Opcode Eval(ProcessingContext context)
        {
            XPathNavigator contextNode = context.Processor.ContextNode;
            if ((contextNode != null) && (context.Processor.ContextMessage != null))
            {
                ((SeekableMessageNavigator) contextNode).Atomize();
            }
            if (this.argCount == 0)
            {
                context.PushFrame();
                int iterationCount = context.IterationCount;
                if (iterationCount > 0)
                {
                    object obj2 = this.function.Invoke(this.xsltContext, NullArgs, contextNode);
                    switch (this.function.ReturnType)
                    {
                        case XPathResultType.Number:
                            context.Push((double) obj2, iterationCount);
                            goto Label_03F6;

                        case XPathResultType.String:
                            context.Push((string) obj2, iterationCount);
                            goto Label_03F6;

                        case XPathResultType.Boolean:
                            context.Push((bool) obj2, iterationCount);
                            goto Label_03F6;

                        case XPathResultType.NodeSet:
                        {
                            NodeSequence sequence = context.CreateSequence();
                            XPathNodeIterator iter = (XPathNodeIterator) obj2;
                            sequence.Add(iter);
                            context.Push(sequence, iterationCount);
                            goto Label_03F6;
                        }
                    }
                    throw DiagnosticUtility.ExceptionUtility.ThrowHelperCritical(new QueryProcessingException(QueryProcessingError.Unexpected, System.ServiceModel.SR.GetString("QueryFunctionTypeNotSupported", new object[] { this.function.ReturnType.ToString() })));
                }
            }
            else
            {
                object[] args = new object[this.argCount];
                int count = context.TopArg.Count;
                for (int i = 0; i < count; i++)
                {
                    for (int k = 0; k < this.argCount; k++)
                    {
                        StackFrame frame = context[k];
                        switch (this.function.ArgTypes[k])
                        {
                            case XPathResultType.Number:
                                args[k] = context.PeekDouble(frame[i]);
                                break;

                            case XPathResultType.String:
                                args[k] = context.PeekString(frame[i]);
                                break;

                            case XPathResultType.Boolean:
                                args[k] = context.PeekBoolean(frame[i]);
                                break;

                            case XPathResultType.NodeSet:
                            {
                                NodeSequenceIterator item = new NodeSequenceIterator(context.PeekSequence(frame[i]));
                                args[k] = item;
                                this.iterList.Add(item);
                                break;
                            }
                            default:
                                throw DiagnosticUtility.ExceptionUtility.ThrowHelperCritical(new QueryProcessingException(QueryProcessingError.Unexpected, System.ServiceModel.SR.GetString("QueryFunctionTypeNotSupported", new object[] { this.function.ArgTypes[k].ToString() })));
                        }
                    }
                    object obj3 = this.function.Invoke(this.xsltContext, args, contextNode);
                    if (this.iterList != null)
                    {
                        for (int m = 0; m < this.iterList.Count; m++)
                        {
                            this.iterList[m].Clear();
                        }
                        this.iterList.Clear();
                    }
                    switch (this.function.ReturnType)
                    {
                        case XPathResultType.Number:
                        {
                            StackFrame frame4 = context[this.argCount - 1];
                            context.SetValue(context, frame4[i], (double) obj3);
                            break;
                        }
                        case XPathResultType.String:
                        {
                            StackFrame frame3 = context[this.argCount - 1];
                            context.SetValue(context, frame3[i], (string) obj3);
                            break;
                        }
                        case XPathResultType.Boolean:
                        {
                            StackFrame frame5 = context[this.argCount - 1];
                            context.SetValue(context, frame5[i], (bool) obj3);
                            break;
                        }
                        case XPathResultType.NodeSet:
                        {
                            NodeSequence val = context.CreateSequence();
                            XPathNodeIterator iterator3 = (XPathNodeIterator) obj3;
                            val.Add(iterator3);
                            StackFrame frame6 = context[this.argCount - 1];
                            context.SetValue(context, frame6[i], val);
                            break;
                        }
                        default:
                            throw DiagnosticUtility.ExceptionUtility.ThrowHelperCritical(new QueryProcessingException(QueryProcessingError.Unexpected, System.ServiceModel.SR.GetString("QueryFunctionTypeNotSupported", new object[] { this.function.ReturnType.ToString() })));
                    }
                }
                for (int j = 0; j < (this.argCount - 1); j++)
                {
                    context.PopFrame();
                }
            }
        Label_03F6:
            return base.next;
        }