Drop the gt(), as I’d assume it’s a tiny bit slower than :first.
Use not() in conjunction with :first and :last:
$('table#tbl > tbody > tr').not(':first').not(':last').addClass('highlight');
Most browsers automatically add an tbody element in the table markup if that’s missing, that is why the immediate children selector was failing – there were no <tr> elements as an immediate children to the <table> tag.
I am not 100% sure this is the way all browsers do it, so it would be safer to just add the <tbody> manually. Otherwise you need a little sniffing and cannot do it as an one liner:
if($('table#tbl > tbody').size() > 0) {
$('table#tbl > tbody > tr').not(':first').not(':last').addClass('highlight');
} else {
$('table#tbl > tr').not(':first').not(':last').addClass('highlight');
}
Hope this solves your problem!