「sxpathがとてもわかりにくい」の補足。
sxpathのクエリに正規表現を埋め込めるようにしてみた。
クエリの中に正規表現が出てきた場合、「子ノードの中から」テキスト要素でかつ正規表現にマッチするものを取り出す(子ノードから選ぶのは、他のクエリも(「//」を除いて)子ノードについて探索をおこなうから)。
たとえば
((sxpath-rx '(// a @ href #/\.html$/)) node)
で、a要素のhref属性の値のうち、「.html」で終わるものだけを取り出す。a要素全体が必要なら
((sxpath-rx '(// (a (@ href #/\.html$/)))) node)
と書く。
やっていることは、クエリに出てくる正規表現を関数に置き換えてからsxpathに渡しているだけ。
(use sxml.sxpath) (define (sxpath-rx query) (define (select-kids-rx rx) (lambda (nodeset . args) ((select-kids (lambda (node) (and ((ntype?? '*text*) node) (rx node)))) nodeset))) (define (subst-rx query) (cond ((null? query) '()) ((regexp? (car query)) (cons (select-kids-rx (car query)) (subst-rx (cdr query)))) ((pair? (car query)) (cons (subst-rx (car query)) (subst-rx (cdr query)))) (else (cons (car query) (subst-rx (cdr query)))))) (sxpath (subst-rx query)))