XMLの名前空間接頭辞をとっぱらうGaucheスクリプト

名前空間接頭辞があるとXPathが使いづらいから消してやる。
Gaucheのsxml.tree-transライブラリを使ってSXML変換をかける。

#!/usr/bin/env gosh
(use sxml.ssax)
(use sxml.tools)
(use sxml.serializer)
(use sxml.tree-trans)

(define (remove-namespace-prefix sxml)
  (pre-post-order sxml
		  `((*text* . ,(lambda (trigger x) x))
		    (*default* . ,(lambda x
				    (rxmatch-cond
				      ((rxmatch #/http\:\/\/\S+\:(.*)/ (symbol->string (sxml:name x)))
				       (#f name)
				       (sxml:change-name x (string->symbol name)))
				      (else x)))))))

(define (main args)
  (define sxml (call-with-input-file (cadr args) (cut ssax:xml->sxml <> '())))
  (srl:sxml->xml (remove-namespace-prefix sxml) (current-output-port)))

こんなRSSもこんなにすっきり。

<?xml version="1.0" encoding="UTF-8"?>

<rdf:RDF
 xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
 xmlns="http://purl.org/rss/1.0/"
 xmlns:content="http://purl.org/rss/1.0/modules/content/"
 xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/"
 xmlns:dc="http://purl.org/dc/elements/1.1/"
 xmlns:syn="http://purl.org/rss/1.0/modules/syndication/"
 xmlns:admin="http://webns.net/mvcb/"
>

  <channel rdf:about="http://b.hatena.ne.jp/hotentry/diary">
    <title>はてなダイアリーの人気エントリー</title>
    <link>http://b.hatena.ne.jp/hotentry/diary</link>
    <description>はてなダイアリーの人気エントリー</description>
    <items>
      <rdf:Seq>
	<rdf:li rdf:resource="http://d.hatena.ne.jp/nitoyon/20081212/hatebu_tips" />
      </rdf:Seq>
    </items>
  </channel>
  <item rdf:about="http://d.hatena.ne.jp/nitoyon/20081212/hatebu_tips">
    <title>はてなブックマークの細かすぎて伝わりにくい新機能を勝手に紹介 - てっく煮ブログ</title>
    <link>http://d.hatena.ne.jp/nitoyon/20081212/hatebu_tips</link>
    <description>はてなブックマークがリニューアルして毎日楽しく使っているわけですが...</description>
    <dc:date>2008-12-12T03:55:15+09:00</dc:date>
    <dc:subject>はてな</dc:subject>
    <dc:subject>hatena</dc:subject>
    <dc:subject>はてブ</dc:subject>
    <dc:subject>はてなブックマーク</dc:subject>
    <dc:subject>まとめ</dc:subject>
    <taxo:topics>
      <rdf:Bag>
	<rdf:li resource="http://b.hatena.ne.jp/t/%E3%81%AF%E3%81%A6%E3%81%AA" />
	<rdf:li resource="http://b.hatena.ne.jp/t/hatena" />
	<rdf:li resource="http://b.hatena.ne.jp/t/%E3%81%AF%E3%81%A6%E3%83%96" />
	<rdf:li resource="http://b.hatena.ne.jp/t/%E3%81%BE%E3%81%A8%E3%82%81" />
      </rdf:Bag>
    </taxo:topics>
  </item>
</rdf:RDF>

$ ./rmnspr.scm diary.rss

<?xml version="1.0" encoding="UTF-8"?>
<RDF>
  <channel about="http://b.hatena.ne.jp/hotentry/diary">
    <title>はてなダイアリーの人気エントリー</title>
    <link>http://b.hatena.ne.jp/hotentry/diary</link>
    <description>はてなダイアリーの人気エントリー</description>
    <items>
      <Seq>
        <li resource="http://d.hatena.ne.jp/nitoyon/20081212/hatebu_tips"/>
      </Seq>
    </items>
  </channel>
  <item about="http://d.hatena.ne.jp/nitoyon/20081212/hatebu_tips">
    <title>はてなブックマークの細かすぎて伝わりにくい新機能を勝手に紹介 - てっく煮ブログ</title>
    <link>http://d.hatena.ne.jp/nitoyon/20081212/hatebu_tips</link>
    <description>はてなブックマークがリニューアルして毎日楽しく使っているわけですが...</description>
    <date>2008-12-12T03:55:15+09:00</date>
    <subject>はてな</subject>
    <subject>hatena</subject>
    <subject>はてブ</subject>
    <subject>はてなブックマーク</subject>
    <subject>まとめ</subject>
    <topics>
      <Bag>
        <li resource="http://b.hatena.ne.jp/t/%E3%81%AF%E3%81%A6%E3%81%AA"/>
        <li resource="http://b.hatena.ne.jp/t/hatena"/>
        <li resource="http://b.hatena.ne.jp/t/%E3%81%AF%E3%81%A6%E3%83%96"/>
        <li resource="http://b.hatena.ne.jp/t/%E3%81%BE%E3%81%A8%E3%82%81"/>
      </Bag>
    </topics>
  </item>
</RDF>