xctxt.popPredicateRoot(); }  if(pass)
}  if (pass)
  public int getProximityPosition(XPathContext xctxt, int predPos)  {    int context = xctxt.getCurrentNode();    DTM dtm = xctxt.getDTM(context);    int pos = 0;    int parentContext = xctxt.getPredicateRoot();              try    {      xctxt.pushCurrentNode(parentContext);      DTMAxisTraverser traverser = dtm.getAxisTraverser(m_axisForPredicate);      for (int child = traverser.first(parentContext); DTM.NULL != child;              child = traverser.next(parentContext, child))      {        try        {          xctxt.pushCurrentNode(child);          if (NodeTest.SCORE_NONE != super.execute(xctxt, child))          {            boolean pass = true;                        try            {              xctxt.pushSubContextList(this);              xctxt.pushPredicateRoot(parentContext);                    for (int i = 0; i < predPos; i++)              {                XObject pred = m_predicates[i].execute(xctxt);                if (XObject.CLASS_NUMBER == pred.getType())                {                  if ((pos+1) != (int) pred.num())                  {                    pass = false;                    break;                  }                }                else if (!pred.bool())                {                  pass = false;                  break;                }              }            }            finally            {              xctxt.popSubContextList();              xctxt.popPredicateRoot();            }                                      if(pass)              pos++;            if (child == context)            {              return pos;            }          }        }        finally        {          xctxt.popCurrentNode();        }      }    }    catch (javax.xml.transform.TransformerException se)    {      // TODO: should keep throw sax exception...      throw new java.lang.RuntimeException(se.getMessage());    }    finally    {      xctxt.popCurrentNode();      // xctxt.popContextNodeList();    }    return pos;  }