変換ハンドラによる低レベルな XML 操作
変換ハンドラは XSL 機能だけでは実現が不可能あるいは困難な処理を行うためのカスタマイズ機能です。開発者は TransformationHandler のサブクラスを作成し XSL 変換サーブレットのパラメータに指定することで DOM レベルの操作を行うことが出来ます。
この機能は以下のような目的を想定して設計されています。
- XML 以外の特定のフォーマットで記述されたテキストの清書。例えば Wiki などでよく見掛けるサンプルソースコード部分の清書など。
- 文書内に埋め込まれた MathML や SVG 記述などの画像化とリンクへの置き換え。
- 省略記述の補完。例えば画像に対する width, height 属性の自動挿入など。
変換ハンドラはコンテンツに動的な要素を追加するためのものではありません。XSL の変換結果は静的でなければならず、従って変換ハンドラは同じ XML に対して同じ結果をもたらさなければいけません。
サーブレットパラメータ keep-transformed-xml に true を指定することで変換ハンドラによって加工された結果の XML がキャッシュディレクトリに保存されます。
コーディング例
以下は XHTML 内の <a href="..."> 要素で指定したリンク先が存在する事を確認する変換ハンドラの例です。
package com.foo; import java.net.*; import org.w3c.dom.*; import org.koiroha.kwt.xsl.*; public class LinkCheckHandler implements TransformationHandler{ /** 処理の実行 **/ public Document process(Document doc, URI docroot, URI uri, Collection<Dependency> depend){ NodeList nl = doc.getElementsByTagNameNS("http://www.w3.org/1999/xhtml", "a"); for(int i=0; i<nl.getLength(); i++){ Element a = (Element)nl.item(i); check(uri, a.getAttribute("href")); } return doc; } /** リンク先の存在確認 */ private void check(URI base, String rel){ // ... return; } }
パラメータとして渡される DOM は変換対象 XML の変換前の状態です。ハンドラで定義する適切な変換を施して返値とします (パラメータと違う DOM のインスタンスを返すことも出来ます)。
コンパイルが済んだ変換ハンドラのクラスファイルは XSL サーブレットからロード可能な位置に配置します (クラスファイルなら WEB-INF/classes、JAR にまとめた場合は WEB-INF/lib の下)。
XSL サーブレットのパラメータに使用する変換ハンドラのクラス名を指定します。複数のハンドラを指定する場合は空白またはコンマで区切ってください。
<init-param> <param-name>transformation-handlers</param-name> <param-value> com.foo.LinkCheckHandler </param-value> </init-param>
Logging API の出力レベルを下げる事で詳細な情報がログ出力されます。

