neta

XPath 1.0 は貧弱だなぁと改めて思った。属性値列挙型に弱すぎる。
body > div.section > div.section 的なことをがんばった例。

var pred = [
  'contains(concat("^", @class), "^section")',
  'contains(concat(@class, "$"), "section$")',
  'contains(@class, " section ")'
].join(' or ');
var xpath = ['descendant::h:body/h:div[', ']/h:div[', ']'].join(pred);

@class = "section" が抜けてた。

と言うか、これでいいのか。

var pred = 'contains(concat(" ", @class, " "), " section ")';

Selectors benchmark