2004年10月下旬

本文書の目次

承前

再開というか、べつに休んでいたつもりではなかったのだけれども、まあ再開という感じで。っていうかまだスタイルシート (相変わらず XML+XSL でごにょごにょしたいのぉっていう) すら書いていない状態だったりするので、無駄に様変わりとかしていくかもしれません。いちおう、それなりに構想はあるのだけれども、実現できる技量があるかどうか微妙なところ。

で、当面は生存報告をしていく予定であって、たいしたことを書くつもりは無いので面倒な「過去ログの保存」はしないことにしましたとさ。まあ「たいしたもの云々」というのは文書製作者が決めることではなく、利用者が決めるというか、その辺の判断は利用者に委ねるべきことなのだけれども。あと、保存はしないので更新のあの辺が整うまではブログはやらない (宣言) 。

WWW で文書を公開していると無駄に説明口調になっちゃうのな。

そういえば現在利用しているサーバ、 XREA では、「 index.html が無いと消しますよ」というようなことを言っていた気がしたのだけれど、どうなんだっけ。まあ消されたら消されたで良いやという勢いで遊べばいいや。ちなみに本文書 ホームページは home.shtml 。

この記事のURI
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 だったりするのであります。「時刻のフォーマット」の方に前述のものを指定してもやはり上手くはいかない。

見出しを変えれば解決しますよ、というお話。っていうか、なんで「日付」と「時刻」で分けているんだろう。時刻までは挿入したくないっていうのならば、フォーマットの方に時刻の変数を設けなければ済む話だと思うのだけれど。何か見落としているのかな。

この記事のURI
http://klezer.s53.xrea.com/_no/200410c#d21h01m04

index と contents

そういえば、大半のサーバではファイル名を指定しなかったときは index. を探しにいくように設定されているのだけれど、なんでだろうと考えた。でもわからなかった。 UNIX とかその辺が関係しているのかな。

HTML の仕様から考えると index は目的の情報を探すために手がかりとなる文字または記号というよりも索引という意味合いが強いわけで、ファイル名を指定しなかったら索引を表示するというのはなんだか妙な感じがするのです。同じように HTML の仕様から考えると ( contents は「内容」ではなく「目次」っぽいので) 、索引ではなく目次、つまり、 contents.html などを探しにいくというならば、なんとなくシックリは来る (個人的に) 。 cover や home なんてのが慣例だったら良かったのに。

「ホームページ」に index というファイル名を使用してしまうと、いざ索引を作るときファイル名に困らないのかな。今はそーゆー話をしてたんですよ! 私はッ!! っていうか、目的の情報を探すために手がかりとなる文字または記号という意味で使われているから index を探しに行ってるんだろうな。

この記事のURI
http://klezer.s53.xrea.com/_no/200410c#d21h20m46

不必要な名前空間の削除

XML 文書から XHTML 文書へ XST 変換する際、不必要な名前空間を exclude-result-prefixes で以って除去するよう記述していたのだけれど、これがどうにも上手く行かなく困っていた。原因のひとつはどうやら xsl:copy がらみなようだった。対処法がわかった今でもその理屈がいまいち飲み込めていなのがなんとも。まあそれはさて置き、有用な文書を見つけることができ、よかったよかった。ところで挙動としてはどっちが正しいのだろうか (「どっち」っていうのも謎っぽいけど) 。

この記事のURI
http://klezer.s53.xrea.com/_no/200410c#d21h23m03

無視されない?

XSL 変換する際、無知ゆえに理解できないエラーが出る。次のものがそれ。

子ノードの生成後や要素の生成前に属性 hoge を要素に追加することはできません。その属性は無視されます。

あらゆる要素に属性を設けてはダメなのかなと思ったものの、そうでもないようで、無視されても変換後の文書にはきちんとその属性が設けられているものだから、原因究明に努めようとは思えないのでありました。やってはいけないことをやっているばつの悪さには目を瞑りつつ。ただ、なんとなくだけれど、エラーの原因は『不必要な名前空間の削除』と関連しているような気がする。あくまで気がするだけ。備忘。

ちなみにソース文書は 200410c.xml 。で、この klz:weblogklz:note の子要素に設けられている属性に対し、エラーが返されるという。ってソース文書を公開したところで、スタイルシートを公開しなければどうにもならないんだろうけれど、スタイルシートはわんぱく過ぎるので公開しない。「わんぱく」って漢字で書くと「腕白」なんだ。へえ。実際にペンを使って文字を書かずに PC などを使っていると漢字が書けなくなる、なんて言うけれど、読み取る力はつくように思った。

この記事のURI
http://klezer.s53.xrea.com/_no/200410c#d22h20m24

作成日記と身辺雑記を別個にしたい

構想などをつらつらと。

