透過

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=ディベロッパーズトークン&amp;t=アソシエイトID&amp;type=lite&amp;mode=books-jp&amp;f=xml&amp;locale=jp&amp;sort=&amp;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プロセッサでなればいけない。やはりデータの取得と変換のプロセスは分けたほうがいいと結論。