# 下記の内容は
# http://www.midore.net/daybook/2008/05/1210953600.html
# で公開していた内容に
# 2010年現在の OS X Snow Leopard で試した結果を追加したものです。(追記参照 2010-02-07.)
-- 2008-05-17 当時
OS X 10.5.2 の xsltproc を利用してみる
% cat entry.rb
# OS X 10.5.2
# ruby 1.8.6 (2007-09-24 patchlevel 111) [universal-darwin9.0]
# 2008-05-16
require "rexml/document"
require "rexml/element"
require 'time'
xmlpath = 'entry.xml'
txtpath = 'test.txt'
txtpath = ARGV[0] unless ARGV.empty?
check = FileTest.exist?(File.join(Dir.pwd , txtpath))
raise "error" unless check
raise "error" unless txtpath =~ /.txt$/
doc = REXML::Document.new(IO.read(xmlpath))
k,v = nil, nil
IO.readlines(txtpath).each{|line|
if line =~ /^--/
k = line.chomp.gsub("--",'')
next
else
v = line.strip
end
case k
when /^mytext$/
e = doc.root.elements["entry/#{k}"]
ep = e.add_element('p').add_text(v)
when /^created$/
t = Time.parse(v)
t.iso8601.to_s
doc.root.elements["meta/#{k}"].text = t.iso8601.to_s
doc.root.elements["entry/#{k}"].text = Time.parse(v).strftime("%B %d, %Y")
doc.root.elements["entry/id"].text = t.to_i.to_s
else
doc.root.elements["entry/#{k}"].text = v
end
}
print doc
用意した test.txt
--title
TestTitle
--created
2008-05-10 21:00
--mytext
test sample text.
second line.
etc.
コマンドの実行
% xsltproc -V
Using libxml 20616, libxslt 10112 and libexslt 810
xsltproc was compiled against libxml 20616, libxslt 10112 and libexslt 810
libxslt 10112 was compiled against libxml 20616
libexslt 810 was compiled against libxml 20616
% cd Entry
% mkdir html xml
% /usr/bin/ruby entry.rb test.txt > xml/00.xml
% xsltproc entry.xsl xml/00.xml > html/00.html
生成された xml/00.xml
<?xml version='1.0' encoding='UTF-8'?>
<docroot>
<entry>
<title>TestTitle</title>
<id>1210420800</id>
<created>May 10, 2008</created>
<mytext><p>test sample text.</p><p>second line.</p><p>etc.</p></mytext>
</entry>
<meta>
<created>2008-05-10T21:00:00+09:00</created>
<css>
<url>default.css</url>
<title>default.css</title>
</css>
<author>
<name>test</name>
</author>
</meta>
</docroot>
生成された html/00.html
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transit
ional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja" lang="ja">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<meta name="author" content="test" />
<meta name="date" content="2008-05-10T21:00:00+09:00" />
<link rel="stylesheet" type="text/css" media="screen,tv" href="default.css" title="default.css" />
<title>TestTitle</title>
</head>
<body>
<h1>TestTitle<br /></h1>
<h2>May 10, 2008<br /></h2>
<br />
<p>test sample text.</p>
<p>second line.</p>
<p>etc.</p>
<hr />
</body>
</html>
% open html/00.html (OS X の場合 open コマンドがある。引数が .html ファイルだと、ブラウザが起動して 00.html を開いてくれる.)
entry.xml
http://www.midore.net/daybook/2008/05/hina-xml.html
entry.xsl
http://www.midore.net/daybook/2008/05/hina-xsl.html
00.html の <meta name="date" content="2008-05-10T21:00:00+09:00" /> 日付の形式は、
entry.xml 10行目: <meta><created/>,
entry.rb 35行目: doc.root.elements["meta/#{k}"].text = t.iso8601.to_s,
entry.xsl 81 行目: <xsl:attribute name="content"><xsl:value-of select="meta/created" /></xsl:attribute>
に依存。
--imported_from
http://www.midore.net/daybook/2008/05/1210953600.html
+++ 追記 +++
# 2010-02-06.
# midorex.blogspot.com へimport するにあたって entry.rb など使用するファイルを修正。
# 副題: 「OS X 10.6.2 の xsltproc を利用してみる」
0,現在の環境
Mac OS X 10.6.2
ruby 1.9.1p376 (2009-12-07 revision 26041) [i386-darwin10.2.0]
$ xsltproc -V
=>
Using libxml 20703, libxslt 10124 and libexslt 813
xsltproc was compiled against libxml 20703, libxslt 10124 and libexslt 813
libxslt 10124 was compiled against libxml 20703
libexslt 813 was compiled against libxml 20703
1,準備
test.txt
entry.rb
entry.xml
entry.xsl
上記4枚のファイルを用意し(下記参照)
2,XML生成
$ chmod +x entry.rb
# xml ファイルの生成
$ ./entry.rb test.txt > 000.xml
$ cat -n 000.xml
1 <?xml version='1.0' encoding='UTF-8'?>
2 <docroot>
3 <entry>
4 <title>TestTitle-2010</title>
5 <id>1265418000</id>
6 <created>February 06, 2010</created>
7 <mytext><p>test sample text.</p><p>second line.</p><p>etc.</p><p></p></mytext>
8 </entry>
9 <meta>
10 <created>2010-02-06T10:00:00+09:00</created>
11 <css>
12 <url>default.css</url>
13 <title>default.css</title>
14 </css>
15 <author><name>test</name></author>
16 </meta>
17 </docroot>
18
3,xsltproc コマンドでXHTML 生成
$ xsltproc entry.xsl 000.xml > 000.html
$ cat -n 000.html
1 <?xml version="1.0" encoding="UTF-8"?>
2 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
3 <html xmlns="http://www.w3.org/1999/xhtml" xmlns:ns_1="http://www.w3.org/XML/1998/namespace" ns_1:lang="ja">
4 <head>
5 <meta http-equiv="content-type" content="text/html; charset=UTF-8" />
6 <meta name="author" content="test" />
7 <meta name="date" content="February 06, 2010" />
8 <link rel="stylesheet" type="text/css" media="screen,tv" href="default.css" title="default.css" />
9 <title>TestTitle-2010</title>
10 </head>
11 <body>
12 <h1>TestTitle-2010<br /></h1>
13 <h2>February 06, 2010<br /></h2>
14 <br />
15 <p>test sample text.</p>
16 <p>second line.</p>
17 <p>etc.</p>
18 <p></p>
19 <hr />
20 </body>
21 </html>
4,まとめ
Mac OS X 10.6.2 のxsltproc コマンドで XHTML ファイルを作れると確認できました。これにて実験おわり。
[使用したファイル]
test.txt
1 --title
2 TestTitle-2010
3 --created
4 2010-02-06 10:00
5 --mytext
6 test sample text.
7 second line.
8 etc.
entry.rb
1 #!/path/to/bin/ruby191
2 # coding: utf-8
3
4 require "rexml/document"
5 require "rexml/element"
6 require 'time'
7 xmlpath = 'entry.xml'
8 txtpath = 'test.txt'
9
10 doc = REXML::Document.new(IO.read(xmlpath))
11 k,v = nil, nil
12 IO.readlines(txtpath).each{|line|
13 (/^--/.match(line)) ? (k = line.chomp.gsub("--",''); next) : v = line.strip # 2010-02-06
14 case k
15 when /^mytext$/
16 e = doc.root.elements["entry/#{k}"]
17 ep = e.add_element('p').add_text(v)
18 when /^created$/
19 t = Time.parse(v)
20 t.iso8601.to_s
21 doc.root.elements["meta/#{k}"].text = t.iso8601.to_s
22 doc.root.elements["entry/#{k}"].text = Time.parse(v).strftime("%B %d, %Y")
23 doc.root.elements["entry/id"].text = t.to_i.to_s
24 else
25 doc.root.elements["entry/#{k}"].text = v
26 end
27 }
28 print doc
29
entry.xml
1 <?xml version="1.0" encoding="utf-8"?>
2 <docroot>
3 <entry>
4 <title/>
5 <id/>
6 <created/>
7 <mytext/>
8 </entry>
9 <meta>
10 <created/>
11 <css>
12 <url>default.css</url>
13 <title>default.css</title>
14 </css>
15 <author><name>test</name></author>
16 </meta>
17 </docroot>
18
entry.xsl
1 <?xml version="1.0" encoding="UTF-8" ?>
2 <?xml-stylesheet rel="stylesheet" type="text/css" href="default.css" ?>
3 <!--
4 xhtml 1.0
5 text/xml
6 utf-8
7 -->
8 <xsl:stylesheet version="1.0"
9 xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns="http://www.w3.org/1999/xhtml">
10
11 <xsl:output
12 method="xml" encoding="UTF-8"
13 media-type="text/xml"
14 doctype-public="-//W3C//DTD XHTML 1.0 Transitional//EN"
15 doctype-system="http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"
16 indent="yes" />
17
18 <!-- ___ROOT___ -->
19 <xsl:template match="docroot">
20 <xsl:element name="html">
21 <xsl:attribute name="lang"
22 namespace="http://www.w3.org/XML/1998/namespace">ja</xsl:attribute>
23
24 <!-- ___Header___ -->
25 <xsl:call-template name="head" />
26
27 <!-- ___ Body ___ -->
28 <xsl:element name="body">
29 <xsl:apply-templates select="entry" />
30
31 </xsl:element><!-- end body -->
32 </xsl:element><!-- end html -->
33 </xsl:template>
34
35 <!-- _____ Entry _____ -->
36 <xsl:template match="entry" >
37
38 <!-- Title -->
39 <xsl:element name="h1">
40 <xsl:value-of select="title" disable-output-escaping="no" /><xsl:element name="br" />
41 </xsl:element>
42
43 <!-- Date -->
44 <xsl:element name="h2">
45 <xsl:value-of select="created" disable-output-escaping="no" /><xsl:element name="br" />
46 </xsl:element>
47
48 <!-- Text -->
49 <xsl:element name="br" />
50 <xsl:apply-templates select="mytext" />
51 <xsl:element name="hr" />
52 </xsl:template>
53
54 <!-- _____ Entry Templates_____ -->
55 <xsl:template match="mytext/" >
56 <xsl:apply-templates />
57 </xsl:template>
58
59 <!-- Template p -->
60 <xsl:template match="mytext/p">
61 <xsl:element name="p"><xsl:value-of select="." disable-output-escaping="no"/></xsl:element>
62 </xsl:template>
63
64 <!-- _____ HEADER _____ -->
65 <xsl:template name="head">
66 <xsl:element name="head">
67 <xsl:element name="meta">
68 <xsl:attribute name="http-equiv">content-type</xsl:attribute>
69 <xsl:attribute name="content">text/html; charset=UTF-8</xsl:attribute>
70 </xsl:element>
71
72 <!-- meta name="author" -->
73 <xsl:element name="meta">
74 <xsl:attribute name="name">author</xsl:attribute>
75 <xsl:attribute name="content"><xsl:value-of select="meta/author/name" /></xsl:attribute>
76 </xsl:element>
77
78 <!-- meta name="date" -->
79 <xsl:element name="meta">
80 <xsl:attribute name="name">date</xsl:attribute>
81 <xsl:attribute name="content"><xsl:value-of select="entry/created" /></xsl:attribute>
82 </xsl:element>
83
84 <!-- CSS -->
85 <xsl:element name="link">
86 <xsl:attribute name="rel">stylesheet</xsl:attribute>
87 <xsl:attribute name="type">text/css</xsl:attribute>
88 <xsl:attribute name="media">screen,tv</xsl:attribute>
89 <xsl:attribute name="href"><xsl:value-of select="meta/css/url" /></xsl:attribute>
90 <xsl:attribute name="title"><xsl:value-of select="meta/css/title" /></xsl:attribute>
91 </xsl:element>
92
93 <!-- Title -->
94 <xsl:element name="title">
95 <xsl:value-of select="entry/title" disable-output-escaping="no" /></xsl:element>
96 </xsl:element>
97 </xsl:template>
98
99 <!-- _____ END _____ -->
100 </xsl:stylesheet>