2005 年 3 月の履歴(もしくは日誌)


2005 年 3 月

3 月 16 日

STX のバッファ

XSLT のように XML を変換する STX というものがあります.STX にはバッファ(Buffer)というものがあります.これは元の XML のある断片を保存しておく事ができます.XSLT にはない概念なので,これもよく分からないなぁと思っていたのですが,いろいろいじっているうちにいくつか分かった事があるので,まとめておきます.

Buffer は <stx:buffer name="test" /> のように名前をつけて,あらかじめ宣言しておく必要があるようです.

Buffer に XML の断片を格納するには stx:result-buffer を使います.たとえばこんな感じです:

<stx:template match="rss:title">
   <stx:result-buffer name="test" clear="no">
   <li><stx:value-of select="." /></li>
   </stx:result-buffer>
</stx:template>

格納したものを呼び出すのには stx:process-buffer を使います.そのときにどんな処理をして呼び出すのかを指定しなければなりません.

STX にはグループ (stx:group) があり,これに名前を付けて処理を記述し,名前を指定して,Buffer の内容などを処理することができます.

<stx:process-buffer name="test" group="copy"/>

つまり,Buffer の内容はなんか処理しないと出力もできません.

以下に,内容を単にコピーするグループの例を示します:

<stx:group name="copy">
   <stx:template match="*|text()|@*">
      <stx:copy>
         <stx:process-attributes />
         <stx:process-children />
      </stx:copy>
   </stx:template>
</stx:group>

XSLT でも,よく全部をコピーするテンプレートとか使いますが,あれと同じようなものです.

これで元の XML の一部分を Buffer にとっておいて,何種類かの処理を順番に行うなんてことができるわけです.

まったく実用的ではないですが,最後に極単純な Buffer の例として RSS 1.0 の中から rss:title だけ抽出してリストとして XHTML で出力するという STX スタイルシートを示します:

<?xml version="1.0" encoding="utf-8"?>
<stx:transform version="1.0"                               
  xmlns:stx="http://stx.sourceforge.net/2002/ns"
  xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
  xmlns="http://www.w3.org/1999/xhtml"
  xmlns:rss="http://purl.org/rss/1.0/"
  exclude-result-prefixes="rdf rss"
  strip-space="no"
>

<stx:buffer name="test" />

<stx:template match="/">
   <stx:process-children />
   <html>
      <head><title>STX Buffer Test</title></head>
   <body>
      <ul>
         <stx:process-buffer name="test" group="copy"/>
      </ul>
   </body>
   </html>
</stx:template>

<stx:group name="copy">
   <stx:template match="*|text()|@*">
      <stx:copy>
         <stx:process-attributes />
         <stx:process-children />
      </stx:copy>
   </stx:template>
</stx:group>

<stx:template match="rss:title">
   <stx:result-buffer name="test" clear="no">
      <li><stx:value-of select="." /></li>
   </stx:result-buffer>
</stx:template>

</stx:transform>

Buffer に一度格納したものを,何種類かの処理を指定して何度か繰り返して処理するなんてこともできます.XSLT にはない独特の機能ですね.

過去の STX の話題:

http://onohiroki.cycling.jp/tb/tb.cgi/weblog_d20050316n3 TrackBack

@nak(あ)さん,日付の間違いのご指摘ありがとう.森さん,わざわざエントリーたててトラックバックまでしてくださってありがとう.