= amrita と XML
== 概要
amritaはHTMLと同様、XMLに対しても使用することができます。
* amritaは REXML ベースの XML パーサーを持っています
* amritaは HTMLと同様にXHTML文書を作成することができます
XHTMLのテンプレートを用意すれば、XHTML文書を作成します
* amritaはXML文書をテンプレートとしてXML文書を作成するために使用することができます
amrita には HTMLのDTD(タグの構造)に依存したコードはわずかしかありません。
また、それらをOFFにすることが容易にできます。
ですから、XHTML以外の一般のXML文書をテンプレートとして使用することができます。
* amritaはモデルデータをXMLドキュメントから取得することができます
REXMLはRubyのための自然なAPIを提供しています。
そして、REXMLで読みこんだXML文書をモデルデータとして使用することが容易にできます。
* amx: XML用のもうひとつのスタイルシート
docs/Tour2 を参照してください。
---
== XHTML文書
=== コードと出力
コード:
:include: sample/tour/xhtml.rb
出力:
xhtml sample
SAMPLE1
members of this HASH will be inserted here and title
=== 説明
基本的に、amrita は XHTMLテンプレートからはXHTML文書、HTML4.0テンプレートからHTML4.0文書を作成します。
よって、プログラマーは特定の標準やブラウザ、デバイスに対する適合性をいちいち気にする必要がありません。
それは、デザイナー(テンプレートを書く人)の仕事になります。
プログラマーがすることは Template オブジェクト +asxml+ フラグを設定することだけです。
これが +true+ に設定されていると、
のような単独のタグは
のようにXMLの形式で出力されます。
---
== XML テンプレート
=== コードと出力
コード:
data = {
:table1=>[
{ :name=>"Ruby In A Nutshell", :author=>"Yukihiro Matsumoto, David L. Reynolds", :isbn=>"0596002149" }
{ :name=>"Programming Ruby", :author=>"David Thomas, Andrew Hunt", :isbn=>"0201710897" },
{ :name=>"The Ruby Way", :author=>"Hal Fulton", :isbn=>"0672320835" },
]
}
xml_tmpl = TemplateText.new <
END
xml_tmpl.xml = true # use REXML-based parser
puts "------------XML output ----------------------"
xml_tmpl.expand(STDOUT, data)
出力:
Ruby In A Nutshell
Yukihiro Matsumoto, David L. Reynolds
0596002149
Programming Ruby
David Thomas, Andrew Hunt
..........
=== 説明
xml_tmpl.xml = true # REXMLベースのパーサーを使用する
puts "------------XML output ----------------------"
xml_tmpl.expand(STDOUT, data)
amritaは必要があるまでテンプレートをロードしません。
最初に +expand+ が呼ばれる時に +xml+ フラグが設定されていると、
amritaは REXMLベースのパーサーを使用します。
amritaでは、ひとつのモデルデータを複数のテンプレートに適用することもできます。
従って、一種類のコードでXMLとHTMLを両方出力することもできます。
詳しくは sample/tour/xml1.rb を参照してください。
---
== XML文書をモデルデータとして使用する
XML文書(データ) + HTMLテンプレート ==> HTML文書
つまり、一種のスタイルシートとしてamritaを利用する方法です。
=== code and output
code:
:include: sample/tour/xml2.rb
output:
| title |
author |
ISBN |
| Ruby In A Nutshell |
Yukihiro Matsumoto David L. Reynolds
|
0596002149 |
| Programming Ruby |
David Thomas Andrew Hunt
|
0201710897 |
| The Ruby Way |
Hal Fulton
|
0672320835 |
=== description
table = doc.elements.to_a("booklist/book").collect do |book|
{
:xxx=>.....
}
end
このコードは、要素から含むHashの配列を生成します。
要素はREXML::Elementクラスのインスタンスです。
ですから、REXMLのAPIによって、下位ノードや属性値を取り出すことができます。
:title=>book.elements['title'],
book.elements['title']は、 要素が持つ最初の 要素です。
:authors=>book.elements.to_a('author').collect do |a|
{ :name=>a }
end,
一冊の本にはタイトルは一つしかありませんが、著者は複数いる場合があります。
従って、著者(author)は +to_a+によってArrayとして処理します。
Ruby の標準メソッドである、+collect+を使用してHashの配列を作成しています。
:isbn=>e(:a, :href=>"http://www.amazon.com/exec/obidos/ASIN/#{book.attributes['isbn']}") {
book.attributes['isbn']
}
この例では、アマゾンへの直接リンクを貼ろうとしています。
e(...) { ... } は次のようなタグを生成します。
0596002149
このアイディア(amritaベースのXMLスタイルシート)をさらに発展させた例が
sample/tour/xml3.rbにあります。そして、これは amx という機能としてまとめられています。
詳細は docs/Tour2 を参照してください。
---
== Ruby のオブジェクトをXMLの項目に変換する
RubyのオブジェクトをXMLに対応させようとすると、
属性に対応するメンバーと下位要素に対応するメンバーがあると思います。
このサンプルは、ls -lのような情報をXMLとして提供する例です。
=== コードと出力
コード:
:include: sample/tour/filelist.rb
出力:
drwxr-xr-x
Tue Sep 03 11:07:10 JST 2002
Tue Sep 03 11:07:10 JST 2002
Thu Sep 05 07:30:39 JST 2002
652250
2596
-rw-r--r--
Mon Aug 26 09:12:11 JST 2002
Mon Aug 26 09:12:11 JST 2002
Thu Sep 05 09:26:48 JST 2002
310411
.....
=== 説明
def entry(name)
a(:name=>name, :type=>ftype) { self }
end
このメソッドはAttrArrayオブジェクトを生成し、
一部の属性値を設定してから下位要素を自分自身で展開します。
def size_or_nil
size if ftype == "file"
end
もしファイルが通常ファイルでないと、
このメソッドはnilを返し、 要素は削除されます。
---