外部XML/RSSの読み込み機能

管理者からの一般的なアナウンスです。

モデレータ: webmaster

webmaster
Site Admin
記事: 1451
登録日時: 2004年12月10日(金) 10:09

外部XML/RSSの読み込み機能

投稿記事 by webmaster » 2006年8月09日(水) 12:56

 webmasterです。
 ver.1.1.3aにて、外部XML/RSSの読み込み機能を試験的に追加しました。

 RSSの知識がある程度必要になりますが、RSSデータに対するXSLファイルを
用意することで、お好きなデザインでサイト中に外部RSSのデータを表示する
事ができます。
 他にもニュースサイトからのニュースの読み込みや、Amazon ECSからのデータ読み込み等、
ご利用方法は多彩です。

 具体的には、<cmsd:xml src="http://..." design="..." />タグにて、指定したURL、
もしくはローカルファイルのXMLデータを読み込み、designで指定したデザインに変換
して表示できます。
 ローカルファイルの場合は、埋め込みphpを設置した場所からの相対パスで
srcを指定して下さい。
 例)同じ階層:<cmsd:xml src="myxml1.xml" design="..." />
 例)一つ下の階層:<cmsd:xml src="myxml/myxml1.xml" design="..." />

 デザイン定義ファイルは、schemaフォルダにxmlという名前のフォルダを作成し、
"xml.デザイン.design.xsl"という名前で保存すれば利用できます。designを指定
しなかった場合、元データがUTF-8のままで出力されます(Ajax用途)。

 尚、RSSを読み込んだ場合、デザイン定義からの日付の取得が簡単に行えるように
してあります。
 通常、RSSの日付情報は W3C/Date か RFC822 という仕様にのっとった形式で格納
されており、そのままだと使いにくくなっています。
 そこで、CMSD側で年、月、日、曜日、時、分、時差、の情報に分割し、それぞれ
別の属性として取得できるようにしました。

 具体的には、例えば

<pubDate>Fri, 07 Jul 2006 09:07:59 +0900</pubDate>

 という日付情報がRSS上にあった場合、

<pubDate year="2006" month="07" day="07" weekday="fri" hour="18" minute="07" second="59" timezone="+0900" >Fri, 07 Jul 2006 09:07:59 +0900</pubDate>

 のように各種属性値を追加します。

 同様に、

<dc:date>2006-08-09T10:03:59+09:00</dc:date>

 という日付情報がRSS(RDF)上にあった場合、

<dc:date year="2006" month="08" day="09" weekday="wed" hour="10" minute="03" second="59" timezone="+0900">2006-08-09T10:03:59+09:00</dc:date>

 のようになります。
 
 試験的機能の為マニュアルには未掲載ですので、ご不明な点はご質問下さい。

 注意事項として、現時点ではまだ読み込んだXMLデータをキャッシングする機能が
無い為、ページのロードの度に外部XML/RSSを読みに行きます。
 この為、1ページ中に何箇所ものRSSを仕込んだりするとページのロードが非常に
重くなりますのでご注意下さい。
 XMLデータのキャッシング機能については今後追加予定です。
最後に編集したユーザー webmaster on 2007年3月12日(月) 10:30 [ 編集 1 回目 ]

上田
アクティブユーザー
記事: 19
登録日時: 2006年7月13日(木) 17:15

RSS読込みのためのデザイン定義の内容

投稿記事 by 上田 » 2006年9月06日(水) 16:36

お世話になります。

以下のようなブログのRSSを読み込み、日付、概要、記事のリンク先をページ内に表示させたいのですが、デザイン定義をどのように記述してよいのか判りません。
お手数ですが具体的に教えて頂けますでしょうか。
よろしくお願いします。

コード: 全て選択

<item rdf:about="http://hoge.com/entry-01.html">
<link>http://hoge.com/entry-01.html</link>
<description>ここに概要が入ります。</description>
<dc:date>2006-08-30T12:23:03+09:00</dc:date>
</item>

webmaster
Site Admin
記事: 1451
登録日時: 2004年12月10日(金) 10:09

