ソート済みのカレントノードリストを表現するパターンが無いのは結構致命的かも知れない。xsl:for-each内で「1個まえに処理したノードと比べてみよう」と思った場合、どうにもならない。
$fooはノード集合として、1つ前に処理されたノードを変数に代入しようと思うと次のようになってしまう。XSLTにはグローバル宣言がないのでxsl:for-eachから出た時点で変数のスコープから外れてしまう。
<xsl:for-each select="$foo">
<xsl:sort select="." order="ascending"/>
<xsl:variable name="position" select="position()"/>
<xsl:for-each select="$foo">
<xsl:sort select="." order="ascending"/>
<xsl:if test="position() = 1">
<xsl:variable name="preceding" select="$foo[position() = $position - 1]"/>
</xsl:if>
</xsl:for-each><!-- この時点で$precedingは無効 -->
<!-- 実際の処理 -->
</xsl:for-each>
preceding-sibling軸はカレントノードリストとは関係ないのでこの文脈では使うことが出来ない。
原因は不明だがs42サーバ上のPHP4.3.5でXSLT関数を使う場合、xsl:for-eachやxsl:variableのselect属性に|が含まれていると沈黙する。expatのバージョンの問題かも知れない。解決策としてはDOMXML関数のXSLT機能を使えばよい。
Sablotronはxsl:sortでlang="ja"と書いておいても日本語のソートは出来ない。めちゃくちゃな順番になってしまう。残念ながら日本語でのソートは実装されていないようだ。
XMLDOM関数のXSLTは意外とまともかも知れない。xsl:outputの属性をいくつか無視するが、変換自体はXSLT関数より信用できる可能性がある。
家に帰るとHDDの温度がアイドリング状態にも関わらず40度を超えていた。熱い。
常駐しているIRCサーバの1つにここ1週間ぐらい繋がらなかった。
――と思っていたら、実はホスト名が変わっていたせい(ロードバランサーが原因)でオートジョインの対象サーバから外れていただけで接続は出来ていた。
アナウンス無いから変だとは思っていたのだが……。
MLで話が出ていたので「いっちょStrictにしてみっか」と思い手を出してみたが、あまりの煩雑さに3ページ書き直してやる気が失せた。
ここぞとばかりにHIMMELを投入しようかと思ったが、コメントは日本語だしまだまだバグだらけなのでやめておいた方が良いかも知れない。
こういう文章は書いている途中で飽きる。というより、既に飽きた。
いちおう完成させたが今一わかりにくい文章になってしまった。時間があったら書き直そう。
そういえば名前はSDL、SDMLと来て最終的にSDFに落ち着いた。ar19さんのアイデアとRDFから拝借させて頂いた。