ISBN番号のリストから書籍目録を作成するスクリプトを模索中。AmazonからのレスポンスはXMLなので積極的に活用していこうと考えてこんなことをしてみた。
gawk 'BEGIN{print"<?xml version=\'1.0\' encoding=\'UTF-8\'?>\n<?xml-stylesheet type=\'text/xsl\' href=\'getinfotest.xsl\'?>\n<foo xmlns:xi=\'http://www.w3.org/2001/XInclude\'>"}END{print"</foo>"}{printf"<xi:include href=\'http://xml-jp.amznxslt.com/onca/xml3?dev-t=ディベロッパーズトークン&t=アソシエイトID&type=lite&mode=books-jp&f=xml&locale=jp&sort=&AsinSearch=%%s\' />",$0}' < booklist.txt |xsltproc -o booklist.html --xinclude makelist.xsl -
使ってみたい人はAmazonから取得したディベロッパーズトークンとアソシエイトIDを上記にあてはめてシェルに打込めばよい。例によって例のごとくWindowsのコマンドプロンプト用にエスケープしてあることに注意。
makelist.xslの中身はこんなカンジ。
<?xml version="1.0" encoding="UTF-8" ?> <xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> <xsl:output method="xml" encoding="UTF-8" indent="yes" omit-xml-declaration="no" doctype-public="-//W3C//DTD XHTML 1.1//EN" doctype-system="http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd" /> <xsl:template match="/foo"> <html xml:lang="ja" xmlns="http://www.w3.org/1999/xhtml"> <head><title>booklist</title></head> <body> <ul> <xsl:apply-templates select="ProductInfo" /> </ul> </body> </html> </xsl:template> <xsl:template match="ProductInfo"> <li xmlns="http://www.w3.org/1999/xhtml"> <a> <xsl:attribute name="href"> <xsl:value-of select="Details/@url" /> </xsl:attribute> <xsl:value-of select="Details/ProductName" /> </a> </li> </xsl:template> </xsl:stylesheet>
元データとなるbooklist.txtの中身は以下のようなカンジでISBN番号がだらだらと並ぶだけのプレーンテキスト。
4049246473 4049246953 4049247267 4049247496 4088720717 4088720725 4088720733
スマートにできたと思う。それというのもXMLというものがネットワークに対して非常に透過的であることが理由のひとつと考えられる。しかし、この方法だと毎回全部をAmazonから取得しようとするので非常に非効率だし、Xincludeをサポートしているxsltプロセッサでなればいけない。やはりデータの取得と変換のプロセスは分けたほうがいいと結論。