« 人間の大きさ | トップページ | ライブドアvsフジテレビ »

2005年3月13日 (日)

RSSだよ第2弾

マイホームページakio.shimono.net
ちょっとパワーアップした。

具体的には2点。

 1.XML+XSLT実装になった
 2.ちょっとRSSめいてみた

どちらも、先週ぐらいにやりたいなぁと思い立ち、
今週いっぱい、仕事と読書の合間に仕様きめやら
調査やら実装をしたものである。

1.は比較的簡単だった。あ、唯一、めんどうだったのは、
XSLTするJAVAプログラムを書くこと。

まあ、立派なAPI様のおかげで、自分で書くコードは
50行足らずですむわけで、ありがたやありがたや。。

考えたのは、デザインだけでなく、ナビゲーションも
分離すること。
-----------------------------------------
コンテンツ   :XHTMLまたはXMLで記述
ナビゲーション:XSLTに記述
          グローバルナビゲーションは
          さらに別ファイル化して
          INCLUDE

ビジュアル  :CSSに記述
-----------------------------------------

こうすることで、新たなページを起こすさいは、
非常に簡単なHTMLまたはXMLで書けばよいことになった。

技術的に難しくなかったので、水~木曜日ぐらいには
実装が終わった。 今までヘッダ部とコンテンツが
別フレームになっていたのを、合成できるようになった。

しかし、ヘッダ(ナビゲーション)分離の試みは、
 4年前・PERLで置換キーワードみたいなの定義して。。
 2年前・JSPのINCLUDE使って。。
ということをこれまでやってきたわけで、まあ、
XSLTをつかった新たなやり方になったところで、
何がうれしいかというと、、微妙でもある。

さらに言えば、ずーーと、前から思ってはいたことだが、
本質的には静的ページなのに、
リクエストの度に毎回変換するというのは、CPU君
メモリ君、ごめんよ。という感じだ。

ずーっと、
ま、いっか。
で済ましてきた。

しかし、今回考えたakio.shimono.net 2005夏版企画書には
FTP使った同期プログラムを作って、shimono.jspeed.jpから
パブリッシュを行うというモジュールが盛り込まれている。

たった3行の記述であるが、企画書自体が全部でパワポ3枚
なので、なかなかの力の入れようといえる。(なんのこっちゃw)

そして、今日、2.のRSSで遊ぶ。が実現した。

2-1.TOPページにBBCのニュースヘッダリンクを置き、
2-2.日記ページはBLOGへのリンクだったのを、
   BLOGのRSSフィードのXSLTに変えた。

しかし、XSLTは奥が深い。
まあ、それもそのはず、XSLTの中にはXPATHという
ものも入ってるわけで、なんというか、
ロブスター入りとんこつラーメンという感じの
豪華セットだからしょうがない。

#んー。。 たとえがなんだか微妙にアメリカンだなぁ。。
#ロブスターじゃなくて、ずわい蟹にすっか。
#んー。。でも蟹というと北海道的で
#とんこつラーメンは九州だからなぁ。。んー。。

まず、2-1.BBCのニュースを出すのは比較的簡単だった。
RSS0.9を使っていて、名前空間なんちゃらかんちゃらがなく、
文字コードも、アスキーである。

 1. 自分のページのXML(XHTML) と
 2. 他サイトのRSSを合成して
 3. XSLTかけて表示する
 
というのが、一昨日、飯を食いながら決心した仕様。

しかし、すべてが順調だったわけではない。
まず2の部分で躓いた。
複数のXMLドキュメントをどのように合成するのか。。

GOOGLE先生に聞いてみると、XIncludeなる
キーワードが出てきた。。

んー。。これって、なんか新しすぎて
ちゃんとパーサとか、対応してないだろうなぁ。。

んー。。 さらに調べていると、

XSLTの(正確にはXPATHの)document関数なるものに
行き着いた。

 1. 自分のページのXML(XHTML) と
 2. 他サイトのRSSを合成して
 3. XSLTかけて表示する

