agenda 2003-03(下旬) S curse

DOMのDocumentFragmentとXPath

公開
2003年3月29日

ここ一ヶ月ほどRDF照会用のJScriptクラスを作って遊んでいたのですが、ようやく(私が使う範囲で)納得ゆくものが出来上がりそうです。あるXPath式によってノードリストを取得して利用した後、そのノードリストを別のXPath式でさらに絞込みをかけ、新たなノードリストを取得する、という方法を多用しました。これは場当たり的なスクリプトを書く際にも重宝しそうです。

MSXML4では、NodeインターフェイスにselectNodesというメソッドがあります。引数にXPathのロケーションパス等(String)を指定することによって、マッチしたノードを含んだノードリストが返却されるというものです。これは当然、Nodeインターフェイスを継承するDocuemntFragmentでも使えます。

var sXpath = '/descendant::*[boolean(@href)]';
var nl = DOMDocument.selectNodes(sXpath);

これでhref属性を持った全ての要素のノードリストを取得したことになります。DOMDocumentは実際に作成したDOMDocumentオブジェクトです。

ある条件に依存して、このノードリストの中からhreflang属性を持ったものを絞り込む必要があるとします。このとき:

var df = DOMDocument.createDocumentFragment();
for(var i = 0, len = nl.length; i < len; i++)
  df.appendChild(nl.item(i));
sXpath = 'self::*[boolean(@hreflang)]';
nl = df.selectNodes(sXpath);

このようにDocumentFragmentをコンテクストノードにすることができます。尤もこの例では無駄が目立ちますが、このDocumentFragmentを他にも色々と応用する場合には効率的になります。

RDF/XMLなサイトマップについて(ちょっと私信かも)

sitemap.xmlは、XHTML形式のサイトマップに変換するのが楽なので一応ツリー構造にしてありますが、あれはトリプルの単位でバラバラに分解しても意味は同じで、同じように利用できます。それどころか、単一の文書にまとまっていなくても、各トリプルが崩れなければ意味は同じです。何か外しているかもしれませんが一応。

私は、ノードとアークに着目し、トリプル以上の構造には一切依存しないような照会方法を使っています。参照したいノードがあった場合、まず「型」を作ります。ノードのタイプやアークの種類その他をプロパティにしたオブジェクトを作り、その「型」にマッチしたノードを返却するメソッドを呼び出して、目的のノードを得ます。ですから、XMLの見かけ上のツリー構造が崩れていても関係ないですし、rdf:RDF要素の場所さえ知っていれば、複数の文書にまたがって叙述されていても同じように参照できます。

RDF/XMLの変則的な構文全てに対応するのはちと気違い沙汰なので、ローカルで完結しているのが悔しいところですが、良い実装を手に入れれば相当に面白そうです。

フレームは非論理的(HTML)

公開
2003年3月27日

はてなアンテナを巡っていたらナビの考え方という文書を発見しました。一昨年2001年のagendaへの反論が掲載されているので反応してみることにします。

言うまでもなく、サイト構造と各文書を繋ぐのはナビゲーション、つまりリンクである。論理的な結び付きというのは非常に難しい言葉である。その論理の定義がどのようなものなのかははっきりと記されていないが、つまり、全体構造を示したファイルと直接結び付くこと=論理的結合、だと推測する。だとすれば、フレームでは、サイト構造と各文書を論理的に結び付けることはできないというのは疑問を残す言い回しだ。何故ならば、文書を結び付ける手段は先述したように『リンク』なのだから。フレームは無関係である。

ナビの考え方 より

ちょっと申し訳無いことをしました。「論理的に結びつく」という言葉を、自分だけで納得して用いた悪文を書いてしまいました。この「論理的に」は「セマンティックに」と言い換えたほうが適切だったかもしれません。

さて、フレームは、二つの文書を物理的に結び付けているに過ぎません。これを理解していただくために、Opera9を仮定しましょう。この架空のブラウザは、HTMLのlink要素を的確に解釈し、有効に活用します。現行のOpera7とOpera9の違いは、サイドバーです。

<link rel="contents" href="contents.html" title="目次" />。このようなlink要素を文書内に見つけると、Opera9.0はナビゲーションバーに「目次」というボタンを表示させます。ここまでは現行のOpera7.0と同じです。Opera9.0を良く知るユーザーは、このボタンをサイドバーにドラッグ&ドロップします。すると、Opera9はサイドバーにその目次を表示させ、メインの領域に表示している文書と関連付けます。具体的には:

  • 1. メイン領域に表示している文書にリンクしている目次のアンカーをハイライトする(現在地表示)
  • 2. 目次のアンカーをクリック等してアクティブにすると、メインの領域の表示をその参照先に書きかえる
  • 3. 目次には、Opera9内蔵の目次用スタイルシートを自動的に適用する(floatプロパティ等で段組されているスタイルを解除する為)

