閑話休題:XSLT3.0への道

ひどいことにW3CのXSLのホームページは2009年11月からちっとも更新されていません.このページではXSL、XPathXSLTをカバーしているはずなのですが、最新の動向は何もないように見えます.
 
 
しかしページが更新されていなくとも、確実にXSLT関連の作業は進んでいます.W3Cは2010年5月12日にXSLT2.1の最初のワーキングドラフトを公開しました.
 
 
そしてエディタのMichael Kayはこれと同じ内容と従来のXSLT2.0からの違いが色づけでひと目でわかる版も公開しています.
 
 
また何か順番が逆のような気もしますが、2010年6月10日にW3CはXSLT2.1の要求仕様と使用例のドラフトを発表しています.
 

次いで2010年12月16日、W3Cは関連するXQeryとXPathのワーキングドラフトのバージョンを3.0にすることを発表しました.
 
 
ということは、すなわちXSLTも次はXSLT2.1ではなくXSLT3.0となるでしょう.実際Michael Kayは2010年10月にSaxon 9.3を発表しています.Saxon 9.3にはすでにこのXSLT3.0の機能が搭載されていることがうたわれています.
 
 
XSLT3.0の機能はオープンソース版のSaxon HE(Home Edition)には搭載されていませんが、有償のSaxon EE (Enterprise Edition)、そして部分的にSaxon PE (Professional Edition)から使用できるようになっています.
XSLT3.0の最大の拡張はソースドキュメントをストリーミング化可能にした点です.これは今までのXSLTプロセッサが入力をメモリー上にソースツリーとして構築してから変換を行っていました.
 
例えばMSXMLを使う次のコードは、そのアーキテクチャをシンプルな形で表しています.
 
var xmldoc = new ActiveXObject("Msxml2.DOMDocument.5.0");
var xsldoc = new ActiveXObject("Msxml2.DOMDocument.5.0");
xmldoc.load("sample.xml");
if (xmlDoc.parseError.errorCode <> 0) {
   var myErr = xmlDoc.parseError;
   alert("You have error " + myErr.reason);
} else {
   xsldoc.load("sample.xsl");
   output = xmldoc.transformNode(xsldoc);
}
 
ソースドキュメント(sample.xml)をパーサーでロードし、XSLファイル(sample.xsl)をロードし、transformNode(XSLTの呼び出し)を行うというパターンです.ソースドキュメントもスタイルシートもすべてメモリー上に存在します.
 
XSLT3.0のストリーミングモードを使えば、もはやソースドキュメントは最後まで読んでメモリー上に保存しなくともよくなります.これは、従来大きなXMLデータを扱うときに問題になっていたXSLTの致命的欠点を克服するものです.そして「だからXSLTは遅い!」と、XSLT否定派からいつも言われていたことへの回答でもあると思います.
 
ストリーミングは先頭から後方へという順でしか処理ができません.従って使える命令にはおのずから制限が生まれます.しかしこの拡張は今までできなかった大規模なデータ処理の分野にXSLTを広げるものとして大いに注目されて良いでしょう.
(残念ながらストリーミングは、安価に入手可能なSaxon PEでは制限されているようです.EEが必要.)
 
それにしても、XSLT3.0のワーキングドラフトが発表され、すでにSaxonで実装が始まっているのに、従来のXSLTプロセッサはどうも開発の動きが鈍いように思えます.ApacheのXalanにしてもMicrosoftMSXML/.netにしてもXSLT2.0になる気配は感ぜられません.XSLTXMLを使う際の基盤技術です.オープンソースのXalanはともかくとしても、資金力、開発力もありWindowsというOSを提供しているマイクロソフトがXSLT1.0の呪縛の中にユーザーをいつまでも閉じ込めておくのは何か裏切りにも似た感じを受けますがいかがでしょうか?