}
if(contextItem != null)
{contextSequence = contextItem.toSequence();}
Sequence result;
final Expression arg = getArgument(0);
// case 1: if the argument expression returns a node set,
// subtract the set from the context node set and return
// the remaining set
if (Type.subTypeOf(arg.returnsType(), Type.NODE) &&
(contextSequence == null || contextSequence.isPersistentSet()) &&
!Dependency.dependsOn(arg, Dependency.CONTEXT_ITEM)) {
if (contextSequence == null || contextSequence.isEmpty()) {
// TODO: special treatment if the context sequence is empty:
// within a predicate, we just return the empty sequence
// otherwise evaluate the argument and return a boolean result
// if (inPredicate && !inWhereClause)
// result = Sequence.EMPTY_SEQUENCE;
// else
result = evalBoolean(contextSequence, contextItem, arg);
} else {
result = contextSequence.toNodeSet().copy();
if (inPredicate) {
for (final SequenceIterator i = result.iterate(); i.hasNext();) {
final NodeProxy item = (NodeProxy) i.nextItem();
// item.addContextNode(getExpressionId(), item);
if (contextId != Expression.NO_CONTEXT_ID)
{item.addContextNode(contextId, item);}
else
{item.addContextNode(getExpressionId(), item);}
}
}
// evaluate argument expression
final Sequence argSeq = arg.eval(result);
NodeSet argSet;
if (contextId != Expression.NO_CONTEXT_ID) {
argSet = argSeq.toNodeSet().getContextNodes(contextId);
} else {
argSet = argSeq.toNodeSet().getContextNodes(getExpressionId());
}
result = ((NodeSet)result).except(argSet);
}
// case 2: simply invert the boolean value