これらは、Opera9が、その文書が目次であることを「知って」いるから実装できる機能です。ところがフレームの場合、「左側にcontents.htmlを表示しろ」「右側にitem.htmlを表示しろ」という指示をブラウザに与えることは出来ても、contents.htmlがitem.htmlの目次であることは全く伝えられません。

近年、ブラウザはサイドバーを応用し始め、ただでさえ左右のスペースは小さいことが多いのです。目次であることを伝えることが出来れば、ブラウザは、各自のインターフェイスの一部を活用する形でそれをユーザーに提供することが可能になりますが、一方、目次であることを伝えずにフレームを利用する場合、製作者が強制するスペースを、ブラウザは新たに割かねばなりません。

フレームのような「ある特定の閲覧方法を提供すること」は、製作者が行うべきものではなく、HTML文書等の意味に基づいてブラウザが行うべきであると考えています。

  • WWWに存在する膨大な量のサイトの(大きくあるいは微妙に)異なる各々のナビゲーションを、それが如何に優れたものであろうと、閲覧者が一々理解するのは馬鹿げている

これがその理由です。私もスクリプトで小賢しいことをしていますが、「Opera9」の提供する機能に比べればまあ屑ナビゲーションと言って良いでしょう。

従って私は、きちんと使いこなすのが恐ろしく難しく、ブラウザの進化によって無用になってしまう恐れのある「フレーム」を薦めるよりは、意味に基づいたHTML文書の書き方を薦める方が良いことであると考えています。

フレームは、きちんと使いこなすことが出来れば、無害です。しかし決して、「論理的」な代物ではないと申し上げたいのであります。論理的である、とは、理由が存在するということです。右や左に表示領域を分割し、それぞれに文書を表示すること指示するだけのフレームに、理由は存在しません。一方、link要素は論理的です。「ある文書にリンクする。何故ならば、この文書の目次だからである。」これをどう応用しようと、ブラウザの自由です。

私は「何故、どうして」の存在しないものは全て屑だと考えています(参考:なぜ「なぜ?」が必要か)。しかしこれらを盛り込もうという姿勢の見えるナビの考え方には好感を持っているということは、一応書いておきます。

因みに私はfub_netというブラウザを弄って「Opera9」のように使わせていただいていますが、お勧めしません。

反米

公開
2003年3月21日

恩師の受け売りながら一応書いておきます。

アメリカは、民主主義よりも個人主義を優先する国がら。個人の自由の理不尽な侵害という恐怖でもって煽れば、彼らは民主主義のスタイルを一貫させることよりもそちらの保護を優先します。そしてその正義を信じて疑いません。断言しますが、今回の戦争に関してそれ以外の如何なる理由も後づけであります。

中東を民主化するのが目的であれば、自明ですが民主主義的な解決法を絶対に用いた筈です。これは戦争という手段を用いないという意味ではなく、国連の合意に基づかなければ行動を起こさないという意味であります。石油の利権が仮に目的であったとしても、そのような目的の為に、彼らは民主主義的態度を忘れ去ったりはしません。もちろん一部の民放が推測するような、ブッシュ大統領個人の、あるいはブッシュ政権の、国民から独立した思惑、野望うんぬんが今回の戦争の原動力ではありません。アメリカは形式的であれ民主主義国家です。

さて、見知らぬ善良な彼らとうまくやって行くコツの一つは、まず家族の写真を見せることです。そして如何に自分が家族を愛してやまないかを力説してやります。あらゆる理不尽な災難から家族を守ることが、何より重要な懸案であることを仄めかすのです。そうすれば同志としての信頼を得られるでしょう。自分の大切な何かを守ろうとする人間の行動は圧倒的正義なのです。しかし逆に言えば個人の大切な何かを奪おうとする存在は圧倒的な悪ということになります。

「反戦運動」をなさるなら、まず彼らと同様の、もしくは類似した精神的経験を得てください。難しいことですが、それが出来なければ理解はありません。理解しようとせず、戦争だけ(一時的に)封じ込めることに成功したとして、長期的に見れば何の解決にもなっていないことに気づかれることでしょう。アメリカ人と対話したことはありますか?

窪塚君へ。

「ネタ」仕入れ元:Agitation@Deep-Black @ 2003-03-21