Re: RSS読込みのためのデザイン定義の内容

投稿記事 by webmaster » 2006年9月06日(水) 17:42

 上田さん、外部XML/RSS読み込み機能についてのご質問ありがとうございます。
 この機能はまだ試験段階の為、ユーザー様のご利用報告が大変貴重です。

 rssのxslt変換についてですが、サンプルとして簡単なRSS表示用のxsltを作成しました。

http://cms.al-design.jp/downloads/sampl ... sample.zip

 RSS 1.0(RDF)形式と、0.91/2.0形式に対応しています。

 これを、cmsdesigner/config/schema/xml/xml.rsssample.design.xsl

 として配置し、

 <cmsd:xml src="RSSデータのURL" design="rsssample" />

 のように埋め込みタグを記述すれば、変換されて表示されると思います。

 今回の上田さんの例は RSS 1.0(RDF)形式のようですので、サンプルのRSS1.0
部分だけを抜き出して頂いてもOKです。
 先頭部分の xmlns の羅列は、よくわからなければ丸ごとコピーしてお使い頂いて
問題ありません。

 またご不明点がございましたら細かくて結構ですのでご質問頂ければと思います。
 

上田
アクティブユーザー
記事: 19
登録日時: 2006年7月13日(木) 17:15

Re: RSS読込みのためのデザイン定義の内容

投稿記事 by 上田 » 2006年9月07日(木) 08:33

お世話になります。

早速、試してみました。完璧です。
ありがとうございます。

エントリー概要の文字数を30文字程度に制限したかったので、以下の記事にあった方法で対応しました。
http://cms.al-design.jp/phpbb/viewtopic ... B%FA%BF%F4


1つ質問ですが、7日以内にエントリーされたブログ記事には「NEW」アイコンを付けたいのですが可能でしょうか。

よろしくお願いします。

webmaster
Site Admin
記事: 1451
登録日時: 2004年12月10日(金) 10:09

Re: RSS読込みのためのデザイン定義の内容

投稿記事 by webmaster » 2006年9月07日(木) 08:53

 上田さん、ご報告ありがとうございます。

 「NEW」アイコンについてですが、現状では恐らく実現不可能と思われます。m(__)m
 せっかく日付情報の補助機能をつけているので、「今日の日付」情報も取得可能な
ようにしたいと思います。

 ご指摘ありがとうございました。

webmaster
Site Admin
記事: 1451
登録日時: 2004年12月10日(金) 10:09

Re: RSS読込みのためのデザイン定義の内容

投稿記事 by webmaster » 2006年9月07日(木) 10:58

 zipファイルのままだと面倒かと思ったので、xsltのサンプルを貼り付けておきます。

コード: 全て選択

<?xml version="1.0" encoding="UTF-8" ?>
<xsl:stylesheet version="1.0"
	xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
	xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
	xmlns:rss="http://purl.org/rss/1.0/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:admin="http://webns.net/mvcb/"
	xmlns:cc="http://web.resource.org/cc/"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	exclude-result-prefixes="xsl rdf rss dc sy admin cc content"
