
|
あなたはスキーマを書けますか? BeyondXMLを使えば,スキーマを自動生成できます! あなたはスキーマにあわせてマークアップできますか? BeyondXMLを使えば,XMLデータを自動入出力できます! あなたはスキーマにあわせてスタイルシートを書けますか? BeyondXMLを使えば,スタイルシートを自動生成できます!(開発中) |
私(岸 和孝)は,印刷・出版業界における低調なXML活用の現況を少しでも打破できるようにするために,「はじめにXMLありき」「XML対応は専用のアプリケーションで」のパラダイムから「PostScriptのようにXMLも裏方に」「小学生もご隠居もXML活用へ」というパラダイムへの転回を提唱します。その新しいパラダイムを実現するために,実験ツール「BeyondXML」を開発しています。実験の途上ですので,まだ検討しなければならない課題も多くあり,ご意見を賜りたく存じます。また,興味深いサンプルや問題となるサンプルがありましたら,ぜひお寄せください。
現在,スプレッドシート向けの,BeyondXML for Calcと,定型帳票向けのBeyondXML for Tableが実現しています。これらのツールは,OpenOfficeのWriter文書のフィルターとして働きます。
BeyondXMLを使うことによって,XMLの知識が全くないユーザーでも,自ら作ったOpenOffice文書からRelaxNG形式のスキーマが作れるようになり,それに合わせたXML文書インスタンスを出力(エクスポート)したり,入力(インポート)できるようになります。対象となるOpenOffice文書についてはサンプルをご覧ください。
BeyondXMLによって,OpenOfficeの簡単な操作さえできれば,XMLをすぐに扱えるようになります。
BeyondXMLによって,個々のOpenOffice文書ごとのスキーマが自動的に推定されます。
BeyondXMLによって,OpenOffice文書の内容をXMLデータへエクスポートしたり,あるいはXMLデータからインポートするためのフィルターを個々の文書ごとに開発する必要がありません。
BeyondXMLによって,個々のOpenOffice文書ごとのスキーマを全く意識することなく,その文書のXMLデータが扱えます。
BeyondXMLによって,エクスポートされたXMLデータを他のシステムへ渡したり,OpenOffice文書へ再びインポートしたりできます。
BeyondXMLの扱うXMLデータはOpenDocument Format(ODF)形式ではなく,利用者独自のXML形式です。
BeyondXMLの利用は,無償です。
BeyondXMLがあれば,XMLの知識は不要になるのですか?
当面は,そうはいかないでしょうが,多くのソフトウェア開発業者が「XMLを超えて」の考えに賛同して,XMLを意識しなくてもXMLデータを扱える,利用者向けのツールをどんどん開発してくれるようになれば,XMLの知識は不要になるでしょう。
BeyondXMLを理解するのに,この説明書を理解しなければならないのですか?
BeyondXMLは,XMLの知識が全くないユーザーでも扱えるようになっていますが,この説明書を理解するには,XMLの知識が必要です。初心者向けの説明書は別途書くつもりです。
BeyondXMLとは,OpenOfficeでしか使えないのですか?
「XMLを超えて」は,XMLに対するひとつの考え方であって,OpenOfficeにおけるその実現をBeyondXMLと呼んでいます。Microsoft社のOfficeで実現できれば,それも結構な話です。InDesignなどのDTPツールでの実現も期待しています。
BeyondXMLは,既存のスキーマ(例えば,JDF,XBRL)に対応できますか?
BeyondXMLは,大半の既存のスキーマに対応できません。つまり,既存のスキーマこそ「はじめにXMLありき」だからです。ここでは「はじめに情報ありき」です。
BeyondXMLでエクスポートしたXMLデータを加工するツールはありますか?
BeyondXMLとしてはまだありませんが,検討中です。当面は既成のツールをお使いください。
BeyondXMLを改造してビジネスに使ってもかまいませんか?
BeyondXMLの翻案や商業的利用は,私の著作権を保持する条件下において可能です。
BeyondXMLの不具合によってデータの破壊などの障害は,起こりえますか?
BeyondXMLの使用によって生じる障害は予測できません。なるべく十分なテストを行ってから利用してください。仮に損害が生じても私は何らの責任を負いません。
BeyondXMLの自動的なインストーラーはありませんか?
BeyondXMLフィルターのインストーラーについては,XMLフィルター・インストーラーを利用してください。
BeyondXML version 0.9(英語版)のダウンロード
| version 0.9からの変更点 |
|---|
|
現在,夥しい数の電子文書(例えば,Word文書,PDF文書,HTML文書)が毎日作られ,ネット上で交換されています。ところが,その中に,相互運用性が低い文書表現形式(例えば,Word文書のMS Word形式)で表された文書が数多く含まれています。そのプラットフォーム(例えば,MS Office)を持たない者(あるいは持ちたくても持てない者)はそれらを再利用(とりわけ再編集)できません。言い換えれば,相互運用性が低い文書とは再処理可能性が低い文書のことです。このことは情報格差(デジタル・デバイド)の原因にもなっています。
そこで,標準の文書表現形式(例えば,SGML,XML,PDF)を採用すれば,プラットフォームに依存することなく,文書交換時における文書の相互運用性を高められ,情報化基盤を整備できる,と考えられています。果たして既存の標準でない文書表現形式から標準のXML形式への移行が声高に論じられています。これは確かにもっともな意見に聞こえます。
しかし,「はじめにXMLありき」は,あまりに技術に偏った考え方ではないでしょうか。私自身も反省するところ大です。本来,文書の表現形式は,応用から見れば何でもかまわないはずです。XMLのためのエディターが数多く開発されていますが,それらは技術者向けのもので,一般のユーザーが使いこなせるものではありません。「PostScriptのようにXMLも裏方に」とは,文字通り,ユーザーがXMLを意識しなくてもXMLを活用でき,文書の相互運用性を高められるような仕組みを考える,という発想です。そうした仕組みが実現すれば,「小学生もご隠居もXML活用へ」進めるはずです。
なるほど,RSSニュースリーダーのようにユーザーからXMLが隠されている仕組みも既に多数あります。しかし,個別的なXML応用では,やはりXSL変換などの処理を個別に開発しなければなりません。「XML対応は専用のアプリケーションで」は誰もができるという話でなく,時間も費用もかかります。小学生やご隠居がXML活用へ進むには,もっと簡単にXMLが利用できる仕組みがなければなりません。
フリーウェアのオフィス・スイート「OpenOffice」は,そうした要件を満たしているように見えます。OpenOfficeは,OASISが開発しISO規格となった,XML形式の「OpenDocumet Format(ODF)」で文書を表現しますので,PostScriptのようにXMLも「裏方(うらかた)」に回っていますし,無償で入手できることから,誰もがXML活用へ進める,と思われがちです。OpenOfficeの入手とインストールについては「付録 OpenOfficeの入手とインストール」を参照してください。
しかし,OpenOfficeを使っているだけでは,XMLを活用していると言えません。と言うのも,ODFは数あるXMLボキャブラリの一つに過ぎないからです。XMLボキャブラリは,ユーザーの必要に応じて限りなく作り出されるものであり,ODFなどの標準があったとしても,それがすべてを包含できるわけではありません。HTMLにしても同じことです。例えば,Adobe Dreamweaverを使うと,HTMLを意識することなくウェブ文書を制作できます。しかし,HTMLも数あるXMLボキャブラリの一つに過ぎません。まして,ユーザーがOpenOffice文書から任意のXMLデータを抽出したり,別のXMLデータと併合したりするには,XMLボキャブラリ(スキーマ)に合わせてフィルター(XSLスタイルシート)を用意しなければなりません。それは小学生やご隠居にできることではありません。
現在,XMLは明らかに「表方(おもてかた)」にあって,その活用は専門家の手に委ねられています。今まで当たり前と思われている,そうしたパラダイムを転回して,誰もがXMLボキャブラリを簡単に扱え,情報を管理できるようになるような仕組み作りへ向かうべきです。私は,誰もが簡単に利用できるOpenOfficeでそうした仕組みを実現してみよう,と考えました。もちろん,その仕組みが実現したからと言っても,XML対応の専用アプリケーション開発が無くなるわけではありません。私は,XML活用については情報が最初に生み出される場面(データ発生時点)を重視しています。言わば「源流指向」です。
一般に専門家がスキーマを作るというのは,様々に関連する情報がよく整理されるという利点はあるでしょうが,スキーマは,情報が最初に生み出される場面においてその情報を捉えた人によって決定される,と考えたほうが理にかなっていまし,その人にとっても有益なことだと思われます。現在,XMLを知らなくても扱えるXML対応アプリケーションが少ないので,「源流」でのデータのXML化には余り利点はないかもしれませんが,XML対応アプリケーションはこれから充実していく傾向にありますので,「源流」からXML化を始めることが大事だと考えます。
さて,OpenOfficeにおいてXML文書インスタンスを入出力(あるいは輸出入)を自動的に行なうには,先ず,その対象となる文書のXMLボキャブラリ(スキーマ)がどのようなものであるか分からなければなりません。しかし,そのスキーマは何から推定できるでしょうか。一つの仮定として「見えている内容に対するスタイルの名前がスキーマに対応するという枠組み」が考えられます。そのスタイルは,スタイル名さえ異なれば,同じ書体や文字サイズ,同じ表示色であっても構いません。肝心なことは,内容に対するスタイル名がその文書においてユニークであることです。
OpenOfficeにおけるスタイルには次のような種類があります。これらはユーザーが任意な名前で登録し,見えている内容に対して指定できます。
どのような文書でも,そのような枠組みでスキーマを推定できるかを以下のケーススタディで見てみましょう。
例えば,スプレッドシート文書で図2.1-1のような「名簿」を表したとします。XMLの概念では,「名前」と「住所」は要素名であり,「桃 太郎」や「鬼が島」はその要素の内容となります。さらに,XMLの背景にあるオブジェクトの概念では,要素名は「クラス名」に等しく,要素の内容は「インスタンス」と等しいものです。言い換えれば,要素名は「集合の名前」に等しく,要素の内容は「集合の元」と等しいものです。このスプレッドシートでは,それらの違いを強調するために,「名前」クラスに属すインスタンスと,「住所」クラスに属すインスタンスをそれぞれ別の背景色で表示しています。最初のタイトル行はクラスであり,2行目以降はデータ行(=インスタンス)です。XPath式で表すと,「桃 太郎」は「名簿/表の行[1]/名前」,「箱根足柄山」は「名簿/表の行[2]/住所」となります。私たちは,そうしたスタイルを付けなくても,タイトル行の各名前はクラスの名前,データ行はそのクラスごとのインスタンスであることを(用語はともかく)経験的に知っており,A列は「名前」のインスタンス,B列は「住所」のインスタンスとして内容を入力しています。
| A | B | |
| 1 | 名前 | 住所 |
|---|---|---|
| 2 | 金 太郎 | 箱根足柄山 |
| 3 | 桃 太郎 | 瀬戸内海鬼が島 |
| 4 | 浦島 太郎 | 何処海之底 |
ここで,スタイル名は表2.1-2のように設定されたものとします。
| スタイル名 | スタイルの種類 |
|---|---|
| 名簿 | ページ・スタイル |
| 名前 | セル・スタイル |
| 住所 | セル・スタイル |
この文書からSGML形式のスキーマ(DTD)は図2.1-3のように推定されます。ここで,「表の行」は行を意味する要素名の予約語とします。
<!DOCTYPE 名簿 [ <!ELEMENT 名簿 (表の行+) > <!ELEMENT 行 (名前,住所) > <!ELEMENT 名前 (#PCDATA) > <!ELEMENT 住所 (#PCDATA) > ]>
例えば,テキスト文書で図2.2-1のような「受注伝票」を表したとします。こうした罫線で囲んだ定形様式のテキスト文書では,「得意先」や「数量」といった見出し欄(=クラス)とその記入欄(=インスタンス)に分かれます。私たちは,スタイルを付けなくても,見出し欄はクラスの名前,記入欄はそのクラスのインスタンスであることを経験的に知っており,見出し欄に対応する記入欄に内容を入力しています。なお,ここでは,あえて記入欄におけるスタイルの違いを強調するためにそれぞれ別の背景色で表示しています。なお,OpenOfficeでは,こうしたテキスト文書はスプレッドシートが埋め込まれた形になります。
| 得意先 | 受注日 | |||
|---|---|---|---|---|
| 八百八商店 | 2008-02-06 | |||
| 商品 | 種類 | 数量 | 単価 | 金額 |
| にんじん | 野菜 | 30 | 100 | 3,000 |
| こまつな | 野菜 | 50 | 200 | 10,000 |
ここで,スタイル名は表2.2-2のように設定されたものとします。
| スタイル名 | スタイルの種類 |
|---|---|
| 受注伝票 | ページ・スタイル |
| 得意先 | セル・スタイル |
| 受注日 | セル・スタイル |
| 商品 | セル・スタイル |
| 種類 | セル・スタイル |
| 数量 | セル・スタイル |
| 単価 | セル・スタイル |
| 金額 | セル・スタイル |
この文書からSGML形式のスキーマは図2.2-3のように推定されます。ここで,「表の行」は行を意味する要素名とします。
<!DOCTYPE 受注伝票 [ <!ELEMENT 受注伝票 (得意先,受注日,表の行+) > <!ELEMENT 表の行 (商品,種類,数量,単価,金額) > <!ELEMENT 得意先 (#PCDATA) > <!ELEMENT 受注日 (#PCDATA) > <!ELEMENT 商品 (#PCDATA) > <!ELEMENT 種類 (#PCDATA) > <!ELEMENT 数量 (#PCDATA) > <!ELEMENT 単価 (#PCDATA) > <!ELEMENT 金額 (#PCDATA) > ]>
また,この文書からSGML形式のスキーマは図2.2-4のようにも推定されます。ここで,「表1の行」「表2の行」は行を意味する要素名とします。
<!DOCTYPE 受注伝票 [ <!ELEMENT 受注伝票 (表1の行,表2の行+) > <!ELEMENT 表1の行 (得意先,受注日) > <!ELEMENT 得意先 (#PCDATA) > <!ELEMENT 受注日 (#PCDATA) > <!ELEMENT 表2の行 (商品,種類,数量,単価,金額) > <!ELEMENT 商品 (#PCDATA) > <!ELEMENT 種類 (#PCDATA) > <!ELEMENT 数量 (#PCDATA) > <!ELEMENT 単価 (#PCDATA) > <!ELEMENT 金額 (#PCDATA) > ]>
例えば,テキスト文書で図2.3-1のような「名刺」を表したとします。このような文章主体のテキスト文書では,クラスが明示されていません。見えている(要素の)内容(=インスタンス)を書式付けしているスタイルをクラスとみなし,そのスタイルの名前をクラス名(要素名)とします。ここではスタイルの違いを強調するためにそれぞれ別の色で表示しています。
![]() 桃 太郎
〒89 瀬戸内海鬼が島電話 123-4567
momotaro@onigashima.com/
|
ここで,スタイル名は表2.3-2のように設定されたものとします。
| スタイル名 | スタイルの種類 |
|---|---|
| 名刺 | ページ・スタイル |
| ロゴ | フレーム・スタイル |
| 名前 | パラグラフ・スタイル |
| 住所 | パラグラフ・スタイル |
| 住所の郵便番号 | キャラクター・スタイル |
| 電話 | パラグラフ・スタイル |
| メール | パラグラフ・スタイル |
この文書からSGML形式のスキーマ(DTD)は図2.3-3のように推定されます。ここで,「画像」は画像データのURLを意味する属性名とします。
<!DOCTYPE 名刺 [ <!ELEMENT 名刺 (ロゴ,名前,住所,電話,メール) > <!ELEMENT ロゴ EMPTY > <!ATTLIST ロゴ 画像 CDATA #REQUIRED > <!ELEMENT 名前 (#PCDATA) > <!ELEMENT 住所 (#PCDATA) > <!ATTLIST 住所 郵便番号 CDATA #REQUIRED > <!ELEMENT 電話 (#PCDATA) > <!ELEMENT メール (#PCDATA) > ]>
属性を意味するスタイル名は,例えば,図2.4-1から図2.4-2のように推定されます。
見えている内容(=インスタンス)がある要素の属性である場合は,スタイル名は「要素名ノ属性名」という形で表現します。例えば「住所ノ郵便番号」というスタイル名であれば,要素名は「住所」となり,属性名は「郵便番号」となります。この場合,要素名のスタイル名は定義されているものとし,見えている内容は属性値と解釈します。
| A | B | C | D | |
| 1 | 名前 | ふりがな | 住所 | 郵便番号 |
|---|---|---|---|---|
| 2 | 金 太郎 | きん たろう | 箱根足柄山 | 123 |
| 3 | 桃 太郎 | もも たろう | 瀬戸内海鬼が島 | 456 |
| 4 | 浦島 太郎 | うらしま たろう | 何処海之底 | 789 |
| 5 | ||||
| 顧客名簿 | ||||
| ↑ 名前 | ↑ 名前ノふりがな | ↑ 住所 | ↑ 住所ノ郵便番号 | |
<!ELEMENT 名前 (#PCDATA) > <!ATTLIST 名前 ふりがな CDATA #REQUIRED > <!ELEMENT 住所 (#PCDATA) > <!ATTLIST 住所 郵便番号 CDATA #REQUIRED >
OpenOfficeではシステムがあらかじめ用意したスタイルが数多くありますが,この仕組みでは,ユーザーが独自に定義したスタイル名をスキーマの推定に用いることにします。
OpenOfficeがあらかじめ用意したスタイル名は,その表示と実際は異なり,「見出し」が「Heading」,「結果」が「Result」,「標準」が「Default」のようになっていますので,名前付けでは注意しなければなりません。BeyondXMLの処理は,ODFを対象とするXSL変換なので,名付けられたスタイル名が「ユーザー定義のスタイル名」であるどうかを判別できません。そうしたことから,スタイル名として「ユーザー定義のスタイル名」を指定することを勧めるわけです。
ユーザー定義のスタイル名は,漢字,平仮名,カタカナ(半角を除く),英数字,下線,ハイフンから構成されるものとし,先頭の文字は数字であってはなりません。スタイル名は,要素名や属性名になりますので,下線とハイフン以外の特殊記号(例えば,コロン,セミコロン,コンマ,ピリオド,アットマークなど)を含めることはできません。
図2.5-1に示すスタイル名は,BeyondXMLとして予約されたもので,その目的外には使用できません。
| スタイルの意味 | 日本語表示 | 英語表示 | 説明 | |||||
|---|---|---|---|---|---|---|---|---|
| タイトル行のスタイル | **タイトル** | **TITLE** | インポート時にタイトル行のスタイルを表します。 | |||||
| 表の行の要素名 | 表Nの行=要素名 | RowOfSheetN=要素名 | N番目に出現する表の行の要素名を表します。 | |||||
| 表の要素名 | 表N=要素名 | SheetN=要素名 | N番目に出現する表の要素名を表します。Writer文書の定型帳票の場合に利用できます。 | |||||
| 属性名 | 要素名ノ属性名 | 属性名-of-要素名 | 要素名の属性名を表します。 注1:属性名というスタイル名が付いたデータは存在しなければなりません。 注2:「ノ」は格助詞として働きます。 | |||||
| データ型 | 内容 | エクスポートされる内容 | インポート時の内容 |
|---|---|---|---|
| decimal | 固定小数点表示の10進数 | コンマを除いた数値 内容が空の場合は「0000」 | 右揃え,コンマを除いた数値 |
| date | YYYY-MM-DD形式または YYYY/MM/DD形式の日付 | YYYY-MM-DD形式の日付 内容が空の場合は「0001-01-01」 | 左揃え,日付 |
| anyURI | ホームページ・アドレスまたは メール・アドレス | そのままの文字列 | 左揃え,文字列 |
| string | 上記以外の文字列 | そのままの文字列 | 左揃え,文字列 |
BeyondXML for Calcは,表3-1のような機能を実現します。このツールは,OpenOfficeのCalc文書のフィルターとして働きます。BeyondXML for Calcを使うことによって,XMLの知識が全くないユーザーでも,Calc文書からRelaxNG形式のスキーマが作れるようになり,それに合わせたXML文書インスタンスを入出力できるようになります。
| BeyondXML for Calc | 機 能 | 設 定 | ||||
|---|---|---|---|---|---|---|
| フィルター名 | アプリケーション | ファイルの 種類名前 | ファイル 拡張子 | 変換 | ||
| BeyondXML-Calc-to-XML | Calc文書 → XML文書 | Calc-to-XML | OpenOffice.org Calc | Calc-to-XML | xml | エクスポート |
| BeyondXML-XML-to-Calc | XML文書 → Calc文書 | XML-to-Calc | OpenOffice.org Calc | XML-to-Calc | xml | インポート |
| BeyondXML-Calc-to-RNG | Calc文書 → RelaxNGスキーマ | Calc-to-RNG | OpenOffice.org Calc | Calc-to-RNG | rng | エクスポート |
| BeyondXML-for-Calc | 共通ライブラリ | |||||
BeyondXML for Calcの設定については「付録 XMLフィルターの設定方法」を参照してください。
BeyondXML for Calcの処理対象となるCalc文書は,図3-2のような形のスプレッドシートとします。そうでない形のスプレッドシートは,処理対象とはなりません。図3-2において,異なる背景色で強調されているデータ行(セル)には,異なるスタイル名が付いています。もちろん実際の書式は任意ですが,背景色を使うことで入力時の誤りが防げます。
| A | B | C | D | |||
| 1 | 名前 | 会社名 | 住所 | ← タイトル行 | ||
|---|---|---|---|---|---|---|
| 2 | 金 太郎 | 金時茶屋 | 箱根足柄山 | ← データ行 | ||
| 3 | 桃 太郎 | 瀬戸内海鬼が島 | ← データ行 | |||
| 4 | 浦島 太郎 | 竜宮 | 何処海之底 | ← データ行 | ||
| 5 | ← データ行 | |||||
| 顧客名簿 | ← 表の名前 | |||||
| ↑ 名前 | ↑ 会社名 | ↑ 住所 | ↑ なし | スタイル名 | ||
図3-3は,表の名前として「顧客名簿」,データ行の列の名前(スタイル名)として「名前」(黄緑色),「会社名」(桃色),「住所」(黄色)が付いていることを表しています。D列目より右方向,5行目より下方向はすべて空のセルからなっています。
| A | B | C | D | |
| 1 | 名前 | 会社名 | 住所 | |
|---|---|---|---|---|
| 2 | 金 太郎 | 金時茶屋 | 箱根足柄山 | |
| 3 | 桃 太郎 | 瀬戸内海鬼が島 | ||
| 4 | 浦島 太郎 | 竜宮 | 何処海之底 | |
| 5 | ||||
| 顧客名簿 | ||||
図3-4は,スタイル名が正しく付けられていないCalc文書の例を表しています。A3には「名前」でなく「会社名」のスタイル名が付いています。B3には「会社名」でなく「名前」のスタイル名が付いています。B4には「会社名」のスタイル名が付いていません。BeyondXML for Calcは,こうしたCalc文書を正しく処理できません。
| A | B | C | |
| 1 | 名前 | 会社名 | 住所 |
|---|---|---|---|
| 2 | 金 太郎 | 金時茶屋 | 箱根足柄山 |
| 3 | 桃 太郎 | 瀬戸内海鬼が島 | |
| 4 | 浦島 太郎 | 竜宮 | 何処海之底 |
| 5 | |||
| 顧客名簿 | |||
図3-5は,空白行のあるCalc文書の例を表しています。B列目はすべてスタイル名が付いていません。また,3行目はすべて空のセルからなっていますが,BeyondXML for Calcは,こうしたCalc文書を正しく処理できます。
| A | B | C | D | |
| 1 | 名前 | 会社名 | 住所 | |
|---|---|---|---|---|
| 2 | 金 太郎 | 金時茶屋 | 箱根足柄山 | |
| 3 | ||||
| 4 | 桃 太郎 | 瀬戸内海鬼が島 | ||
| 5 | 浦島 太郎 | 竜宮 | 何処海之底 | |
| 6 | ||||
| 顧客名簿 | ||||
図3-6は,一つの表に複数の表を含むCalc文書の例を表しています。それぞれにスタイル名は付いていますが,1〜5行の表と6〜8行の表は,その構成要素が異なります。BeyondXML for Calcは,こうしたCalc文書を正しく処理できません。
| A | B | C | |
| 1 | 名前 | 会社名 | 住所 |
|---|---|---|---|
| 2 | 金 太郎 | 金時茶屋 | 箱根足柄山 |
| 3 | 桃 太郎 | 瀬戸内海鬼が島 | |
| 4 | 浦島 太郎 | 竜宮 | 何処海之底 |
| 5 | |||
| 6 | 名前 | 電話番号 | |
| 7 | 力 太郎 | 12-3456 | |
| 8 | かぐや姫 | 78-9012 | |
| 8 | |||
| 顧客名簿 | |||
BeyondXML-Calc-to-RNGを使うと,RelaxNG形式のスキーマが得られます。
表の名前が一つの表を指す要素名となり,データ行の列のスタイル名が要素名となります。
表の名前が指定されていても内容を持たない場合,その要素は空要素としてもエクスポートされません。
BeyondXML-Calc-to-XMLは,ユーザーが任意に作ったCalc文書をサンプルとしてスキーマ定義を自動的に推定し,そのスキーマに合わせてCalc文書のデータをXML文書インスタンスとして自動的に出力(エクスポート)します。
図3.1-1に示すCalc文書があったとします。「ファイル」メニューから「エクスポート」アイテムを選ぶと,ダイアログが表示されます。ファイル書式として「BeyondXML-Calc-to-XML」を選んでエクスポートすると,図3.1-2に示すようなXML文書インスタンスが得られます。

<?xml version="1.0" encoding="UTF-8"?>
<!--
=================================
BeyondXML for Calc
version 0.8
(C)2008 kisi-kazutaka@nifty.com
=================================
文書情報:
作成者:
起草日時:2008-04-03T10:17:12
編集日時:2008-04-29T18:14:39
編集回数:15
編集周期:PT11H27M54S
処理系:NeoOffice/2.2$Unix OpenOffice.org_project/
-->
<名簿>
<名簿3年A組>
<徴収記録>
<名前 ふりがな="" 姓="か">かぐや</名前>
<学級費>2000</学級費>
<給食費>1000</給食費>
<備考/>
</徴収記録>
<徴収記録>
<名前 ふりがな="うりこ" 姓="うり">瓜子</名前>
<学級費>2000</学級費>
<給食費>50</給食費>
<備考/>
</徴収記録>
<徴収記録>
<名前 ふりがな="ちから たろう" 姓="ちから">力 太郎</名前>
<学級費>0000</学級費>
<給食費>500</給食費>
<備考>学級費は来月納入</備考>
</徴収記録>
</名簿3年A組>
<名簿3年B組>
<個人情報>
<名前 ふりがな="きん たろう">金 太郎</名前>
<生年月日>1996-01-01</生年月日>
<年齢>12</年齢>
<住所 郵便番号="123">箱根足柄山</住所>
<電話番号>123-4567</電話番号>
<メール>kintoro@kintoki.com</メール>
</個人情報>
<個人情報>
<名前 ふりがな="もも たろう">桃 太郎</名前>
<生年月日>0001-01-01</生年月日>
<年齢>0000</年齢>
<住所 郵便番号="456-789">瀬戸内海鬼が島</住所>
<電話番号>98-7654</電話番号>
<メール/>
</個人情報>
<個人情報>
<名前 ふりがな="うらしま たろう">浦島 太郎</名前>
<生年月日>1996-08-28</生年月日>
<年齢>12</年齢>
<住所 郵便番号="890">何処海之底</住所>
<電話番号>12345</電話番号>
<メール>urashima@ryugu.co.jp</メール>
</個人情報>
</名簿3年B組>
</名簿>
BeyondXML-Calc-to-XMLは,BeyondXML-Calc-to-XMLによって出力(エクスポート)されたXML文書インスタンスをCalc文書のデータとして自動的に入力(インポート)します。インポートは「ファイル」メニューの「開く」アイテムで指定します。これは可逆的な入出力のようになりますが,エクスポートされたXML文書インスタンスからは,Calc文書のスタイル情報が消えてしまいますので,再びインポートしてもデータは保持されていますが,そのスタイルはもとのようにはなりません。
BeyondXML-Calc-to-XMLは,まったく任意のXML文書インスタンスをCalc文書へ入力(インポート)することはできません。
BeyondXML-Calc-to-RNGは,ユーザーが任意に作ったCalc文書をサンプルとしてスキーマを自動的に推定し,RelaxNG形式のスキーマとして自動的に出力(エクスポート)します。
図3.1-1に示すCalc文書をBeyondXML-Calc-to-RNGを使ってエクスポートすると,図3.3-1に示すようなRelaxNG形式のスキーマが得られます。
<?xml version="1.0" encoding="UTF-8"?>
<!--
=================================
BeyondXML for Calc
version 0.8
(C)2008 kisi-kazutaka@nifty.com
=================================
文書情報:
作成者:
起草日時:2008-04-03T10:17:12
編集日時:2008-04-29T18:14:39
編集回数:15
編集周期:PT11H27M54S
処理系:NeoOffice/2.2$Unix OpenOffice.org_project/
-->
<grammar datatypeLibrary="http://www.w3.org/2001/XMLSchema-datatypes"
xmlns="http://relaxng.org/ns/structure/1.0">
<start>
<element name="名簿">
<element name="名簿3年A組">
<oneOrMore>
<element name="徴収記録">
<optional>
<ref name="名前"/>
</optional>
<optional>
<ref name="学級費"/>
</optional>
<optional>
<ref name="給食費"/>
</optional>
<optional>
<ref name="備考"/>
</optional>
</element>
</oneOrMore>
</element>
<element name="名簿3年B組">
<oneOrMore>
<element name="個人情報">
<optional>
<ref name="名前"/>
</optional>
<optional>
<ref name="生年月日"/>
</optional>
<optional>
<ref name="年齢"/>
</optional>
<optional>
<ref name="住所"/>
</optional>
<optional>
<ref name="電話番号"/>
</optional>
<optional>
<ref name="メール"/>
</optional>
</element>
</oneOrMore>
</element>
</element>
</start>
<define name="学級費">
<element name="学級費"><data type="decimal"/></element>
</define>
<define name="給食費">
<element name="給食費"><data type="decimal"/></element>
</define>
<define name="備考">
<element name="備考"><data type="string"/></element>
</define>
<define name="名前">
<element name="名前">
<optional>
<attribute name="姓"><data type="string"/></attribute>
</optional>
<optional>
<attribute name="ふりがな"><data type="string"/></attribute>
</optional>
<data type="string"/>
</element>
</define>
<define name="生年月日">
<element name="生年月日"><data type="date"/></element>
</define>
<define name="年齢">
<element name="年齢"><data type="decimal"/></element>
</define>
<define name="住所">
<element name="住所">
<optional>
<attribute name="郵便番号"><data type="string"/></attribute>
</optional>
<data type="string"/>
</element>
</define>
<define name="電話番号">
<element name="電話番号"><data type="string"/></element>
</define>
<define name="メール">
<element name="メール"><data type="anyURI"/></element>
</define>
</grammar>
BeyondXML-for-Calc.xslは,BeyondXML-Calc-to-XML.xsl,BeyondXML-XML-to-Calc.xsl,BeyondXML-Calc-to-RNG.xslの各フィルターに共通の機能を集めたライブラリで,それらと同じフォルダーに置きます。このフィルターの設定は不要です。
BeyondXML-Calc-to-XMLによってインポートしたXML文書インスタンスの最上位要素(Calc文書全体を指す要素)の名前がページの名前になるようにしてありますが,現実にはそうなりません。これは現在のOpenOfficeの不具合のようです。
BeyondXML for Tableは,表4-1のような機能を実現します。このツールは,OpenOfficeのWriter文書のフィルターとして働きます。BeyondXML for Tableを使うことによって,XMLの知識が全くないユーザーでも,Writer文書からRelaxNG形式のスキーマが作れるようになり,それに合わせたXML文書インスタンスを入出力できるようになります。
| BeyondXML for Table | 機 能 | 設 定 | ||||
|---|---|---|---|---|---|---|
| フィルター名 | アプリケーション | ファイルの 種類名前 | ファイル 拡張子 | 変換 | ||
| BeyondXML-Table-to-XML | Writer文書 → XML文書 | Table-to-XML | OpenOffice.org Writer | Table-to-XML | xml | エクスポート |
| BeyondXML-Table-to-XSL | Writer文書 → フィルター | Table-to-XSL | OpenOffice.org Writer | Table-to-XSL | xsl | エクスポート |
| BeyondXML-Table-to-RNG | Writer文書 → RelaxNGスキーマ | Table-to-RNG | OpenOffice.org Writer | Table-to-RNG | rng | エクスポート |
| BeyondXML-for-Table | 共通ライブラリ | |||||
BeyondXML for Tableの設定については「付録 XMLフィルターの設定方法」を参照してください。
BeyondXML for Tableの処理対象となるWriter文書は,図4-2のような定型帳票の形からなる一つの表とします。そうでない形の表は,処理対象とはなりません。図4-2において,異なる背景色で強調されている記入欄(セル)には,異なるスタイル名が付いています。もちろん実際の書式は任意ですが,異なる背景色で区別することによって入力時の誤りが防げます。見出し欄(セル)には,「標準」というスタイル名が付いています。これはスプレッドシートのタイトル行と同様にデータではありません。また,このページには「伝票」という名前が付いています(図4-2の底部に示します)。各セルに付けたスタイル名と,セルの内容から推定されるデータ型を表4-3に示します。
| 得意先 | 受注日 | |||||||
|---|---|---|---|---|---|---|---|---|
| 八百八商店 | 2008-02-06 | |||||||
| 商品 | 種類 | 数量 | 単価 | 金額 | ||||
| にんじん | 野菜 | 30 | 100 | 3,000 | ||||
| こまつな | 野菜 | 50 | 200 | 10,000 | ||||
| 商品 | 配送先 | 住所 | メールアドレス | |||||
| 大根 | 山田さん | 常盤町 | yamada@tokiwa-tyou.com | |||||
| 備考 | ||||||||
| 薩摩芋の入荷は大幅遅れ | ||||||||
| 伝票 | ||||||||
| スタイル名 | 推定されるデータ型 |
|---|---|
| 標準 | (見出し欄を示す) |
| 得意先 | string |
| 受注日 | date |
| 商品 | string |
| 種類 | string |
| 数量 | decimal |
| 単価 | decimal |
| 金額 | decimal |
| 配送先 | string |
| 住所 | string |
| メールアドレス | anyURI |
| 備考 | string |
見出し欄と記入欄の一対を一つの表とみなすことによってCalc文書との相似が得られます。図4-4にそれを示します。このことは,BeyondXML for TableとBeyondXML for Calcの相互運用が可能であることを意味します。例えば,Writer文書からエクスポートしたXML文書をCalc文書にインポートできます。あるいは,Calc文書からエクスポートしたXML文書をWriter文書にインポートできます。
| A | B | |||||||
| 1 | 得意先 | 受注日 | ||||||
|---|---|---|---|---|---|---|---|---|
| 2 | 八百八商店 | 2008-02-06 | ||||||
| 表1 | ||||||||
| A | B | C | D | E | ||||
| 商品 | 種類 | 数量 | 単価 | 金額 | ||||
| 1 | にんじん | 野菜 | 30 | 100 | 3,000 | |||
| 2 | こまつな | 野菜 | 50 | 200 | 10,000 | |||
| 3 | ||||||||
| 表2 | ||||||||
| A | B | C | D | |||||
| 商品 | 配送先 | 住所 | メールアドレス | |||||
| 1 | 大根 | 山田さん | 常盤町 | yamada@tokiwa-tyou.com | ||||
| 2 | ||||||||
| 表3 | ||||||||
| A | ||||||||
| 1 | 備考 | |||||||
| 2 | 薩摩芋の入荷は大幅遅れ | |||||||
| 表4 | ||||||||
| 伝票 | ||||||||
つまり,定型帳票の形を表す一つの表は,見出し欄と記入欄の一対ごとの表に分解されます。BeyondXML for Tableでは,BeyondXML for Calcの場合と同様に,次のように「表の名前」と「行の名前」を設定できます。
BeyondXML-Table-to-XMLは,ユーザーが任意に作ったWriter文書をサンプルとしてスキーマ定義を自動的に推定し,そのスキーマに合わせてWriter文書のデータをXML文書インスタンスとして自動的に出力(エクスポート)します。
図4.1-1に示すWriter文書があったとします。「ファイル」メニューから「エクスポート」アイテムを選ぶと,ダイアログが表示されます。ファイル書式として「BeyondXML-Table-to-XML」を選んでエクスポートすると,図4.1-2に示すようなXML文書インスタンスが得られます。

<?xml version="1.0" encoding="UTF-8"?>
<!--
=================================
BeyondXML for Table
version 0.7
(C)2008 kisi-kazutaka@nifty.com
=================================
文書情報:
作成者:kazutaka kisi
起草日時:2008-03-26T11:12:17
編集日時:2008-04-08T17:06:46
編集回数:140
編集周期:P4DT5H41M40S
処理系:NeoOffice/2.2$Unix OpenOffice.org_project/
-->
<伝票>
<顧客欄>
<顧客明細>
<得意先>八百八商店</得意先>
<受注日>2008-02-06</受注日>
</顧客明細>
</顧客欄>
<受注欄>
<受注明細>
<商品>人参</商品>
<種類>野菜</種類>
<数量>30</数量>
<単価>100</単価>
<金額>3000</金額>
</受注明細>
<受注明細>
<商品>小松菜</商品>
<種類>野菜</種類>
<数量>50</数量>
<単価>200</単価>
<金額>10000</金額>
</受注明細>
</受注欄>
<配送欄>
<配送明細>
<商品>大根</商品>
<配送先>山田さん</配送先>
<住所>常盤町</住所>
<メールアドレス>yamada@tokiwa-mati.com</メールアドレス>
</配送明細>
</配送欄>
<備考欄>
<備考明細>
<備考>薩摩芋の入荷は大幅遅れ</備考>
</備考明細>
</備考欄>
</伝票>
BeyondXML-Table-to-XSLは,BeyondXML-Table-to-XMLによって出力(エクスポート)されたXML文書インスタンスをWriter文書に再び入力(インポート)するフィルターを自動的に生成します。そのインポート・フィルターは,インポートしたXML文書インスタンスに現在のWriter文書のスタイル情報を与えるように組み立てられますので,別の内容を持つXML文書インスタンスをインポートして組版できる専用のフィルターになります。言い換えれば,このような専用のフィルターを書こうとするならば,先ずスキーマを理解し,次に結果のWriter文書のスタイルを想定し,その対応に基づいてXSL変換の処理を考えながら書いていくことになるでしょう。それはODFについての知識とXSL変換についての十分な経験を持たなければ,到底できない作業です。BeyondXML-Table-to-XSLは,その作業を自動的に行います。
BeyondXML-Table-to-XSL,BeyondXML-Table-to-XML,自動的に生成される専用フィルターの関連と利用の手順を図4.2-1に示します。
ここで,こうした流れは「ODFによるデータ交換の流れと同じではないか」という疑問が生じるかもしれません。なるほど,Writer文書を別の処理へ回したり,別の処理から受け取ったりする流れは実現できるでしょうが,ここでは,ODFのボキャブラリではなく,利用者独自のボキャブラリで表したXML文書インスタンスを扱うことに重点を置いています。
設計 エクスポート 現在のWriter文書 ──→ BeyondXML-Table-to-XML ──→ 現在の内容を持つXML文書インスタンス ─→ 別の処理へ │ │ │ └───→ BeyondXML-Table-to-XSL ──→ あなたのインポート・フィルター │ ↓ テンプレートとしての Writer文書 ──→ 別のWriter文書 インポート 組版 新しいWriter文書 ←── あなたのインポート・フィルター ←── 別の内容を持つXML文書インスタンス ←─ 別の処理から
BeyondXML-Table-to-RNGは,ユーザーが任意に作ったWriter文書をサンプルとしてスキーマを自動的に推定し,RelaxNG形式のスキーマとして自動的に出力(エクスポート)します。
図4.1-1に示すWriter文書をBeyondXML-Table-to-RNGを使ってエクスポートすると,図4.3-1に示すようなRelaxNG形式のスキーマが得られます。
<?xml version="1.0" encoding="UTF-8"?>
<!--
=================================
BeyondXML for Table
version 0.7
(C)2008 kisi-kazutaka@nifty.com
=================================
文書情報:
作成者:kazutaka kisi
起草日時:2008-03-26T11:12:17
編集日時:2008-04-08T17:06:56
編集回数:140
編集周期:P4DT5H41M40S
処理系:NeoOffice/2.2$Unix OpenOffice.org_project/
-->
<grammar datatypeLibrary="http://www.w3.org/2001/XMLSchema-datatypes" xmlns="http://relaxng.org/ns/structure/1.0">
<start>
<element name="伝票">
<element name="顧客欄">
<element name="顧客明細">
<ref name="得意先"/>
<ref name="受注日"/>
</element>
</element>
<element name="受注欄">
<oneOrMore>
<element name="受注明細">
<ref name="商品"/>
<ref name="種類"/>
<ref name="数量"/>
<ref name="単価"/>
<ref name="金額"/>
</element>
</oneOrMore>
</element>
<element name="配送欄">
<oneOrMore>
<element name="配送明細">
<ref name="商品"/>
<ref name="配送先"/>
<ref name="住所"/>
<ref name="メールアドレス"/>
</element>
</oneOrMore>
</element>
<element name="備考欄">
<element name="備考明細">
<ref name="備考"/>
</element>
</element>
</element>
</start>
<define name="得意先">
<element name="得意先"><data type="string"/></element>
</define>
<define name="受注日">
<element name="受注日"><data type="date"/></element>
</define>
<define name="種類">
<element name="種類"><data type="string"/></element>
</define>
<define name="数量">
<element name="数量"><data type="decimal"/></element>
</define>
<define name="単価">
<element name="単価"><data type="decimal"/></element>
</define>
<define name="金額">
<element name="金額"><data type="decimal"/></element>
</define>
<define name="商品">
<element name="商品"><data type="string"/></element>
</define>
<define name="配送先">
<element name="配送先"><data type="string"/></element>
</define>
<define name="住所">
<element name="住所"><data type="string"/></element>
</define>
<define name="メールアドレス">
<element name="メールアドレス"><data type="anyURI"/></element>
</define>
<define name="備考">
<element name="備考"><data type="string"/></element>
</define>
</grammar>
BeyondXML-for-Table.xslは,BeyondXML-Table-to-XML.xsl,BeyondXML-Table-to-XSL.xsl,BeyondXML-Table-to-RNG.xslの各フィルターに共通の機能を集めたライブラリで,それらと同じフォルダーに置きます。このフィルターの設定は不要です。
OpenOfficeをインストールする実行環境に合わせて,表A1-1の入手先サイトからダウンロードしてください。必要に応じて最新のパッチもダウンロードしてください。
| 実行環境 | OpenOfficeの種類 | 入手先サイト |
|---|---|---|
| Windows 2000/XP/Vista | OpenOffice | オープンオフィスの入り口 |
| MacOS X | NeoOffice | NeoOffice |
参考までに,私の実行環境は,表A1-2のとおりです。
| マシンの種類 | OSの種類 | OpenOfficeの種類 |
|---|---|---|
| IBM ThinkPad A20m 512MB RAM | Microsoft Windows XP Professional Version 2002 Service Pack2 | OpenOffice.org 2.3.0 日本語版 |
| Apple MacBook Pro 1.5GM RAM | Mac OS X バージョン10.5.2 | NeoOffice 2.2.3 Patch 2 言語パックの日本語のパッチを当ててあります。 |
OpenOffice(またはNeoOffice)のインストールは,簡単な操作です。ダウンロードしたパッケージを任意の場所に置いてダブルクリックし,そのインストーラーを実行します。その後は,表示されるガイドにしたがって進めるだけです。パッチのパッケージのインストールはその後行います。
先ず,設定するXMLフィルターをディスクの任意の場所に置きます。次に「ツール」メニューの中から「XMLフィルタ設定」アイテムを選ぶと,図A2-1のダイアログが表示されます。図A2-1には,あらかじめインストールされたフィルターが表示されますが,その種類は,OpenOffice(またはNeoOffice)のバージョンによって異なります。

図A2-1の「新規作成」ボタンを押すと,図A2-2のダイアログが表示されます。

このダイアログの各記入欄に必要な内容を図A2-3のように入力します。

各記入欄の意味は,表A2-4のとおりです。
| 欄 | 内容 |
|---|---|
| フィルタ名 | フィルターの名前を任意の文字列で指定します。 |
| アプリケーション | このフィルターがOpenOfficeのどのアプリケーションで働くかをポップアップ・メニューの中から選びます。 |
| ファイルの種類名前 | インポート(開く)やエクスポートのダイアログで示される「ファイルの種類」を任意の文字列で指定します。 |
| ファイル拡張子 | インポートまたはエクスポートする際のファイルの拡張子を任意の文字列で指定します。 |
| コメント | 単なる備考です。 |
図A2-3の「変換」タグを押すと,図A2-5のダイアログが表示されます。ここで,インポートまたはエクスポートで用いるフィルターを「インポート用XSLT」または「エクスポート用XSLT」の右側にある「検索」ボタンを押して設定します。「検索」ボタンを押すと,「ファイルを開く」のダイアログが表示されます。そこで,該当するフィルターが記述されたファイルを指定することによって設定できます。図A2-5で指定したフィルターの記憶場所を変更した場合は,この操作をし直さなければなりません。

図A2-3または図A2-5のダイアログの「OK」ボタンを押すと,図A2-6のダイアログが表示され,あらかじめインストールされている他のフィルターとともに,追加されたXMLフィルターを確認できます。ここで「閉じる」ボタンを押すと,XMLフィルターの設定が終了し,それは直ちに利用可能になります。

「サンプル名簿」は,二つの表を含むCalc文書であり,Calcで開いた時の内容を図A3-1に示します。「ふりがな」欄が「名前ノふりがな」として「名前」要素の「ふりがな」属性になり,また「郵便番号」欄が「住所ノ郵便番号」として「住所」要素の「郵便番号」属性になることに注目してください。これはBeyondXML for Calcで処理します。

「サンプル辞典」は,1000行を超える大きなCalc文書であり,Calcで開いた時の内容を図A3-2に示します。これはBeyondXML for Calcで処理します。インポートやエクスポートにはかなり時間がかかりますので,ご注意ください。

「サンプル伝票」は,見出し欄と記入欄を罫線で囲んだWriter文書であり,Writerで開いた時の内容を図A3-3に示します。これはBeyondXML for Tableで処理します。

「サンプル報告書」は,記入欄だけを罫線で囲んだWriter文書であり,Writerで開いた時の内容を図A3-4に示します。「所属部門」欄が「報告者ノ部門」として「報告者」要素の「部門」属性になり,また科目の未語側にある「備考」欄が「科目ノ備考」として「科目」要素の「備考」属性になることに注目してください。これはBeyondXML for Tableで処理します。

BeyondXML for CalcとBeyondXML for Tableの開発にあたっては,次のようなXSL変換の手法をとっています。必ずしも洗練されたコーディングではありませんが,フィルター開発の参考になれば幸甚です。また,この手法に疑問や問題があれば,ぜひご指摘ください。
名前#string,名前@ふりがな#string,生年月日#string,年齢#decimal,住所#string,電話番号#string,メール?#anyURI,
<xsl:variable name="itemName">
<xsl:call-template name="ItemName">
<xsl:with-param name="itemWithAttribute" select="$item" />
</xsl:call-template>
</xsl:variable>
<xsl:variable name="elementName" select="substring-before($itemName, '|')" />
<xsl:variable name="attributeName" select="substring-after($itemName, '|')" />
<xsl:with-param name="type"></xsl:with-param>