SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

特集記事

ホームページ製作を楽にする7つのXSLTスクリプト

XSLTでXHTMLを操作しホームページ作成作業を半自動化する

7.サムネイルの自動生成

 変換元ファイルの<a>タグにthumbnail="yes"を指定することで、リンク先画像のサムネイルを表示します。サムネイルは自動的に生成されます。このスクリプトを実行するには「Easyサムネイル」がインストールされている必要があります。

変換元ファイル
<?xml-stylesheet type="text/xsl" href="sample.xsl"?>

<html>
<head>
  <title>7.サムネイル自動生成</title>
</head>
<body>

<h1>7.サムネイル自動生成</h1>

<p>
  画像リンク時に&lt;a href="..." <span style="font-weight:bold;">
thumbnail="yes"</span>&gt;&lt;/a&gt;とすることで、
リンク先画像のサムネイルを表示するスクリプトです。
サムネイル画像は自動生成されます。
</p>

<a href="image00.jpg" thumbnail="yes"></a>
<a href="image01.jpg" thumbnail="yes"></a>
<a href="image02.jpg" thumbnail="yes"></a>

</body>
</html>
変換結果
変換結果
XSLTスクリプト
<?xml version="1.0"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                xmlns:msxsl="urn:schemas-microsoft-com:xslt"
                version="1.0">

  <!-- パス関係用 -->
  <xsl:import href="../4/app1.xsl"/>

  <!-- 出力モード -->
  <xsl:output method="html" encoding="Shift_JIS"/>

  <!-- 処理命令は無視 -->
  <xsl:template match="processing-instruction()"/>
  <xsl:template match="processing-instruction('xml-stylesheet')">
    <xsl:apply-imports/>
  </xsl:template>

  <!-- ノードや属性はそのまま出力 -->
  <xsl:template match="@*|node()" priority="-1.0">
    <xsl:copy><xsl:apply-templates select="@*|node()"/></xsl:copy>
  </xsl:template>

  <!-- サムネイル生成 -->
  <msxsl:script language="JScript" implements-prefix="xmlns">
    //aタグを渡すことでサムネイル画像を自動生成し、そのパスを返す。
    function createThumbnail(src)
    {
      // サムネイル画像のパス
      var thumb = src.replace(/(.*\/)?([^\/]*?)(?:\.[^.\/]*)?$/,
        "$1thumbnail/$2.png");
      // サムネイル画像を入れるフォルダ
      var thumbf = src.replace(/(.*\/)?([^\/]*?)(?:\.[^.\/]*)?$/,
        "$1thumbnail");

      // ファイルが存在するかどうか調べる
      var fso = new ActiveXObject("Scripting.FileSystemObject");
      if(!fso.FileExists(getLocalPath(thumb)))
      {
        // thumbnailファイルがない
        // 変換開始
        // イージーサムネイル
        var easy = new ActiveXObject("ZICONVINP.EasyThumbnail");
        easy.BitCount = 8;        // 256色
        easy.ConvertEndMode = 0;  // 変換後に何もしない
        easy.cxImage = 64;        // サムネイルサイズX
        easy.cyImage = 64;        // サムネイルサイズY
        easy.ImageZoom = 2;        // 縦横比を無視してズーム
        easy.PngIsInterlace = 0;  // プログレシブPNGではない
        easy.TargetFolder = getLocalPath(thumbf);
        easy.TargetFolderMode = 0;// ターゲットフォルダに直接出力
        easy.TargetImageType = "png";
        easy.ConvertFiles(getLocalPath(src));
      }

      // thumbnail画像のパスを帰す
      return thumb;
    }
  </msxsl:script>

  <xsl:template match="a[@thumbnail='yes']">
    <xsl:copy>
      <xsl:apply-templates select="@*[name()!='thumbnail']|node()"/>
      <img src="{xmlns:createThumbnail(string(@href))}"
           style="border-style:none;"/>
    </xsl:copy>
  </xsl:template>

</xsl:stylesheet>

 変換の手順を大まかに示すと

  1. thumbnail="yes"が指定された<a>タグより、リンク先画像の相対パスを得る。
  2. その相対パスをJScript関数createThumbnailに渡し、サムネイルを生成する。その後、サムネイルの相対パスを返す。
  3. 帰ってきたパスを使ってサムネイルを表示

 となります。

 2番でcreateThumbnail関数に渡されるのは『変換元ファイルから見た』相対パスです。しかも、区切り記号が「/」であるため、そのままJScript内で使用することはできません。そこで、「4.ヘッダ&フッタの自動追加」で作成したgetLocalPath関数を使い、内部で絶対パスに変換しています。

 1番と3番の処理は、XSLTのテンプレート中で行われます。

<xsl:template match="a[@thumbnail='yes']">
  <xsl:copy>
    <xsl:apply-templates select="@*[name()!='thumbnail']|node()"/>
    <img src="{xmlns:createThumbnail(string(@href))}"
         style="border-style:none;"/>
  </xsl:copy>
</xsl:template>

 サムネイルを生成する関数createThumbnailが呼び出され、戻り値をimgタグのsrc属性にセットしています。

まとめ

 XSLTを使うと、ホームページ製作の作業を一部自動化することができます。また、変換元ファイルのコードが見やすくなるという利点もあります。

 今回は一例として7つのスクリプトを紹介しました。自分のHPに特化したオリジナルのスクリプトを用意すれば、ホームページ製作がより省力化できると思います。この記事の内容がお役に立てれば幸いです。

参考文献

この記事は参考になりましたか?

連載通知を行うには会員登録(無料)が必要です。
既に会員の方はを行ってください。
特集記事連載記事一覧

もっと読む

この記事の著者

ひだちのいろ(ヒダチノイロ)

大学生。IT関係の仕事につくのが夢です。かやねずみの巣

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/1055 2008/08/26 13:37

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー