linkdeveloperxmlxpriorisolutionxmldbdownloadtop
トップページ ご利用ガイド サイトマップ


↑Get! NeoCore!


↑ITスキルを
のばすなら


↑XMLのことなら

↑セミナー開催
NeoCoreXMS/Xpriori


TOP  >>  XML解説  >>  探検 XMLボキャブラリの世界



2008年5月8日 更新


第13回:オフィス文書のボキャブラリ − ODF(その2)

著者:岸 和孝(JAGAT客員研究員)

今回は,前回の続きとして,OpenOfficeで扱うオフィス文書のXMLボキャブラリであるOpen Document Format(ODF)についてお話しします。

電子文書の相互運用性

その前に,Microsoft社の「Office」が余りにも普及しているために,それがあたかもオフィス・スーツの事実上の標準とみなされていることから生じる問題について少し触れておきましょう。Windowsユーザーにはピンとこない話かもしれませんが,Microsoft Officeを使っていないユーザーは少なからず存在します。したがって,そうしたユーザーへMicrosoft Office文書を渡すことがナンセンスであることは明らかなのですが,私の経験からは,そうしたことに無頓着なWindowsユーザーが意外に多いと感じています。Microsoft Office文書を閲覧できる無償のツールがあれば問題ないのですが,残念ながら,入手できるのはWord文書用のWord Viewerだけです。しかも,そのプラットフォームはWindows版だけですので,ほとんど意味がありません。私は仕事柄MacintoshとWindowsマシンを併用しており,それぞれにMicrosoft Officeをインストールしています。Microsoft Officeの働きが微妙に違うのでそうしているのですが,実に無駄な投資だと思っています。

Microsoft Office文書が横行する背景には,現実的な原因があります。それは,文書の受け手側で編集などの再処理が必要なことが多いからです。テキスト・データはどのようなプラットフォームでも扱えますが,文書の内容しか表現できません。そうなると,スタイルをどう表すのかという問題が生じてしまいます。スタイルは単に体裁を表すだけでなく,意図的に,あるいは無意識のうちに文書内容の意味も反映しています。果たして,スタイルを含められるMicrosoft Office文書を渡すことになります。一方,PDFはどのようなプラットフォームでも閲覧できますが,編集などの再処理はできません。このように,電子文書の相互運用性を確保することは,実に厳しい状況です。そうしたことからMicrosoft社が2007 Microsoft Officeの文書のボキャブラリであるOffice Open XML File Format(OOXML)を公開したことには,大きな意義があると思います。

ケース・スタディ

さて,私は現在OpenOfficeの実用性を確かめるためにケース・スタディを行っております。それは,個人的な活用から始めて,印刷・出版に至る活用を視野に入れたものです。具体的には,辞書データを作成・編集し,その結果を組版してPDF形式で出力するという単純なワークフローです。辞書データの作成・編集をOpenOfficeのワープロ,スプレッドシート,フォーム経由のデータベースという別々のツールで行えるかどうか,さらに,三つのうちの任意な一つのツールで作った辞書データを他の二つのツールで継続して作成・編集できるかどうか,を調べます。また,OpenOffice(Windows版)とNeoOffice(MacOS X版)の違いがあるかどうか,も調べます。図1にその概念図を示します。辞書データは,適当に定義した文書型で表されたXML文書インスタンスで表します。図中の矢印は,辞書データをインポートしたりエクスポートしたりする方向を表しています。

▼図1 ケース・スタディの概念図

このケース・スタディは,一般にユーザーは使い慣れたツールを選ぶことを仮定しています。つまり,多くの人々は原稿をワープロで作るでしょうが,辞書データでは分類が必要なので,スプレッドシートを選ぶ人もいるでしょう。また,技術スキルの高い人はフォームを介してデータベースで辞書データを整理するかもしれません。どのようなツールで原稿を作っても,別の人が別のツールで編集でき最終的な結果としてのPDF文書を得ることができれば,ワークフローとして受け入れられる,と考えた結果です。ツールのイメージをつかんでいただくために表1にMicrosoft OfficeとOpenOfficeの対比を示します。このケース・スタディでは,Writer(ワープロ),Calc(スプレッドシート),Base(フォーム経由のデータベース)というツールを用います。

▼表1 オフィス・スーツの対比
機能Microsoft OfficeOpenOffice
ワープロWordWriter
スプレッドシートExcelCalc
プレゼンテーションPowerPointImpress
電子メールOutlook
流れ図VisioDraw
ドローイングPhotoDrawDraw
数式,化学式Equation EditorMath
データ管理AccessBase
プロジェクト管理Project
DTPPublisherDraw
ウェブ・デザインSharePoint DesignerWriter
コラボレーションGroove

インポートとエクスポート

ケース・スタディの詳細な説明は,紙面の関係から割愛させていただきます。ここでは,極めて小さな文書を例にとって仕組みの一部を説明することにします。先ず,図2のような適当に定義した文書型で表されたXML文書インスタンスをWriter(ワープロ)へインポートしてみます。ここで,「インポート」とは,ある文書型で表されたXML文書インスタンスをXSL変換によってODFへ変換する処理です。OpenOfficeでは,図3のようなXSL変換のスタイルシートのことを「インポート・フィルター」と呼んでいます。逆に,ODFをある文書型で表されるXML文書インスタンスへXSL変換する処理が「エクスポート」になります。そのスタイルシートのことを同様に「エクスポート・フィルター」と呼んでいます。図2のXML文書インスタンスを図3のインポート・フィルターによってXSL変換を行った結果を図4に示します。

図4がODFで表されたWriter(ワープロ)文書ということになります。このODFは,便宜上書き加えた注釈をご覧いただければ,おおよその意味はつかめるでしょう。変換結果のワープロ文書がどのように見えるかは,あえて示さない代わりに,図4と等価なHTML文書を図5に示しますので,想像してください。この二つを比べてみると,構造的に似ていることが分かるでしょう。つまり,OpenOfficeのWriter(ワープロ)の働きは,Webブラウザーの働きと同じようになります。ODFのタグの種類は,前回述べましたように,HTMLよりも遥かに多く,属性にXSLのフォーマティング・オブジェクトSVGが借用されていますので,フィルターを直に書けるようになるには,多くの経験を積まなければならないでしょう。私が採用した手っ取り早い方法は,こうです。先ず,あらかじめ文書のひな形をOpenOfficeで作成し,その文書ファイルを保存した後で解凍します。そして,その中の「content.xml」をテキスト・エディターで開きます。それが目的とする変換結果ということになりますので,それを参考にしてフィルターを作っています。

▼図2 適当に定義した文書型で表されたXML文書インスタンス
<?xml version="1.0"?>
<k:mybook xmlns:k="http://www.jagat.or.jp/sgml/oo/MyBook">
<k:h>はじめに</k:h>
<k:p>これは段落-1です。</k:p>
<k:p>これは段落-2です。</k:p>
</k:mybook>
▼図3 インポート・フィルター
<?xml version="1.0"?>
<xsl:stylesheet  version="1.0"
                 xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
                 xmlns:office="urn:oasis:names:tc:opendocument:xmlns:office:1.0"
                 xmlns:style="urn:oasis:names:tc:opendocument:xmlns:style:1.0"
                 xmlns:text="urn:oasis:names:tc:opendocument:xmlns:text:1.0"
                 xmlns:fo="urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0"
                 xmlns:svg="urn:oasis:names:tc:opendocument:xmlns:svg-compatible:1.0"
                 xmlns:k="http://www.jagat.or.jp/sgml/oo/MyBook"
                 office:version="1.0">
<xsl:template match="/">
  <office:document-content>
    <office:font-face-decls>
      <style:font-face style:name="MS Gothic" svg:font-family="&apos;MS Gothic&apos;"
                       style:font-family-generic="swiss" style:font-pitch="variable"/>
      <style:font-face style:name="MS Mincho" svg:font-family="&apos;MS Mincho&apos;"
                       style:font-family-generic="swiss" style:font-pitch="variable"/>
    </office:font-face-decls>
    <office:styles>
      <style:style style:name="H" style:family="paragraph">
        <style:paragraph-properties fo:text-align="center" fo:line-height="18pt" />
        <style:text-properties style:font-name-asian="MS Gothic"
                               style:font-size-asian="18pt" />
      </style:style>
      <style:style style:name="P" style:family="paragraph">
        <style:paragraph-properties fo:text-align="justify" fo:line-height="16pt" />
        <style:text-properties style:font-name-asian="MS Mincho"
                               style:font-size-asian="14pt" />
      </style:style>
    </office:styles>
    <office:body>
      <office:text>
        <xsl:apply-templates />
      </office:text>
    </office:body>
  </office:document-content>
</xsl:template>
<xsl:template match="//k:h">
  <text:p text:style-name="H"><xsl:apply-templates /></text:p>
</xsl:template>
<xsl:template match="//k:p">
  <text:p text:style-name="P"><xsl:apply-templates /></text:p>
</xsl:template>
<xsl:template match="text()">
  <xsl:value-of select="." />
</xsl:template>
</xsl:stylesheet>
▼図4 XSL変換の結果
<?xml version="1.0" encoding="UTF-8"?>
<office:document-content  version="1.0"
                 xmlns:office="urn:oasis:names:tc:opendocument:xmlns:office:1.0"
                 xmlns:style="urn:oasis:names:tc:opendocument:xmlns:style:1.0"
                 xmlns:text="urn:oasis:names:tc:opendocument:xmlns:text:1.0"
                 xmlns:fo="urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0"
                 xmlns:svg="urn:oasis:names:tc:opendocument:xmlns:svg-compatible:1.0"
                 xmlns:k="http://www.jagat.or.jp/sgml/oo/MyBook">
  <!-- 書体宣言 -->
  <office:font-face-decls>
    <style:font-face style:name="MS Gothic" svg:font-family="&apos;MS Gothic&apos;"
                     style:font-family-generic="swiss" style:font-pitch="variable"/>
    <style:font-face style:name="MS Mincho" svg:font-family="&apos;MS Mincho&apos;"
                     style:font-family-generic="swiss" style:font-pitch="variable"/>
  </office:font-face-decls>
  <!-- スタイルの指定 -->
  <office:styles>
    <style:style style:name="H" style:family="paragraph">
      <style:paragraph-properties fo:text-align="center" fo:line-height="18pt" />
      <style:text-properties style:font-name-asian="MS Gothic"
                             style:font-size-asian="18pt" />
    </style:style>
    <style:style style:name="P" style:family="paragraph">
      <style:paragraph-properties fo:text-align="justify" fo:line-height="16pt" />
      <style:text-properties style:font-name-asian="MS Mincho"
                             style:font-size-asian="14pt" />
    </style:style>
  </office:styles>
  <!-- 本体 -->
  <office:body>
    <office:text>
      <text:p text:style-name="H">はじめに</text:p>
      <text:p text:style-name="P">これは段落-1です。</text:p>
      <text:p text:style-name="P">これは段落-2です。</text:p>
    </office:text>
  </office:body>
</office:document-content>
▼図5 図4と等価なHTML文書
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML>
  <HEAD>
    <META HTTP-EQUIV="CONTENT-TYPE" CONTENT="text/html; charset=utf-8">
    <!-- 書体宣言,スタイルの指定 -->
    <STYLE>
      P.H { text-align:center;  font-family:"MS ゴシック"; 
            font-size:14pt; line-height:18pt }
      P.P { text-align:justify; font-family:"MS 明朝"; 
            font-size:12pt; line-height:16pt }
    </STYLE>
  </HEAD>
  <!-- 本体 -->
  <BODY>
    <P CLASS="H">はじめに</P>
    <P CLASS="P">これは段落-1です。</P>
    <P CLASS="P">これは段落-2です。</P>
  </BODY>
</HTML>

フィルターの開発

インポートが,入力するXML文書インスタンスの構造をたどって,表示したい文書(ODF)の構造へタグを対応づけるのに対して,エクスポートは,現在表示している文書(ODF)の構造をたどって,出力したいXML文書インスタンスの構造へタグを対応づける形になります。こうしたインポートとエクスポートの働きによってOpenOfficeは様々な文書型で表されたXML文書インスタンスを扱えるわけです。OpenOfficeには,実に様々な組み込み済みのフィルターが用意されていますので,汎用の文書型であればフィルターの開発は不要でしょう。しかし,印刷・出版の分野では,文書作成者によって独自に定義された専用の文書型を使うケースが増えると考えられます。また印刷・出版業者からフィルターを提供することによって,プリプロセス(入稿から組版までの工程)を効率化できる,とケース・スタディを通じて私は確信しています。何はともあれ,OpenOfficeの活用にはODFの仕様書の理解が前提になりますので翻訳を始めております。

現在,OpenOfficeの関連サイトを見て回っても,大半のエンド・ユーザーは,OpenOfficeをMicrosoft Officeの代替ツール程度に考えており,そのXML機能まで踏み込んだ議論はわずかです。印刷・出版の関係者は,その専門性からOpenOfficeのXML機能をもっと積極的に取り上げるべきではないでしょうか。この記事がその一助になれば幸甚です。今回はワープロ(Writer)のボキャブラリーの一端を垣間見た程度で,フィルターの設定方法やエクスポート・フィルターの例は,紙面の関係から説明を割愛させていただきました。次回は,もう少し掘り下げてみることにしましょう。なお,ODFの仕様書の日本語訳やケース・スタディの成果については,近いうちに公表しますので,お楽しみに。


社団法人日本印刷技術協会(JAGAT) PrintersCircle 2007年7月号より転載

社団法人日本印刷技術協会(JAGAT) 探検 XMLボキャブラリの世界




  探検 XMLボキャブラリの世界
  第1回  ホームページのボキャブラリ − XHTML
  第2回  印刷のボキャブラリ − JDF,JMF,PrintTalk
  第3回  書誌情報のボキャブラリ − RDF,RSS,Atom
  第4回  新聞記事のボキャブラリ − NewsML
  第5回  電子商取引のボキャブラリ − PrintTalk
  第6回  ビジネス・グラフのボキャブラリ − ODF,xChart,JMSL chart,ChartSVG,XML/SWF Charts,xfy
  第7回  化学のボキャブラリ − CML
  第8回  文書型定義のボキャブラリ − XML Schema,RELAX NG
  第9回  地理情報のボキャブラリ − GML,G-XML
  第10回  楽譜のボキャブラリ − MusicXML
  第11回  数式のボキャブラリ − MathML
  第12回  オフィス文書のボキャブラリ − ODF(その1)
  第13回  オフィス文書のボキャブラリ − ODF(その2)
  第14回  オフィス文書のボキャブラリ − ODF(その3)
  第15回  オフィス文書のボキャブラリ − ODF(その4)
  第16回  オフィス文書のボキャブラリ − ODF(その5)
  第17回  ユーザー・インターフェースのボキャブラリ − XUL
  第18回  音声対話のボキャブラリ − VoiceXML,CCXML,SCXML
  第19回  文書型定義のボキャブラリ − RELAX NG Compact Syntax
  第20回  ボキャブラリ変換のボキャブラリ − XSLT

  関連記事
  XPathを使ってみよう
  属性を記述してみよう

^ ページのトップへ

Copyright(c)2004 Nihon Unitec Co., Ltd. All right reserved.