再開というか、べつに休んでいたつもりではなかったのだけれども、まあ再開という感じで。っていうかまだスタイルシート (相変わらず XML+XSL でごにょごにょしたいのぉっていう) すら書いていない状態だったりするので、無駄に様変わりとかしていくかもしれません。いちおう、それなりに構想はあるのだけれども、実現できる技量があるかどうか微妙なところ。
で、当面は生存報告をしていく予定であって、たいしたことを書くつもりは無いので面倒な「過去ログの保存」はしないことにしましたとさ。まあ「たいしたもの云々」というのは文書製作者が決めることではなく、利用者が決めるというか、その辺の判断は利用者に委ねるべきことなのだけれども。あと、保存はしないので更新のあの辺が整うまではブログはやらない (宣言) 。
WWW で文書を公開していると無駄に説明口調になっちゃうのな。
そういえば現在利用しているサーバ、 XREA では、「 index.html が無いと消しますよ」というようなことを言っていた気がしたのだけれど、どうなんだっけ。まあ消されたら消されたで良いやという勢いで遊べばいいや。ちなみに本文書
ホームページは home.shtml 。
http://klezer.s53.xrea.com/_no/200410c#d21h00m00
HTML 文書を作成するにあたり利用させてもらっているエディタは TTT Editor で、大きな不満もなく慣れてしまったものだから他に乗り換えるのに消極的なわけであります。それはまあいいや。
で、現在 (っていうかいっこ書いただけだけど) 、見出しには「西暦-月-日T時:分:秒+タイムゾーン」という形式を採用しているのだけれど、どうも TTT Editor では年月日と (秒まで含めた) 時間を一発で挿入することができないようで、その一点が不満だったりするわけです。
それぞれのフォーマットは変数を用いることにより細かく指定することが出来るので、試しに「日付」のフォーマットの方に yyyy"-"mm"-"dd"T"hh":"nn":"ss"+09:00"
なんて指定したとしても、出力されるのは 2004-10-21T00:00:00+09:00
だったりするのであります。「時刻のフォーマット」の方に前述のものを指定してもやはり上手くはいかない。
見出しを変えれば解決しますよ、というお話。っていうか、なんで「日付」と「時刻」で分けているんだろう。時刻までは挿入したくないっていうのならば、フォーマットの方に時刻の変数を設けなければ済む話だと思うのだけれど。何か見落としているのかな。
http://klezer.s53.xrea.com/_no/200410c#d21h01m04
そういえば、大半のサーバではファイル名を指定しなかったときは index. を探しにいくように設定されているのだけれど、なんでだろうと考えた。でもわからなかった。 UNIX とかその辺が関係しているのかな。
HTML の仕様から考えると index は目的の情報を探すために手がかりとなる文字または記号
というよりも索引という意味合いが強いわけで、ファイル名を指定しなかったら索引を表示するというのはなんだか妙な感じがするのです。同じように HTML の仕様から考えると ( contents は「内容」ではなく「目次」っぽいので) 、索引ではなく目次、つまり、 contents.html などを探しにいくというならば、なんとなくシックリは来る (個人的に) 。 cover や home なんてのが慣例だったら良かったのに。
「ホームページ」に index というファイル名を使用してしまうと、いざ索引を作るときファイル名に困らないのかな。今はそーゆー話をしてたんですよ! 私はッ!! っていうか、目的の情報を探すために手がかりとなる文字または記号
という意味で使われているから index を探しに行ってるんだろうな。
http://klezer.s53.xrea.com/_no/200410c#d21h20m46
XML 文書から XHTML 文書へ XST 変換する際、不必要な名前空間を exclude-result-prefixes
で以って除去するよう記述していたのだけれど、これがどうにも上手く行かなく困っていた。原因のひとつはどうやら xsl:copy
がらみなようだった。対処法がわかった今でもその理屈がいまいち飲み込めていなのがなんとも。まあそれはさて置き、有用な文書を見つけることができ、よかったよかった。ところで挙動としてはどっちが正しいのだろうか (「どっち」っていうのも謎っぽいけど) 。
http://klezer.s53.xrea.com/_no/200410c#d21h23m03
XSL 変換する際、無知ゆえに理解できないエラーが出る。次のものがそれ。
子ノードの生成後や要素の生成前に属性
hoge
を要素に追加することはできません。その属性は無視されます。
あらゆる要素に属性を設けてはダメなのかなと思ったものの、そうでもないようで、無視され
ても変換後の文書にはきちんとその属性が設けられているものだから、原因究明に努めようとは思えないのでありました。やってはいけないことをやっているばつの悪さには目を瞑りつつ。ただ、なんとなくだけれど、エラーの原因は『不必要な名前空間の削除』と関連しているような気がする。あくまで気がするだけ。備忘。
ちなみにソース文書は 200410c.xml 。で、この klz:weblog
や klz:note
の子要素に設けられている属性に対し、エラーが返されるという。ってソース文書を公開したところで、スタイルシートを公開しなければどうにもならないんだろうけれど、スタイルシートはわんぱく過ぎるので公開しない。「わんぱく」って漢字で書くと「腕白」なんだ。へえ。実際にペンを使って文字を書かずに PC などを使っていると漢字が書けなくなる、なんて言うけれど、読み取る力はつくように思った。
http://klezer.s53.xrea.com/_no/200410c#d22h20m24
構想などをつらつらと。
klz:weblog
要素と klz:note
要素は別個のファイルに出力klz:weblog
要素は作成日記のディレクトリへ吐き出すようにし、 klz:note
要素は身辺雑記? 用のディレクトリへ吐き出すようにするため。klz:weblog
要素だけを切り抜く (という表現は妥当ではないだろうけれど) 、 klz:note
要素だけを切り抜く、そしてそれぞれを所定のファイルに出力するというスタイルシートならば今の知識でも十分書けるだろう。関連の薄い話。 /net/latest
からリダイレクトしないのはまだ形が整っていないからであります。決して意地悪目的で放置しているわけじゃあ……。スタイルシートなどが整ったらきちんとこちらにリダイレクトするようにします。見ている人がいるのかはわからんけれど、ご報告として。
http://klezer.s53.xrea.com/_no/200410c#d23h19m36
substring
関数を使ってみる構想などをつらつらと。
klz:hd
要素があればそれを用いる。もし子要素に klz:hd
要素がなかったら (klz:weblog
|klz:note
) の date
属性値を見出し要素とする。そのまま見出しとしてしまってもいいけれど、「読める」方が好ましいので (可能であれば) 日本語っぽく。「YYYY年MM月DD日hh時mm分」とか。
<xsl:value-of select="concat(substring(@date, 1, 4),'年',substring(@date, 6, 2),'月',substring(@date, 9, 2),'日',substring(@date, 12, 2),'時',substring(@date, 15, 2),'分')" />
もう少し効率的な構文があるんじゃないかという感じ。 @date
というのはソース文書 (200410c.xml) を参照のこと。
そういえば、 date
属性の値を空にしたら先日書いた理解出来なかったエラーが出なかった。とはいっても、出力された HTML 文書も空っぽ同然のものだったけれど。あと、小見出しとかどうしようと今焦っている。思い切り失念していた。
id
属性値は (klz:weblog
|klz:note
) 要素の date
属性値から」形としては「*.shtml#d日h時m分」となる。数字の取り方は先述の見出し要素のそれと似た感じで。以下、中途半端な範例。
<xsl:value-of select="concat('#','d',substring(@date, 9, 2),'h',substring(@date, 12, 2),'m',substring(@date, 15, 2))" />
半角スペースは Shift + で出せたりする。ちょっと前に発見した。いちいちとマーク付けをしている人は、これを覚えておくと便利です。入力モードを切り替えなくて済むので。まあボタンひとつで切り替えられるけれど。勢い余って確定前に切り替えちゃってあぼーんなんてことは無くなります。
http://klezer.s53.xrea.com/_no/200410c#d23h21m05
構想などをつらつらと。
http://klezer.s53.xrea.com/_no/200410c#d24h01m52
「リンクを貼るも剥がすもご自由に」と明言してるサイトなのにも関わらず、移転などでサイトの URI の変更が余儀なくされてしまうと、 href 属性値の変更をお願いする人が稀にいる。このお願いはどう考えてもおかしい。お願いされたとしても受諾するかは利用者に委ねられるからいい? そんなのはおかしい。たとえば「リンクを剥がすのも自由です。でも剥がさないでください」と言っていたらどうだろう。ちっとも自由じゃないじゃんっていう。
そもそも移転前の URI だってそれ単体で情報としての価値はあったりする。少し前に、移転を理由に古いコンテンツをバッサリと削除したサイトがあった。そのサイトはとても有用でおそらくはたくさんの人が役立てていたサイトだと思う。しかし製作者はコンテンツを削除した。こんなとき旧来 (でなくとも良いけれど) の URI が記憶やブックマーク、リンクページ、何でも良いけれど、とにかく残っていれば Internet Archive: Wayback Machine で検索して目的のリソースを探し出せるかもしれない。
だから、たとえ 404 NotFund を返してくる URI であっても、当該文書が移転の告知のみであっても、その URI は残しておいたりする。ローカルでも WWW 上のものでも。
ところで、移転し URI の変更をお願いをするくらいなら無料URL転送 www3.to by SmarTrans.com で転送用 URL でも取得しておけば良いんじゃないかって思う。 Persistent URL Home Page なんてものもあるけれど、こっちは、その。
なんかゴッチャになってるな、これ。と追記。
http://klezer.s53.xrea.com/_no/200410c#d26h21m42
starts-with
関数と substring-after
関数を使ってみたこのサイトは単一の XML 文書から XSL 変換することによって、それぞれ、最新のものはドキュメントルート、古いものは各種に応じてひとつ下のディレクトリに保存されるのですが、そうしたかたちを取っていると現在のスタイルシートを使っての変換をしたときに、相対 URL を使ってリソースを参照していると困るのです。
スタイルシートを書き足さずこの問題への対処として、ソース文書の方の href
の属性値を変えてしまうというのが挙がったのですが、href
属性値を /
からはじめてしまうと (ファイルの構造上) ローカルでは参照ができなくなってしまい困る。また、絶対 URL ではじめてしまうと公開するサーバを変えたときに困る (かもしれない) ので、これらは最終手段とすることに。前者の手段は特に控えたいと。たとえば ISP のそれだと /~ID/
なんて形態のものが多いですし。
そんなわけでその場しのぎ的な対処を避けるべくこの問題を解決すべく戦っていたのですが、これがどうにも上手く行かない。漠然とはしていたものの、筋道や構文はある程度描けていたのですが、当該要素が選択すらされないというしょうもない有り様。ロケーションパスはあっているはずなのに! (←わかってないヤツにありがちな思い込み) 。
で、あまりに不可解なことだったので、試しに <xsl:template match="a" />
なんてスタイルシートでもって変換を行ってみたのですが、やはりというかなんというか、 a
要素が何事も無かったかのように出力されてしまいました。しばらく考えた結果、ロクな根拠もないまま「テンプレートが競合しているから?」などと思い、試行錯誤をするもどうにも原因はテンプレートの競合ではない様子 (参考……じゃないけど5.5 テンプレート規則の競合解決) 。
わけがわからなくなったので首でも括ろうかと思っていた矢先、過去の問題からふと「接頭辞をつけたらイケるんじゃないか?」と思い立ちまして、match
属性の値を h:a
なんてふうにしたところ上手く行きました。「やったぁ!」という感じです。接頭辞を h
としているのは、まあ、その。必要に応じて脳内置換してください。以下、構文。
<xsl:template match="h:a[starts-with(attribute::href,'../')]">
<xsl:element name="{local-name()}">
<xsl:attribute name="href">
<xsl:value-of select="substring-after(attribute::href,'../')" />
</xsl:attribute>
<xsl:copy-of select="descendant::text()" />
</xsl:element>
</xsl:template>
これは、ソース文書の方ではたとえば ../foo/bar.html
なんてふうな href
属性値であると、出力される最新数件の文書ではその ../
が取り除かれ、 ../
以降の文字列、つまり foo/bar.html
のみになるという。やや不適当な説明ですが。
しかしこれでもまだ問題がありまして。本当は a
要素の内容を <xsl:copy-of select="descendant::node()" />
とし、生成される子要素もきちんとしておきたかったのですが、不必要な名前空間が設けられてしまうようで、泣く泣く text()
とすることに。 a
要素に子要素を設けることはほとんどなさそうなので、後回しでも良いっちゃ良い。あと、 pre
要素の最初と最後に妙な空白があるのは仕様というか、既知の不具合です。 pre
要素の中には不具合がいっぱい。直せたら直します。直せなかったら直りません (当たり前) 。
starts-with 関数は、1つ目の引数 string が2つ目の引数 string で始まる場合には真を返し、それ以外の場合には偽を返す。
substring-after 関数は、1つ目の引数 string の中で2つ目の引数 string が最初に出現する箇所の後に来る、1つ目の引数 string の部分文字列を返す。1つ目の引数 string が2つ目の引数 string を包含しない場合には、空文字列を返す。たとえば、
substring-after("1999/04/01","/")
は04/01
を返し、substring-after("1999/04/01","19")
は99/04/01
を返す。
http://klezer.s53.xrea.com/_no/200410c#d28h00m33
starts-with
関数と substring-after
関数を使ってみた』の続き続きです。大したことは書かないです。
先日書いたテンプレートだと、たとえば他に属性を持っていたとき、それらは生成されないはずだったのですが、他のテンプレートが作用してなのか、 href
属性以外もきちんと出力されてしまっていました。嬉しい誤算といったところ。仮にそれらにもきちんとテンプレートを書くならば、xsl:chooseによる条件付き処理でなんとかなりそうです。たぶん。
以下、ついで。自分用メモ。
先日のものを応用すれば、フラグメント識別子のみでの参照などにも対応できそうです。値が #
ではじまっていたらそれはすなわち同一文書 (の何か) への参照なので、ルート要素の某属性値から云々など。 200
ではじまっていたら値の最初に _no/
を付記するなど。構文を考えただけでオラ、ワクワクしてきたゾ! 言葉を間違えた。ゲンナリしてきた。禿げそ。
追記。 5 分とかからず出来た。 xsl:choose
要素の子に xsl:when
要素っていくつでも持てるんですね。危うかった。謎。あ、他の属性が……。嗚呼。
http://klezer.s53.xrea.com/_no/200410c#d30h04m15
orz という文字列は昔に流行っていた (爆) ってのに置き換えられるかもしれない。
http://klezer.s53.xrea.com/_no/200410c#d30h21m55