なんとかなった、ような気がする
要は実体参照がどうこうの話なのだ、というところまではわかった。
改めて大元から順番にやり直し。さすがにイチから全部作り直すのは厳しいけれど、追いかけるべきポイントさえりかいできればなんとかなるだろう。
まったく問題ない状態だとどうなるのかを確認するために手作業で問題箇所を全部修正したものを用意して順にやってみる。んー、やっぱりこれだとうまくいく。
ところが、やっぱりそこから先がダメ。htmlspecialcharsで変換してまた変換して更に変換して途中で変換する前のデータを参照してそれを変換して、とか、なんだかそんな感じでグルグル回っている過程でおかしくなっているらしい。
昼過ぎてからもう一度頑張ってみた。うまくいくようないかないような。
と、急にすっと動いた。やった!
どうやらうまく行ったようなので次の自動更新を待つことに。その間にスパーへ買い物に。晩飯のサンマなど。
帰ってきてしばらくしてからひとつめの自動更新をチェック。
ダメだ……。
ああだこうだいじくってから次の自動更新を待つ。
やっぱりダメだ……。
何度目なのかもうよくわからなくなっているが、もう一度最初のファイルから順に見ていく。ああ、そうか、最初の段階で「変換→重ねて変換」と、「変換せずにそのまま出力」がどちらもある。後者は次の段階で変換しないといけないが、どうやらそもそも大元のデータに「&」と「&」が混ざっている……。
でも、なんで?
理由を考えてもしょうがない。どうやら配信されているデータそのものに混在しているらしい。
そうか、これを解決したらいいのか……。
でも、どうやって……?
PHPで煮詰まった時はググレと先達に教わったので教えの通りにググッてみたものの、なんとなく自分でとっかかりがつかめていないので何をどうググレばいいのかわからない。それでもしばらく探しているうちに、htmlspecialcharsには引数が指定できるということ、そして、第4引数が、「$double_encode」つまり、既に変換済みの文字をサイド変換するか否かのフラグだということが判明。しかも初期値はtrue、つまり、変換済みであっても変換する(例:&→&)という……。
まさに、これですよ。
ということで早速falseで設定、したつもりだけどうまく動かない。さらに、やっぱり二重に変換したり未変換のものが混ざっていたり。
これを最後にするつもりで順番にhtmlspecialcharsが使われている箇所を見ていく。矛盾が起こらないように見直しつつ、引数を設定していく。
動きました。
いつもならこれで安心して終了だけど、今回は色々身に沁みたのでダミーのファイルを作って色々なパターンを試してみる。
動いてる。
どうやら直ったらしい。
あとは明日の朝、順番に自動で動くかどうかだけ。それは実際に動かしたあとでないとわからない。
まあ、なんとなくすっきりしないが、よかったよかった。
そういえば途中で「ファイルサイズが大き過ぎるとか?」などと気持ちが迷走したせいでXSLTのdocument関数で参照するxmlファイルのサイズを大幅に小さく作り直してみた。もちろん、それでは何も解決しないのだが、どうも以前より明らかに処理速度が速い。
怪我の功名か。
ファイルサイズ縮小ついでに蓄積される履歴用xmlも小さくしてみた。なかなかいい。
明日になって「動いとる動いとる」ならいいけど、どうかなあ。
自分がまったく信用できない。