Template::Plugin::XSLT - Transform XML fragments into something else
XML::LibXSLT を用いて XSL 変換を行う Template-Toolkit プラグイン。(XML::LibXSLT を用いた処理に関しては 'Atom を RSS へ XSLT 変換するゲートウェイ' を参照) このプラグインを使うと、テンプレートに記述された XML 文書に対して XSL 変換を簡単に行うことができます。
例えば以下のような、RSS 1.0 を HTML に変換する XSLT を stylesheet.xsl といったファイル名で用意します。
<?xml version="1.0" encoding="utf-8" ?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:rss="http://purl.org/rss/1.0/"
exclude-result-prefixes="rdf rss">
<xsl:template match="/">
<xsl:apply-templates select="rdf:RDF" />
</xsl:template>
<xsl:template match="rdf:RDF">
<html>
<head>
<title>
<xsl:value-of select="rss:channel/rss:title" />
</title>
</head>
<body>
<ul>
<xsl:apply-templates select="rss:item" />
</ul>
</body>
</html>
</xsl:template>
<xsl:template match="rss:item">
<li>
<xsl:value-of select="rss:link" />
</li>
</xsl:template>
</xsl:stylesheet>
このスタイルシートを Template-Toolkit の FILTER を使って適用します。
[% USE transform = XSLT("stylesheet.xsl") -%]
[% FILTER $transform -%]
<?xml version="1.0" encoding="utf-8"?>
<rdf:RDF
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
xmlns:admin="http://webns.net/mvcb/"
xmlns:content="http://purl.org/rss/1.0/modules/content/"
xmlns:cc="http://web.resource.org/cc/"
xmlns="http://purl.org/rss/1.0/">
<channel rdf:about="http://naoya.dyndns.org/~naoya/mt/">
<title>NDO::Weblog</title>
<link>http://naoya.dyndns.org/~naoya/mt/</link>
<description>naoya's blog</description>
</channel>
<items>
<rdf:Seq>
<rdf:li rdf:resource="http://naoya.dyndns.org/~naoya/mt/archives/001228.html" />
<rdf:li rdf:resource="http://naoya.dyndns.org/~naoya/mt/archives/001227.html" />
<rdf:li rdf:resource="http://naoya.dyndns.org/~naoya/mt/archives/001226.html" />
</rdf:Seq>
</items>
<item rdf:about="http://naoya.dyndns.org/~naoya/mt/archives/001229.html">
<title>名古屋に来ました</title>
<link>http://naoya.dyndns.org/~naoya/mt/archives/001229.html</link>
<description>名古屋に来ています...</description>
</item>
<item rdf:about="http://naoya.dyndns.org/~naoya/mt/archives/001228.html">
<title>Perl で Win32 GUI 開発</title>
<link>http://naoya.dyndns.org/~naoya/mt/archives/001228.html</link>
<description>いやな日記 - Perl で GUI: Win32::GUI...</description>
</item>
<item rdf:about="http://naoya.dyndns.org/~naoya/mt/archives/001227.html">
<title>Perl で exe ファイルを作る - PAR</title>
<link>http://naoya.dyndns.org/~naoya/mt/archives/001227.html</link>
<description>いやな日記 - Perl のスクリプト...</description>
</item>
</rdf:RDF>
[% END -%]
といった具合で RSS フィードを FILTER で囲みます。テンプレートを展開した結果は、
$ tpage sample.tt <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>NDO::Weblog</title> </head> <body><ul> <li>http://naoya.dyndns.org/~naoya/mt/archives/001229.html</li> <li>http://naoya.dyndns.org/~naoya/mt/archives/001228.html</li> <li>http://naoya.dyndns.org/~naoya/mt/archives/001227.html</li> </ul></body> </html>
といった具合で XSL 変換されて出力されます。実際何に使うかは別としてこんなこともできるよと。例によって mt-tt プラグインで Hack すると面白いことができるかも。
ちなみにこのプラグイン、コードは結構コンパクトです。