neatNodePath

predicatesの組み合わせのうち、もっともマッチする要素数が少ないものを足していく、というルールで下から上にnodePath作ったらへんなのができる。

<div id="main">
    <div class="category">
        <ul>
            <li><a href="/cat/js">js</a></li>
            <li><a href="/cat/c">C</a></li>
        </ul>
    </div>
    <div class="nav">
        <ul>
            <li><a href="/page/1">prev</a></li>
            <li><a href="/page/2">2</a></li><li><a href="/page/3">3</a></li>
            <li><a href="/page/4">4</a></li><li><a href="/page/5">5</a></li>
            <li><a href="/page/6">6</a></li>
            <li><a href="/page/3">next</a></li>
        </ul>
        <ul>
            <li><a href="/page/1">prev</a></li>
            <li><a href="/page/2">2</a></li><li><a href="/page/3">3</a></li>
            <li><a href="/page/4">4</a></li><li><a href="/page/5">5</a></li>
            <li><a href="/page/6">6</a></li>
            <li><a href="/page/3">next</a></li>
        </ul>
    </div>
</div>

これで作ると

//div[contains(concat(" ",@class," ")," nav ")]/ul[last()]/li[last()]/a

こんなかんじになっちゃう。
いや、でも人間にとってなんかわかりにくいだけで間違ってはないかなー...