private IEnumerable <XPathItem> CreateEnumerator(object[] dataPool, AbstractNode expr,
                                                         XPath2NodeIterator baseIter)
        {
            XPath2NodeIterator iter    = baseIter.Clone();
            ValueNode          numexpr = expr as ValueNode;

            if (numexpr != null && numexpr.Content is Integer)
            {
                Integer pos = (Integer)numexpr.Content;
                foreach (XPathItem item in iter)
                {
                    if (pos == 1)
                    {
                        yield return(item);

                        break;
                    }
                    else
                    {
                        pos--;
                    }
                }
            }
            else
            {
                ContextProvider provider = new ContextProvider(iter);
                object          res      = Undefined.Value;
                while (iter.MoveNext())
                {
                    if (m_contextSensitive || res == Undefined.Value)
                    {
                        res = expr.Execute(provider, dataPool);
                    }
                    if (res == Undefined.Value)
                    {
                        if (!m_contextSensitive)
                        {
                            break;
                        }
                        continue;
                    }
                    XPath2NodeIterator iter2 = res as XPath2NodeIterator;
                    XPathItem          item;
                    if (iter2 != null)
                    {
                        iter2 = iter2.Clone();
                        if (!iter2.MoveNext())
                        {
                            continue;
                        }
                        item = iter2.Current.Clone();
                        if (!item.IsNode && iter2.MoveNext())
                        {
                            throw new XPath2Exception("FORG0006", Resources.FORG0006, "fn:boolean()",
                                                      new SequenceType(XmlTypeCode.AnyAtomicType, XmlTypeCardinality.OneOrMore));
                        }
                    }
                    else
                    {
                        item = res as XPathItem;
                        if (item == null)
                        {
                            item = new XPath2Item(res);
                        }
                    }
                    if (item.IsNode)
                    {
                        yield return(iter.Current);
                    }
                    else
                    {
                        if (ValueProxy.IsNumeric(item.ValueType))
                        {
                            if (CoreFuncs.OperatorEq(iter.CurrentPosition + 1, item.GetTypedValue()) == CoreFuncs.True)
                            {
                                yield return(iter.Current);

                                if (!m_contextSensitive)
                                {
                                    break;
                                }
                            }
                        }
                        else if (CoreFuncs.GetBooleanValue(item))
                        {
                            yield return(iter.Current);
                        }
                    }
                }
            }
        }