サイトの更新情報は分離しました。
海外の某プロバイダを利用しているとmembers.jcom.home.ne.jpのアクセスが異常をきたす
という現象その他についてJCOMに問い合わせていますが、返事が中々きません。「海外のことなんか知らねー」ということなんでしょうか。ALLNET時代だったら、どんな内容であれ即日返事が来たものです。ああ。
サイトポリシーを書くのが大好きで、コンテンツがそれしかないという本末転倒なサイト。ないかなあ。ないだろうなあ。言い換えれば、本末転倒であることが存在意義になっているようなサイト。見たい。あったら絶対にブックマークするのだけど。
WWWに文書を公開するってことは、本当に世界中に公開しているのだなあと思う。色々なところからメールが来る。陽気なフランス人、オタッキーなアメリカ人、完璧主義的なドイツ人からも来た。このドイツ人さんは「ウェブのプレゼンテーションは、ユーザーがフォントや文字色を決定できるのがベストだ」という思想の持ち主で、海外ではかなり珍しい硬派な方。だったら話も通じそうだということで、何故div要素でなくul要素で文書の構造化をやっているのか問い詰めてみた(だからやめなさいって)。
えーと、更新チェッカが更新を知らせてくれたので、XSL のホームページ (英語)を見にいったのだけど、何の冗談だろう、この真っ黒けなスタイルシートは。と思ったら、こういうことだった。
.notice{ display : none }
<h2 class="notice" />
この組み合わせ。この空のh2要素がページの上の方にあるものだから、空要素として認識できないIEは文書全部を非表示にしてくれるわけで。XSLTで構造のテンプレートを作ると、空要素が発生しがち。空要素の閉じ方を指定する方法が特に用意されていないというのがちょっと面倒かも。
子供らは文化を無闇に破壊するのが大好きなので、ほーむぺーじの作り方を教えるのは大反対。XMLを用いてマークアップの本質を教えるのなら良いかも知れないけれど。感想文をマークアップさせるとか。<題名>楽しかった遠足</題名><なまえ>田中いちろう</なまえ>。教師は簡単なスキーマを作成してチェック。スタイルシートを幾つか用意して、好きなものを選ばせて遊ばせて見るのも面白い。これだけで十分、不思議マークアップウィルスの抗体が(個人差はあれ)できそうなものだ。
小学生の登場によってコミュニティが破壊された例を幾つか知っているし、「オリジナルタグ」を公開して著作権を主張(「パクリ禁止」)している子供もいた。閉鎖的な私有地をこしらえる傾向もあるので、無断リンク禁止なんて朝飯前だろう。向上心がないので、批判をしても「キモい」とか「うざい」とか言われて終わりだ。幼ければ幼い程、批判という手法に対しては「批判的」であるものだ。言論の価値を知らないのだから。言論の価値を否定した「感想文」がウェブで幅を利かせるようになったらもう終わりだ。私はユーザーであることを辞めるかもしれない。また、匿名掲示板なんぞ知った日には、どんな痛い行動に出るか計り知れないものがある。恐ろしいのは、それらが「子供だから止むを得ない」で済まされてしまうことだ。ともかく、子供らには「ほーむぺーじ」なんかよりも教えるべきことが他にある。
時間が余っていて、知識もあり、社会性も有した存在。以前書きましたが、やはりお年寄りにこそWWWのメインユーザーの地位を獲得していただき、できればウェブページを公開していただきたい。今から勉強なさるのも結構なことですが、PCさえ所有していないお年寄りも多いということで、現在および将来のお年寄りをターゲットにした保存性の高い文章を書くよう努めたいところです。
MSXML4.0 SP1。付属のHTMLヘルプは英語だけれども、オンラインで読むよりはるかに読みやすい。内容については、DOMリファレンス以外は以下略というか。
でもって、オンラインでXSLT変換したいときの為に、なんか置いてみたりした。
少し早いけど、DOM1 HTML 未実装のブラウザは弾くことにした。document.implementation.hasFeature('HTML', '1.0')で判別。やりたくて仕方がなかったんだよなあこれ。その代わり実装を謳ってしまっているものに関しては容赦をしない方針で。
JavaScript for CSS (10)の最後に載っている表によると、WinIE6、MacIE5、Netscape6 は該当。Mozilla1.0、Netscape7あたりも多分。
それから、JavaScriptオフ環境にも等価な情報を提供できるように配慮を見直し。サイトマップについては、サイズが膨らみつづけるJavaScriptでーたべーす型を止めて、HTML形式のデータをアクションを介してiframe要素内に読み込み。JavaScriptオフ環境ではただのサイトマップへのリンクで、要するにJavaScriptで「リンクの形」を変えただけ、と言ってしまえば簡単だけど……。当分の間JavaScriptは見たくもなくなった。
やりたいことはシンプル極まりないのに、DOM(level1)ってどうしてこう扱いづらいのだろう。最近はXPath式をよく書いていたものだから、本当に煩わしくて気が狂いそうになる。
following-sibling::*[@class = 'foo']
このノードをDOM(level1)で取得しようとすると……、うわぁもう面倒臭くて鳥肌が立ってくる。
XSLTでは、C言語のforループ処理と似た繰り返し処理を行うため、xsl:for-each要素が用意されている。xsl:for-each要素は、選択されたノード集合に対して同じテンプレートを適用する場合に活用される。xsl:for-each文は次のように書くことができる。
@IT:「シンプルで高機能」なXSLTのプログラミング より
「ノード集合に対してテンプレートを適用」するってどういうことだろう?
テンプレートは雛型で、選択されたノード集合(カレントノードリスト)の各々のノード(カレントノード)が、テンプレート内で式やPatternを使う際のコンテキストノードとして渡され、それぞれがインスタンス化される。
このように、xsl:for-each要素によって繰り返し処理を行うなら、大きなデータでも一括変換することができる。
@IT:「シンプルで高機能」なXSLTのプログラミング より
xsl:apply-templatesでも「大きなデータを一括変換」できる。xsl:for-eachが本当に有用になる例を示した解説は皆無だ。少なくともこのサイトから得られるものはなさそう。
先日の続続・文書構造と無関係な表題(HTML)において(以下略)とした部分についてきちんと書いてみます。
要約文をp、その表題をh2でマークアップしたとします。
<h1>User Empowerment and the Fun Factor</h1>
<h2>Summary</h2>
<p>要約文</p>
<h2>The text</h2>
<p>本文</p>
要約部が、h1要素とともにこの章のheaderを形成していると考えると:
<header>
<h1>User Empowerment and the Fun Factor</h1>
<h2>Summary</h2>
<p>要約文</p>
</header>
<h2>The text</h2>
<p>本文</p>
これだけでも十分不適切な構造であることが分かるですが、ISO-HTMLでいうdiv1要素を明示してみると:
<header>
<h1>User Empowerment and the Fun Factor</h1>
<div1>
<h2>Summary</h2>
<p>要約文</p>
</header>
<h2>The text</h2>
<p>本文</p>
</div1>
このようにheaderの終了タグを挟んでしまいます。
ちなみにheader(見出し情報)は別にメタな要素に限ったものではないです(cf テーブルヘッダなど)。メールヘッダやHTMLのhead要素などは確かにメタな要素ですが、ファイル全体を修飾したheaderと、文書のフラグメントを修飾したheaderとでは情報を提供する対象が違ってきます。
xsl:template要素にはname属性値として任意の名前を付けることができ、xsl:call-templateで呼び出せる。
Syntax Summary (英語)を見てみるとこのname属性値は「qname」とあるので、でたらめな名前空間宣言(xmlns:test="http://foo.com/bar")をして、テンプレートにPrefixつきの名前(name="test:baz")をつけてみた。
確かに動作するのだけど、何の意味があるのだろう。
同じ名前のxsl:template要素があるとエラーになるから、インクルード/インポートしたものとバッティングしないようにする為に使えなくもない、かも。謎だ。というか、要素名でも属性名でもないものにPrefixが付いていたら紛らわしいし、再帰呼び出しするときにもプロセッサに負担かかりそう。テンプレート名にPrefixをつけるメリットが見つからない。
Googleに翻訳サービス(BETA)がある (英語)ことを初めて知った。速い。
以下、fubユーザとかその辺りの方々に意味ありげな情報。
「langpair」はこのような組み合わせが可能らしい(コピペ with 改行)。
<option value="en|de">English to German</option>
<option value="en|es">English to Spanish</option>
<option value="en|fr">English to French</option>
<option value="en|it">English to Italian</option>
<option value="en|pt">English to Portuguese</option>
<option value="de|en">German to English</option><option value="de|fr">German to French</option>
<option value="es|en">Spanish to English</option>
<option value="es|fr">Spanish to French</option>
<option value="fr|en">French to English</option>
<option value="fr|de">French to German</option>
<option value="fr|es">French to Spanish</option>
<option value="it|en">Italian to English</option>
<option value="pt|en">Portuguese to English</option>