>
	<xsl:output method="xml" encoding="EUC-JP" omit-xml-declaration="yes" indent="no" />

	<!-- RSS1.0(RDF)用のサンプル -->
	<xsl:template match="/rdf:RDF">
		
		<xsl:for-each select="rss:channel">
			<!-- サイト情報 -->
			<ul>
			<li>サイト:<a href="{rss:link}"><xsl:value-of select="rss:title" /></a></li>
			<li>サイト説明:<xsl:value-of select="rss:description" /></li>
			</ul>
		</xsl:for-each>
		
		<!-- 記事一覧 -->
		<ul>
			<xsl:for-each select="rss:item">
			<li>件名:<a href="{rss:link}"><xsl:value-of select="rss:title" /></a>
			<ul>
				<li>日時:<xsl:value-of select="dc:date/@year" />年<xsl:value-of select="dc:date/@month" />月<xsl:value-of select="dc:date/@day" />日<xsl:value-of select="dc:date/@hour" />時<xsl:value-of select="dc:date/@minute" />分<xsl:value-of select="dc:date/@second" />秒</li>
				<li>内容:<xsl:value-of select="rss:description" /></li>
			</ul>
			</li>
			</xsl:for-each>
		</ul>
	
	</xsl:template>

	<!-- RSS 0.91/2.0用のサンプル -->
	<xsl:template match="/rss/channel">
		<!-- サイト情報 -->
		<ul>
		<li>サイト:<a href="{link}"><xsl:value-of select="title" /></a></li>
		<li>サイト説明:<xsl:value-of select="description" /></li>
		</ul>
		
		<!-- 記事一覧 -->
		<ul>
			<xsl:for-each select="item">
			<li>件名:<a href="{link}"><xsl:value-of select="title" /></a>
			<ul>
				<li>日時:<xsl:value-of select="pubDate/@year" />年<xsl:value-of select="pubDate/@month" />月<xsl:value-of select="pubDate/@day" />日<xsl:value-of select="pubDate/@hour" />時<xsl:value-of select="pubDate/@minute" />分<xsl:value-of select="pubDate/@second" />秒</li>
				<li>内容:<xsl:value-of select="description" /></li>
			</ul>
			</li>
			</xsl:for-each>
		</ul>
	</xsl:template>
	
	<!-- データ取得に失敗した際のメッセージ表示 -->
	<xsl:template match="/nodata">
		<xsl:value-of select="message" />
	</xsl:template>
</xsl:stylesheet>
最後に編集したユーザー webmaster on 2006年9月29日(金) 12:58 [ 編集 2 回目 ]

tsu
パワーユーザー
記事: 208
登録日時: 2006年1月16日(月) 12:00
お住まい: さいたま

投稿記事 by tsu » 2006年9月28日(木) 19:09

外部RSS1.0を読み込む時、件数の指定をXSLT側で出来るのでしょうか?
色々試したのですがダメでした、、、。

追記
そういえば

コード: 全て選択

xmlns="http://www.w3.org/1999/xhtml"
があると、タグに入り込んできます

コード: 全て選択

<ul xmlns="http://www.w3.org/1999/xhtml">

tsu
パワーユーザー
記事: 208
登録日時: 2006年1月16日(月) 12:00
お住まい: さいたま

投稿記事 by tsu » 2006年9月28日(木) 22:51

表示件数は xsl:if で対応しました。

webmaster
Site Admin
記事: 1451
登録日時: 2004年12月10日(金) 10:09

投稿記事 by webmaster » 2006年9月28日(木) 23:08

 webmasterです。tsuさん、いつもコメントありがとうございます。

 件数の設定ですが、既にxsl:ifで対応済との事で、おそらくそれが一番分かり易い
方法かと思います。
 具体的には、記事の出力部分の内部を次のようなxsl:ifで囲みます。

コード: 全て選択

<xsl:for-each select="rss:item">
<xsl:if test="position()<=5">
 この中に記事の出力処理を書く
</xsl:if>
</xsl:for-each>
 RSS0.91/2.0の場合には、<xsl:for-each select="item">の中を
上記のxsl:ifで囲みます。

 おそらくtsuさんも同様の方法で成功されているかと思います。

 もう一つ、こちらはXPathの記述に慣れていないと理解が難しいかと思いますが、
シンプルな方法もありますので併記しておきます。

コード: 全て選択

<xsl:for-each select="rss:item">
 の部分を、

コード: 全て選択

<xsl:for-each select="rss:item[position()<=5]">
 のように変えます。
 RSS0.91/2.0の方も、

コード: 全て選択

<xsl:for-each select="item">
 を、

コード: 全て選択

<xsl:for-each select="item[position()<=5]">
 のように変えます。
 [〜]は、直前の要素に対して条件で絞込みをかけるXPathの記法です。
tsu さんが書きました:追記
そういえば

コード: 全て選択

xmlns="http://www.w3.org/1999/xhtml"
があると、タグに入り込んできます