klz:weblog 要素と klz:note 要素は別個のファイルに出力
  • いちおうウェブログっぽい文章とそれ以外とで異なる要素で以ってマーク付けている。
  • これは、変換時、 klz:weblog 要素は作成日記のディレクトリへ吐き出すようにし、 klz:note 要素は身辺雑記? 用のディレクトリへ吐き出すようにするため。
  • klz:weblog 要素だけを切り抜く (という表現は妥当ではないだろうけれど) 、 klz:note 要素だけを切り抜く、そしてそれぞれを所定のファイルに出力するというスタイルシートならば今の知識でも十分書けるだろう。
  • 表紙には双方の最新 n 件を出力させる。懸念は各要素が所定の数に満ちていないと、という点。ソース文書の方でも「上旬」「中旬」「下旬」で分割しているため、要素が足りなくなりやすい、と。
  • しかしこれは過去のファイルから引っ張ってくればなんとかなる気がする。あくまで気がする。 document 関数を用いれば。複数のソース文書を参考に。
  • また、 Redirect 及び、dW : XML : ヒント: 巨大なXML文書は分割して攻略するも参考に。ってこれ、ずいぶん前に紹介したなァ。どっちでやろうかな。
  • ただ、「所定の数に満ちていなかったら過去のファイルから引っ張ってきて云々」という筋道を実現させる構文は難しそうなので、常に過去のファイルから引っ張ってくるようになりそう。
  • 最も新しいソース文書のファイル名は固定 (latest.xml などに) していた方がいいかもしれない。バッチやらとの兼ね合いで。

関連の薄い話。 /net/latest からリダイレクトしないのはまだ形が整っていないからであります。決して意地悪目的で放置しているわけじゃあ……。スタイルシートなどが整ったらきちんとこちらにリダイレクトするようにします。見ている人がいるのかはわからんけれど、ご報告として。

この記事のURI
http://klezer.s53.xrea.com/_no/200410c#d23h19m36

substring 関数を使ってみる

構想などをつらつらと。

「もし見出し要素がなかったら」

klz:hd 要素があればそれを用いる。もし子要素に klz:hd 要素がなかったら (klz:weblog|klz:note) の date 属性値を見出し要素とする。そのまま見出しとしてしまってもいいけれど、「読める」方が好ましいので (可能であれば) 日本語っぽく。「YYYYMMDDhhmm分」とか。

参考
例 (見出し要素の内容の方)
  • <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 +   で出せたりする。ちょっと前に発見した。いちいちとマーク付けをしている人は、これを覚えておくと便利です。入力モードを切り替えなくて済むので。まあボタンひとつで切り替えられるけれど。勢い余って確定前に切り替えちゃってあぼーんなんてことは無くなります。

この記事のURI
http://klezer.s53.xrea.com/_no/200410c#d23h21m05

FAQ

構想などをつらつらと。

決まって頓挫するのは何故ですか?
仕様です。
見切り発車してしまうのは何故ですか?
仕様です。
この記事のURI
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 なんてものもあるけれど、こっちは、その。

なんかゴッチャになってるな、これ。と追記。

この記事のURI
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 要素の中には不具合がいっぱい。直せたら直します。直せなかったら直りません (当たり前) 。

使った関数の仕様
関数: boolean starts-with(string, string)

starts-with 関数は、1つ目の引数 string が2つ目の引数 string で始まる場合には真を返し、それ以外の場合には偽を返す。

関数: string substring-after(string, 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 を返す。

この記事のURI
http://klezer.s53.xrea.com/_no/200410c#d28h00m33

starts-with 関数と substring-after 関数を使ってみた』の続き

続きです。大したことは書かないです。

先日書いたテンプレートだと、たとえば他に属性を持っていたとき、それらは生成されないはずだったのですが、他のテンプレートが作用してなのか、 href 属性以外もきちんと出力されてしまっていました。嬉しい誤算といったところ。仮にそれらにもきちんとテンプレートを書くならば、xsl:chooseによる条件付き処理でなんとかなりそうです。たぶん。

以下、ついで。自分用メモ。

先日のものを応用すれば、フラグメント識別子のみでの参照などにも対応できそうです。値が # ではじまっていたらそれはすなわち同一文書 (の何か) への参照なので、ルート要素の某属性値から云々など。 200 ではじまっていたら値の最初に _no/ を付記するなど。構文を考えただけでオラ、ワクワクしてきたゾ! 言葉を間違えた。ゲンナリしてきた。禿げそ。

追記。 5 分とかからず出来た。 xsl:choose 要素の子に xsl:when 要素っていくつでも持てるんですね。危うかった。謎。あ、他の属性が……。嗚呼。

この記事のURI
http://klezer.s53.xrea.com/_no/200410c#d30h04m15

orz の代替文字列

orz という文字列は昔に流行っていた (爆) ってのに置き換えられるかもしれない。

この記事のURI
http://klezer.s53.xrea.com/_no/200410c#d30h21m55

ご案内など

八橋大和 : klezer@s53.xrea.com