外部XML/RSSの読み込み機能
モデレータ: webmaster
外部XML/RSSの読み込み機能
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データのキャッシング機能については今後追加予定です。
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 回目 ]
RSS読込みのためのデザイン定義の内容
お世話になります。
以下のようなブログのRSSを読み込み、日付、概要、記事のリンク先をページ内に表示させたいのですが、デザイン定義をどのように記述してよいのか判りません。
お手数ですが具体的に教えて頂けますでしょうか。
よろしくお願いします。
以下のようなブログの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>
Re: RSS読込みのためのデザイン定義の内容
上田さん、外部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 の羅列は、よくわからなければ丸ごとコピーしてお使い頂いて
問題ありません。
またご不明点がございましたら細かくて結構ですのでご質問頂ければと思います。
この機能はまだ試験段階の為、ユーザー様のご利用報告が大変貴重です。
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 の羅列は、よくわからなければ丸ごとコピーしてお使い頂いて
問題ありません。
またご不明点がございましたら細かくて結構ですのでご質問頂ければと思います。
Re: RSS読込みのためのデザイン定義の内容
お世話になります。
早速、試してみました。完璧です。
ありがとうございます。
エントリー概要の文字数を30文字程度に制限したかったので、以下の記事にあった方法で対応しました。
http://cms.al-design.jp/phpbb/viewtopic ... B%FA%BF%F4
1つ質問ですが、7日以内にエントリーされたブログ記事には「NEW」アイコンを付けたいのですが可能でしょうか。
よろしくお願いします。
早速、試してみました。完璧です。
ありがとうございます。
エントリー概要の文字数を30文字程度に制限したかったので、以下の記事にあった方法で対応しました。
http://cms.al-design.jp/phpbb/viewtopic ... B%FA%BF%F4
1つ質問ですが、7日以内にエントリーされたブログ記事には「NEW」アイコンを付けたいのですが可能でしょうか。
よろしくお願いします。
Re: RSS読込みのためのデザイン定義の内容
上田さん、ご報告ありがとうございます。
「NEW」アイコンについてですが、現状では恐らく実現不可能と思われます。m(__)m
せっかく日付情報の補助機能をつけているので、「今日の日付」情報も取得可能な
ようにしたいと思います。
ご指摘ありがとうございました。
「NEW」アイコンについてですが、現状では恐らく実現不可能と思われます。m(__)m
せっかく日付情報の補助機能をつけているので、「今日の日付」情報も取得可能な
ようにしたいと思います。
ご指摘ありがとうございました。
Re: RSS読込みのためのデザイン定義の内容
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 回目 ]
webmasterです。tsuさん、いつもコメントありがとうございます。
件数の設定ですが、既にxsl:ifで対応済との事で、おそらくそれが一番分かり易い
方法かと思います。
具体的には、記事の出力部分の内部を次のようなxsl:ifで囲みます。
RSS0.91/2.0の場合には、<xsl:for-each select="item">の中を
上記のxsl:ifで囲みます。
おそらくtsuさんも同様の方法で成功されているかと思います。
もう一つ、こちらはXPathの記述に慣れていないと理解が難しいかと思いますが、
シンプルな方法もありますので併記しておきます。
の部分を、
のように変えます。
RSS0.91/2.0の方も、
を、
のように変えます。
[〜]は、直前の要素に対して条件で絞込みをかけるXPathの記法です。
ブラウザ上でのみ表示がうまくいったのを確認していて、ソースの方は
確認に見落としがありました…。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"
のように修正して下さい。
過去の投稿とダウンロードできるサンプルについては既に修正済です。
また何かございましたらご指摘頂ければ幸いです。
件数の設定ですが、既にxsl:ifで対応済との事で、おそらくそれが一番分かり易い
方法かと思います。
具体的には、記事の出力部分の内部を次のようなxsl:ifで囲みます。
コード: 全て選択
<xsl:for-each select="rss:item">
<xsl:if test="position()<=5">
この中に記事の出力処理を書く
</xsl:if>
</xsl:for-each>
上記の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の記法です。
ご指摘ありがとうございます。こちらでも確認しました。
ブラウザ上でのみ表示がうまくいったのを確認していて、ソースの方は
確認に見落としがありました…。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"
のように修正して下さい。
過去の投稿とダウンロードできるサンプルについては既に修正済です。
また何かございましたらご指摘頂ければ幸いです。
上田さん、ご連絡ありがとうございます。
弊社環境で、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 を削除して下さい。
これで問題が解決するようでしたら、再度差し替えを行いたいと思います。
弊社環境で、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 を削除して下さい。
これで問題が解決するようでしたら、再度差し替えを行いたいと思います。