sxpathのクエリに正規表現を書けるようにする

「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)))