2011年7月17日日曜日

ソフトウェアデザインバックナンバー総集編DVD-ROM目次をhtmlに変換する。

SoftwareDesignの総集編DVD-ROM 2000..2009を持っています。

この一覧が見にくい。
index.htmlがDVDのルートにおいてあるんだけどそこからshockwaveプラグインで一覧表示をしている。

なぜ、見にくいかというとそのビューワである一冊を選ぶと目次が表示されるようになっているので
”ざらー”っと一覧で見るのが非常に面倒くさい。
Acrobatのindexファイルも付属しているので全文検索できるっちゃーできるけどそこまで大それて検索したいわけでもない(時のほうが圧倒的に多い)。

pdfの中に目次が含まれてれば最悪印刷しておいてペラペラ見ればいいか、と目次を探すとなんと!pdfには目次が含まれてない。
なんで??

で中を覗くと、なーんだlibsディレクトリにbacknumber.xmlがある。
どうやらビューワで覗けるのと同じ目次データが含まれているみたい。各冊の表紙画像へのリンクも含まれている。

変換スクリプト作ってこのxmlを目次の一覧と記事へのリンクを含むhtmlを作ればいいんだけどちょっと違う方法を考えた。
xmlファイルをそのまま使ってxsltで整形する。

これがうまく行けば頻繁に更新されるxmlファイルをいちいち変換スクリプトを通さずにhtmlファイルにブラウザを使って
変換表示できるかもしれない。

で、方法。
DVDのデータに加え、二つのxsl,xmlファイルを準備する。

ファイルの配置は以下。
・DVD-ROMの"libs""pdf"フォルダを"SD2000-2009"という名前のフォルダにコピー
・そのフォルダと同じ階層に作ったフォルダ(名前は任意)に二つのファイルを放り込む。

+ SD2000-2009
| + libs/
| + pdf/
| 
+ XSLXMLFolder(名前任意)
  + backnumber_reader.xml
  + backnumber.xsl 

一つ目のファイル backnumber_reader.xml というファイル名にした。
※このファイルは好きな名前にしても構わない。
<?xml version="1.0" encoding="Shift-JIS" ?>
<?xml-stylesheet type="text/xsl" href="backnumber.xsl" ?>

<!DOCTYPE backnumber [
  <!ENTITY backnumber SYSTEM "../SD2000-2009/libs/backnumber.xml">
]>

<backnumber>
  &backnumber;
</backnumber>

このファイルではbacknumber.xmlをまるごと
<backnumber></backnumber>
の中に、ガバっと取り込む。
でそれをbacknumber.xslで整形するようにstylesheetを設定してある。

二つ目のファイルは上記でスタイルシートとして設定した backnumber.xsl
<?xml version="1.0"?>
<xsl:stylesheet version="1.0"
 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output indent="yes" method="xml" encoding="UTF-8"/>

<xsl:variable name="top_path" select="'../SD2000-2009'"/>

<xsl:template match="/">

<html>

<head>
<title>software design</title>
</head>

<body>

<div class="year_anchor"><xsl:apply-templates select="backnumber/datas/data/@year"/></div>
<div class="books"><xsl:apply-templates select="backnumber/datas/data"/></div>

</body>

</html>

</xsl:template>

<xsl:template match="backnumber/datas/data/@year">
 <a>
   <xsl:attribute name="href">#<xsl:value-of select="."/></xsl:attribute>
   <xsl:value-of select="."/>
 </a>
</xsl:template>

<xsl:template match="backnumber/datas/data">
  <h1 class="year">
    <a>
      <xsl:attribute name="NAME"><xsl:value-of select="@year"/></xsl:attribute>
      <xsl:value-of select="@year"/>
    </a>
  </h1>
  <br/>
  <xsl:apply-templates select="book"/>
</xsl:template>

<xsl:template match="book">
  <div class="book">
  <h2 class="month"><xsl:value-of select="@month"/></h2><br/>
  <img class="coverimage">
    <xsl:attribute name="src">
      <xsl:value-of select="$top_path"/>/<xsl:value-of select="@coverImage"/>
    </xsl:attribute>
  </img>
  <table>
  <xsl:apply-templates select="page"/>
  </table>
  </div>
</xsl:template>

<xsl:template match="page">
  <tr>
    <td class="type">
      <xsl:value-of select="@type"/>
    </td>
    <td class="title">
      <a>
        <xsl:attribute name="href">
          <xsl:value-of select="$top_path"/>/<xsl:call-template name="replace">
     <xsl:with-param name="str" select="@filepath" />
     <xsl:with-param name="match" select="'\\'" />
     <xsl:with-param name="replace" select="'/'" />
          </xsl:call-template>
        </xsl:attribute>
        <xsl:value-of select="@title"/>
      </a>
    </td>
    <td class="page"><xsl:value-of select="@pages"/></td>
  </tr>  
</xsl:template>


<xsl:template name="replace"><xsl:param name="str"/><xsl:param name="match"/><xsl:param name="replace"/>
<xsl:choose>
 <xsl:when test="contains($str,$match)">
  <xsl:value-of select="substring-before($str,$match)"/>
  <xsl:value-of select="$replace"/>
  <xsl:call-template name="replace">
   <xsl:with-param name="str" select="substring-after($str,$match)"/>
   <xsl:with-param name="match" select="$match"/>
   <xsl:with-param name="replace" select="$replace"/>
  </xsl:call-template></xsl:when>
 <xsl:otherwise><xsl:value-of select="$str"/></xsl:otherwise>
</xsl:choose>
</xsl:template>

</xsl:stylesheet>

上記で説明したようにここにbacknumber.xmlが取り込まれているので
要素の選択はbacknumberからの検索パスを書くこと。

※2つめのファイルは恥ずかしいコードをいっぱい含んでいるので、
適切にカスタマイズしてね。お願い。
※pdfへのパスに文字列の書き換えをしている(参考:"FAQ的なXSLTのサンプル")
※ページトップ"年"リンクからジャンプする用のanchor日本語リンク("特別付録")の
文字化け対策としてbacknumber.xslのoutputは"xml"としてある。(参考:"@IT")

整形するとこんな感じになる。


で、残念ながらこの2段階xsl利用方法はIEでしか通用しなかった(試したのはIE8)
chrome:backnumber.xmlを読み込まなかった
safari:backnumber.xmlは読み込んだが、backnumber.xslを使った整形は行わなかった。
FireFox:試してない。
IE9:試してない。

というわけで激しくブラウザ依存。でもIE8が標準で入っているのならまぁ、許容?!

0 件のコメント:

コメントを投稿