7.サムネイルの自動生成
変換元ファイルの<a>タグにthumbnail="yes"を指定することで、リンク先画像のサムネイルを表示します。サムネイルは自動的に生成されます。このスクリプトを実行するには「Easyサムネイル」がインストールされている必要があります。
<?xml-stylesheet type="text/xsl" href="sample.xsl"?> <html> <head> <title>7.サムネイル自動生成</title> </head> <body> <h1>7.サムネイル自動生成</h1> <p> 画像リンク時に<a href="..." <span style="font-weight:bold;"> thumbnail="yes"</span>></a>とすることで、 リンク先画像のサムネイルを表示するスクリプトです。 サムネイル画像は自動生成されます。 </p> <a href="image00.jpg" thumbnail="yes"></a> <a href="image01.jpg" thumbnail="yes"></a> <a href="image02.jpg" thumbnail="yes"></a> </body> </html>
<?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>
変換の手順を大まかに示すと
thumbnail="yes"が指定された<a>タグより、リンク先画像の相対パスを得る。- その相対パスを
JScript関数createThumbnailに渡し、サムネイルを生成する。その後、サムネイルの相対パスを返す。 - 帰ってきたパスを使ってサムネイルを表示
となります。
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に特化したオリジナルのスクリプトを用意すれば、ホームページ製作がより省力化できると思います。この記事の内容がお役に立てれば幸いです。
参考文献
- XSLT
- @IT 『サンプルで覚えるXSLTプログラミング』 小山尚彦・Chienowa.comチーム 著、2000年10月
- @IT 『ファイル出力とXSLT機能拡張』 奥井康弘・吉田稔・青木秀起 著、2002年3月
- 『Studying XML for beginners』 A. Okazaki 著、2003年6月
- 『<xsl:script>/<msxsl:script>関数への引数についての覚え書き』 a.hanai 著、2001年6月
- JScript
- MSDN 『JScript』
- DOM
- MSDN 『DOM Reference(英語)』
- W3C勧告 『文書オブジェクトモデル(DOM)第1水準 仕様書』 1998年10月