ではなく、

 1. 自分のページのXML(XHTML)を、
 2. XSLTかけてながら、他サイトのRSSを合成して
   表示する

になってしまうが、それはそれでいっかとおもい
これを使うことにした。

document()関数というキーワードを発見してからは
結構さくっと動いてくれた。

その次、2-2.マイブログの取り込みである。

こちらは結構苦労した。
まず、ぜんぜん表示されない。。
utf-8のRSS1.0であること以外、BBCのやつと
大差ないはずなのに。。

第一の難関は、名前空間というやつだった。

COCOLOGの吐き出すRSS1.0は、
文書要素(ルート要素)が rdf:RDFという風に
なっていた。 BBCのやつは単に rssであった。
そうである。私が難しそうだからなんとなく避けてきた、
あの名前空間というやつを使っている。

ここで、XPATHでrdf:RDFと指定しても上手くいかない。。
ぎゃ!

ちょっとは名前空間のことも勉強したので、
その浅はかな知識ベースでいろいろ試行錯誤してみた。

結論は、XSLのほうで、最初にrdfという名前空間を定義
してやらねばならないというものだった。

なるほど、
定義してやったら、RSSの文書要素(ルート要素)
には行き着いた。テスト用XSLに記述してある
count($blog/rdf:RDF)が1を返したのである。

しかし、その下のchannel要素が参照できない。。
count($blog/rdf:RDF/channel)はゼロを返す。。

んー。。

これも名前空間であった。channel要素は
RSS文書のほうでは、デフォルト名前空間になっているが、
取り込まれた先では、デフォルト名前空間とは別の名前空間に
属していることになる。。

このことに気づき、XSLのアタマで名前空間をrssを定義し、
RSS文書のデフォルト名前空間のURIとあわせてあげたところ、
CHANNEL要素が参照できた!
count($blog/rdf:RDF/rss:channel)が1を返したのだ。

やった!
これですべておっけー!
分かりました名前空間様!

自分のページに別サイト(MYブログ)の内容をぽこぽこ
展開してゆくXSLを書くのは実に痛快な瞬間だった。

しかし、すべて順調にいったかに見えたその刹那、
第3の関門があった。

BLOGの本文の部分、RSSでは、CDATAセクションに
なっていて、HTMLのタグが入っているわけだ。

それが、ぜーんぶ、実体参照っていうの?
<とかに変換されてブラウザまできてしまい、
改行なしのどあぁぁっというテキストが表示されてしまった。

これは、悩んだ。
GOOGLE先生もなかなか答えを教えてくれなかった。
しかし、答えはみつかった。

キーワードは、disable-output-escaping

<xsl:value-of select="content:encoded" disable-output-escaping="yes"/>

という風にかけば、よいわけだ。

ああ、とっぷりと日が暮れてしまった。

しかし、XMLの名前空間てやつ、いまいちよく分かってなかったが、
少しわかった気がしたよ。

それにXSLT、だいぶ使えるようになったつもりでいたけど、
奥の深さを見せ付けられたよ。

あとは、TOPにNYと東京の天気予報でも
貼り付けるかな。。 あとは、ASAHICOMの日本語ニュースも

本当はFLASHでTICKERTAPE的なものを長年
作りたかったんだけど、ほかのひとががんがん作っちゃてるからなぁ。

もう一工夫したものをつくりたいもんですの。

« 人間の大きさ | トップページ | ライブドアvsフジテレビ »

パソコン・インターネット」カテゴリの記事

コメント

コメントを書く

(ウェブ上には掲載しません)

トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/34023/3277974

この記事へのトラックバック一覧です: RSSだよ第2弾:

« 人間の大きさ | トップページ | ライブドアvsフジテレビ »

Haruya's Violin

2017年10月
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31        

最近のトラックバック

無料ブログはココログ