コード: 全て選択

<ul xmlns="http://www.w3.org/1999/xhtml">
 ご指摘ありがとうございます。こちらでも確認しました。
 ブラウザ上でのみ表示がうまくいったのを確認していて、ソースの方は
確認に見落としがありました…。m(__)m

 これは、xsl側のトップ要素 xsl:stylesheet要素のexclude-result-prefixes属性に
「#default」を加えれば消えるようです。
 現状、

exclude-result-prefixes="xsl rdf rss dc sy admin cc content"

 となっているところを、

exclude-result-prefixes="#default xsl rdf rss dc sy admin cc content"

 のように修正して下さい。
 過去の投稿とダウンロードできるサンプルについては既に修正済です。

 また何かございましたらご指摘頂ければ幸いです。

tsu
パワーユーザー
記事: 208
登録日時: 2006年1月16日(月) 12:00
お住まい: さいたま

投稿記事 by tsu » 2006年9月28日(木) 23:24

コード: 全て選択

<xsl:for-each select="rss:item[position()<=5]">
う、かなり楽ですね、、、。
コードが少なくて済みます。
ありがとうございました!

上田
アクティブユーザー
記事: 19
登録日時: 2006年7月13日(木) 17:15

投稿記事 by 上田 » 2006年9月29日(金) 08:56

お世話になります。

修正を施してみたのですが、ソースに変化がなく、タグに以下が紛れたままでした。
xmlns="http://www.w3.org/1999/xhtml"



 現状、

コード: 全て選択

exclude-result-prefixes="xsl rdf rss dc sy admin cc content"
 となっているところを、

コード: 全て選択

exclude-result-prefixes="#default xsl rdf rss dc sy admin cc content"
 のように修正して下さい。

tsu
パワーユーザー
記事: 208
登録日時: 2006年1月16日(月) 12:00
お住まい: さいたま

投稿記事 by tsu » 2006年9月29日(金) 09:13

私の環境の場合は上記対処法で問題ありませんでした。
最初は、

コード: 全て選択

xmlns="http://www.w3.org/1999/xhtml"
を外して対処してましたけど、、、。

webmaster
Site Admin
記事: 1451
登録日時: 2004年12月10日(金) 10:09

投稿記事 by webmaster » 2006年9月29日(金) 11:42

 上田さん、ご連絡ありがとうございます。
 弊社環境で、xslt-libnoを20又は21に設定してみたところ、同様の現象が
起きました。

 通常はXSLTライブラリとしてSablotronが存在すればそれを使うように
なっており、Sablotron環境下では正しく動作するようなのですが、Sablotron
以外の環境ですと、正しく動作しないようです。

 exclude-result-prefixesに #default を指定すればデフォルトのネーム
スペース(ここでは xmlns="http://www.w3.org/1999/xhtml" )が出力
から除外されるのは、XSLT1.0勧告の正しい仕様なのですが、環境によっては
対応していないのかもしれません。

 元々「xmlns="http://www.w3.org/1999/xhtml"」自体、おまじない程度で
つけていたものですので(もちろん、本来これで問題はないはずなのですが…)、
これを外して頂いてもよろしいでしょうか?
 (tsuさんが最初に提案してくださった対処法です)

 サンプルのXSLでは、上から3行目になります。
 同時に、exclude-result-prefixes からも #default を削除して下さい。

 これで問題が解決するようでしたら、再度差し替えを行いたいと思います。

上田
アクティブユーザー
記事: 19
登録日時: 2006年7月13日(木) 17:15

投稿記事 by 上田 » 2006年9月29日(金) 12:03

お世話になります。

上記方法にて解決しました。ありがとうございます。
ご報告まで。

webmaster
Site Admin
記事: 1451
登録日時: 2004年12月10日(金) 10:09

投稿記事 by webmaster » 2006年9月29日(金) 12:59

 ご報告ありがとうございます。
 サンプルの方も差し替えておきました。

 また何かありましたらご連絡頂ければ幸いです。m(__)m

返信