js

なんかコード書くの自体が楽しくなってきた。

function ancestors(node) {
    var doc = node.ownerDocument;

    var getStepExpressionList = function (node) {
        if ( node.id ) {
            return ['id', node.id ];;
        }

        var predicates = [ node.nodeName.toLowerCase() ];
        ['class', 'rel'].forEach( function (name) {
            var v = node.getAttribute(name);
            if ( v ) {
                predicates.push( ['$' + name, v] );
            }
        } );
        return predicates;
    }

    return ( function me(node) {
        var parent = node.parentNode;
        return ( (parent && parent.nodeType != node.DOCUMENT_NODE) ?
                    me(node.parentNode) : [] ).concat(
                        getStepExpressionList(node) );
    } ).call(this, node);
}

var list = ancestors(anchor);
//  ["html", "body", "div", "div", ["$class", "nav"], "ul", "li", "a"]

(new XPathBuilder(list)).toString();
// html/body/div/div[contains(" " + @class + " ", " nav ")]/ul/li/a

XPathBuilderはXPathBuilder のやつ。
たぶんこれで真ん中に入ってる必要ないタグをバックトラックで刈り込んで // にしたりするのが直感的に書けるようになるはず。

と思ったけどこれはE4Xと同じように書けるようにしてるせいで配列要素がtest|predicateになってて使いにくい。配列要素がtest+predicateのセットになってないと困る。

あれ、さっきここにメモったやつが消えてる....