Jintrick.netagenda2003年11月アーカイブ → 2003年11月06日

XSLT文書をテンプレートに(サーバアプリケーション用メモ)

PythonのSimpleHTTPServerをちらちら見ているところ。ディレクトリが要求されたときには、フォルダ内のファイル一覧をリストしたHTMLソースを直接書き込んでいるようだ。

ここで悩む。まず、構造化テキストとしてHTMLを扱いたい。直接ソースを書くやり方は嫌だ。するとDOMを利用して生成するとか? しかしDOMだとメンテナンス性が悪い。一目でどういう構造のHTMLになっているのかが分からないのも嫌だ。するとテンプレートを用意しておくことが考えられる。しかし変数となる文字列を考えたりするのが億劫で嫌だ。テンプレートと言えばXSLTなのだけれども、これはスタイルシートであって、変換元となるXML文書がないことには意味を持たない。<root />なる無意味なXMLデータを変換するという形式にしてパラメタを与えれば実現はできるものの、そのままやるのはとってもナンセンス。

要するに:

<xsl:template name="list" xmlns:xsl="..">
<title><xsl:value-of select="$title" /></title>
<h1><xsl:value-of select="$title" /></h1>
<ul>
<xsl:for-each select="$list">
  <li>
    <a href="{?}"><xsl:value-of select="?" /></a>
  </li>
</xsl:for-each>
</ul>
</xsl:template>

このようなテンプレートにパラメタを与えることで、ソース文書無しにHTMLを生成したい。つまりXSLTを単なるテンプレート言語として使いたい。プロセッサの簡単なラッパで一瞬やれるかと思ったのだけれど、ここで$listに注目すると、XSLT1.0ではノード集合でなければならない。XSLT2.0でない限り、ノード集合以外をシーケンスとして扱えない。つまり「簡単なラッパ」では駄目。

TemplateProc という、あるXSLTプロセッサのラッパを作ったとする。インスタンスを生成する際に、パラメタを与える。


params = { 'title':'Index of "/"', 'list':('index.html', 'inde.rdf')}
tp = TemplateProc(params)

で、内部では:

<rdf:RDF
 xmlns=".."
 xmlns:rdf="..">

<params>
  <title>Index of "/"</title>
  <list>
    <rdf:Bag>
      <rdf:li>index.html</rdf:li>
      <rdf:li>index.rdf</rdf:li>
    </rdf:Bag>
  </list>
</params>

</rdf:RDF>

こんなのを生成して、これ(実質的にパラメタ)をソース文書としてスーパークラスのXSLTプロセッサに変換させる。XSLTスタイルシートの方はこのように書けばよい。

<xsl:stylesheet version="1.0"
xmlns:xsl=".." xmlns:rdf=".."
>

<xsl:param name="list" select="/*/*/list" />
<xsl:param name="title" select="/*/*/title" />

<xsl:template match="/">
<title><xsl:value-of select="$title" /></title>
<h1><xsl:value-of select="$title" /></h1>
<ul>
<xsl:for-each select="$list/*/rdf:li">
  <li>
    <a href="{.}"><xsl:value-of select="." /></a>
  </li>
</xsl:for-each>
</ul>
</xsl:template>

</xsl:stylesheet>

ソース文書はパラメタであるという発想の転換。といかパラメタだし。

こっち用のネタではなかったも。実装したらあっちに書くことに。ともかくまだ何も決まっていない。


昨日(今日?)のアイデアを実装するだけしてみた。まだ一度も動かしていないという。要するに、(Movable Typeとかの)テンプレートの書式を考えるのが面倒だから、XSLT文書をテンプレートに使ってしまおうという話。これなら書式はXSLTの完全なサブセットでOKで、新たに覚えることは殆ど無い筈。

RDF/XMLを内部で使用するのは、単にメタデータを表現するXMLとしてRDF/XMLしか知らないから。新たに覚えることが何も無いのが唯一のメリット。再考の余地ありまくり。

XSLTプロセッサは4Suiteライブラリから拝借。これは再考の余地は無い。今まで何も問題なく働いてくれているから。


webmaster@jintrick.net
公開: 2003年11月06日
カテゴリ: Python ,XSLT