XSLよーわからん(´・ω・`) おかわり

 いやもう大変でした。
 メッセンジャーのログ側が改行を <br /> に変換してくれてないので、何とかして改行を <br /> に変換しないと変な表示になる問題がありまして。
 昨日エントリを書いた時点では <pre> タグで囲んで誤魔化してたんですが、何か納得行かないので何とかしようと試みてみました。
 とりあえずは XPath 関数を調べてみて translate 関数が使えるかも? とやってみるも、第二引数と第三引数の扱いを勘違いしていて実は使えない関数だと発覚。
 仕方がないのでスクリプトでやるかとちょちょいと JavaScript を書き書き。しかし <xsl:value-of> タグはタグの位置に対応するテキストノードをべたっと展開するので改行が邪魔。これも上手く行きません。
 次の手をと <xsl:template> タグを用いて再帰的に substring-after 関数と concat 関数に突っ込む事で何とかしようと試みるも、<xsl:variable> は変数が const、これも断念。
 ひたすら悩んだ結果 translate 関数と JavaScript を組み合わせる事にしました。詰まり改行を translate 関数で他の文字に変換、その文字を <br />\n に再変換です。異様にアドホックで気に入らない解決策ですが仕方ありません。特殊文字代わりとして出現頻度の低そうな半角鍵括弧でも使っときませう。
 しかしこれも問題あり。 JavaScript で定義した関数の呼び出し側でシングルクォートを使っている為、対象のテキスト内にシングルクォートがあるとそのシングルクォートが引数括りの終わりと認識されてそのテキストが表示されません。なんてこった、ここまで来て……orz
 まあでも、さっきと同じ方法でいけるだろと translate 関数の引数にシングルクォートの実体参照を追加、特殊文字代わりに半角鍵括弧の残りを使えばいいかとやってみる物の。実体参照部分が普通のシングルクォート扱いで translate 関数の引数が不正に。ぽまいクォートの実体参照ってクォート内でも同種のクォート使える様に定義されてるんちゃうんかいと、どないせーっちゅうねんヽ(`Д´)ノ
 仕方がないので気持ち悪い物の JavaScript で定義した関数を呼び出す側で引数を括ってるクォートをダブルクォートにする事で凌ぎました。引数で渡してる <xsl:value-of> でもダブルクォート使ってていやんなんですが(´・ω・`)
 多分対象テキスト内にダブルクォートがあるとおかしな動作をする事でしょう……orz
 でも良いんです、長月の場合 MSN でのチャットでは顔文字の関係でシングルクォートは頻出する物のダブルクォートはあんまり出てこないですから(´・ω・`)
 すでにアドホックだし今更気にしないことにします。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA