スライド 1

2007/12/21 宮脇文経
源氏物語の世界 再編集版
• オリジナル -
http://www.sainet.or.jp/~eshibuya/index.html
高千穂大学 渋谷栄一教授 作成、無償公開
• V1 - HTML版、CSV版、CHM版
2003年4月~2004年10月 趣味で作成。
• V2 - XML版
http://genji.nce.buttobi.net/xml/
2004年12月~2005年8月 IPA未踏プロジェクトで作成。
クライアント側で動的再編集する基本方式を確立した。
背景:高負荷CGI禁止
• V3 - XML版
(現在は動作しない。∵サーバ:PHP4⇒PHP5)
http://www.genji-monogatari.net/xml/
2005年12月~2006年8月 IPA未踏プロジェクトで作成。
機能強化、構造整備、実用性向上
(V2)
凡
例
V1の既存機能
目標とする新機能
V1 - HTML版 の 仕掛け
本文
注釈
渋谷栄一訳
オリジナルHTMLファイル
静的再編集
プログラム
ローマ字版
与謝野晶子訳
固定
一括生成
一括アップロード
再編集結果
HTML
HTML
HTML
イメージ
挿絵
イメージ・音声
V3 - XML版 の 仕掛け
本文
注釈 渋谷栄一訳
オリジナルHTMLファイル
朗読
ローマ字版
与謝野晶子訳
静的再編集
プログラム
本文
注釈
渋谷栄一訳
挿絵リンク
与謝野晶子訳 ひらがな版
朗読リンク
文節情報
ルビ
XMLデータ
動的再編集(XSLT)
クライアント側で実行
動的再編集
プログラム1
(横書き表示)
挿絵
本文と朗読の対応関係
・・・
固定
XMLデータと再編集プログラムは追加可能
動的再編集
プログラム2
(縦書き表示)
動的再編集
プログラム3
(縦書き印刷用
文書作成)
HTML
HTML
IE6以降
WordML
MS-Word 2003以降
・・・
V3 - 再編集プログラムの構造
再編集仕様設定ページ(PHP)
実行
動的再編集処理ページ生成(PHP)
サーバ側で実行する部
分
MySQLデータベース
(会員情報、フォルダ情報等)
書式設定
再編集形式
毎に作成
クッキー
(書式情報等)
OK
再編集書式設定ページ
PHPで生成された
動的再編集処理
動的再編集処理ページ
のテンプレート
(HTML & JavaScript)
ページ (HTML/HTA
& JavaScript)
(HTML & JavaScript)
再編集
結果
XMLスタイルシート
動的再編集プログラム
本文
注釈
渋谷栄一訳
挿絵リンク
与謝野晶子訳 ひらがな版
朗読リンク
文節情報
ルビ
XMLデータ
本文と朗読の対応関係
・・・
WordMLのようにHDDに
保存する必要がある場
合等でHTAを使用する。
ただし、HTAではクッ
キー使用不可。
PHPで生成された動的再編集処理ページ
縦書き印刷用Word 2003文書を生成する場合
<HTML xmlns:msxsl="urn:schemas-microsoft-com:xslt" xmlns:my="http://www.genji-monogatari.net">
<META http-equiv="Content-Type" content="text/html; charset=EUC-jp"/>
<HEAD> <hta:application ID="myApp">
<TITLE>源氏物語の世界 再編集版 (XML形式) 縦書き印刷用Word 2003文書作成</TITLE>
</HEAD><BODY>
<SCRIPT> …(中略)…
var xmlInput = new Array(); …(中略)…
xmlInput[xmlInput.length] = xmlLoad('http://www.genji-monogatari.net/xml/eshibuya/text/text09.1.xml');
xmlInput[xmlInput.length] = xmlLoad('http://www.genji-monogatari.net/xml/eshibuya/notes/notes09.1.xml');
xmlInput[xmlInput.length] = xmlLoad('http://www.genji-monogatari.net/xml/eshibuya/sources/sources09.1.xml');
xmlInput[xmlInput.length] = xmlLoad('http://www.genji-monogatari.net/xml/eshibuya/revices/revices09.1.xml');
xmlInput[xmlInput.length] = xmlLoad('http://www.genji-monogatari.net/xml/eshibuya/version/version09.1.xml');
xmlInput[xmlInput.length] = xmlLoad('http://www.genji-monogatari.net/xml/mywkfmnr/yosano/yosano09.1.xml');
…(中略)…
var xslCnv2 = xmlLoad("http://www.genji-monogatari.net/xml/mywkfmnr/tate4Word/tate4Word.xsl.xml");
</SCRIPT>
<SCRIPT type="text/xml" id="xmlInput2">
XMLのヒアドキュメント。クッキーに保存されていた書式情報の取り込み等に使用する。
IE6(MSXML3)では <XML>タグ (XML island) も使えるが、MSXML4 で非サポートになったので、使用しない。
</SCRIPT>
<SCRIPT>
処理内容は以下のとおり。
●使用する3つの文字コード(シフトJIS、EUC、UTF-8)の相違を乗り越えるための処理
●xmlLoadした複数のXMLデータとXMLのヒアドキュメントを1つのXMLに連結する。
●連結したXMLをXSLTで変換
●変換結果をファイルに保存
●Word 2003起動
参考リンク
</SCRIPT>
</BODY></HTML>
連結したXML
XSLT
変換結果(XML)
開発を振り返って
 <msxsl:script>タグ(非標準)を多用した。
• 基本: シンタックス⇒XSLT、セマンティック⇒JavaScript
• XSLTでどう書けば良いか、すぐにはわからなかった所もJavaScript化した。
ただ、安易に走ったところがあり、そこは反省点。(慣れるにつれて減った)
• JavaScriptの方が書き易い所は多い。文字列操作、正規表現、グローバル変数、変数
値の更新、XML-DOM、関数、try~catch、エラー処理、…
• <msxsl:script>タグ相当機能を XSLT で標準化して欲しい。
 XSLTのデバッグに苦労した。
(無償ツールばかりだったから?)
• Java Scriptなら、MS-Officeのスクリプトエディタ付属デバッガでデバッグできるが、
<msxsl:script>タグ内のデバッグはサポートされていない。
• Visual Studio 2005のXSLTデバッグ機能も Express ~ Standard Editionには無い。
Professional Editionでも、<msxsl:script>タグには対応していない?
 グチ
• PHP・ASP・JSPの<%=式%>のような文字列埋め込み機能が欲しい。
• namespaceの扱いが難しい。本当は<源:帖>などとしたかったのだが…
• XMLの連結をXSLTで書いたらエラー処理できずボツ。JavaScriptで書き直した。
• "&lt;"はそのまま書けるのに"&nbsp;"をそのまま書けないのはなぜ?。