July 20, 2004

Template::Plugin::XSLT

[ Perl ]
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 すると面白いことができるかも。

ちなみにこのプラグイン、コードは結構コンパクトです。

Posted by naoya at July 20, 2004 02:16 AM | トラックバック (0)  b_entry.gif
トラックバック [0件]
TrackBack URL: http://mt.bloghackers.net/mt/suck-tbspams.cgi/1134
コメント [0件]
コメントする









名前、アドレスを登録しますか?