mb_language("uni"); mb_internal_encoding("utf-8"); mb_http_input("auto"); mb_http_output("utf-8"); ?>
今回は,前回の続きとして,OpenOfficeで扱うオフィス文書のXMLボキャブラリであるOpen Document Format(ODF)について,その活用の一端をお話しします。
前回は,私が現在OpenOfficeの実用性を確かめるために行っているケース・スタディについて紹介しました。そのケース・スタディでは,辞書データを作成・編集し,その結果を組版してPDF形式で出力するという単純なワークフローに基づき,辞書データの作成・編集をOpenOfficeのワープロ,スプレッドシート,フォーム経由のデータベースという別々のツールで行えるかどうか,さらに,三つのうちの任意な一つのツールで作った辞書データを他の二つのツールで継続して作成・編集できるかどうか,を調べています。そうしたケース・スタディに欠かせない技術資料の一つにODFの仕様書があります。現在,それを和訳しており,その翻訳の作業にあたってODFを活用しています。
ODFの仕様書をODFで扱うと言うと,ややこしい話になりそうですが,心配しないでください。ODFの仕様書はOpenOfficeのWriter(ワープロ)で書かれていますから,そのファイルはODFで表されているというだけのことです。W3Cが発行しているHTMLの仕様書がHTMLで書かれていることと同じです。ちなみに,OpenOffice関連の資料の大半は,再処理可能なOpenOffice文書(すなわちODFで表されたファイル)として入手できます。
私は,図1と図2に示すように,ODFの仕様書の英文を和文へ直接翻訳しています。その際に,新たな用語が初出した時に,それを脚注として示すようにしています。それは私の覚え書きでありますが,完訳した際は読者の便宜を図るものになるでしょう。用語の数はかなり多く,仕様書の1割を訳し終えた段階で約300の用語を数えるに至っています。仕様書全体で約700ページありますので,このペースで行くと,最終にはとてつもない数になりそうです。もっとも,私の覚え書きということもあって,すでに訳した用語を重複して脚注に示している場合もありそうです。あるいは,すでに決めてある訳語に別の訳語を割り当てている場合もありそうです。そうした問題を目で追って解決するのは気の重い話です。
▼図1 ODFの仕様書の一部(英文)
▼図2 ODFの仕様書の一部(和文)
要は,文書中の脚注をすべて取り出して一覧できれば済むことですが,そうした機能はOpenOfficeのWriterにはありません。そこで,それを実現する「エクスポート・フィルター」を作ることにしました。「エクスポート」とは,前回に述べたとおり,ある文書型で表されるXML文書インスタンスへODFからXSL変換する処理のことで,「エクスポート・フィルター」は,そのスタイルシートのことです。
そのエクスポート・フィルターを作るには,先ず,脚注がどのようにODFで表されているか,を知る必要があります。図3は,図2を表すODFの部分です。前回お話ししましたように,ODF文書を解凍するとその中から目的の「content.xml」が得られます。ODFの部分とは,その一部ということです。ここで,<style:style>要素は「スタイル」を,<text:p>要素は「段落」を,<text:span>要素は「属性付きテキスト」を,<text:note>要素は「脚注」を,<text:note-citation>要素は「脚注番号」を,<text:note-body>要素は「脚注本体」を,<text:list>要素は「リスト」を,<text:list-item>要素は「リスト項目」を,それぞれ表しています。細かな属性の説明は割愛しますが,図2と見比べていただくと,おおよその対応は掴めると思います。
▼図3 図2を表すODFの部分
(略)
<style:style style:name="T31" style:family="text">
<style:text-properties fo:color="#000080" style:font-name="MS Mincho1"
style:font-name-asian="MS Mincho1"/>
</style:style>
(略)
<text:p text:style-name="P35">
<text:span text:style-name="T3">適用される番号付けを見出しが持つ場合,</text:span>
<text:span text:style-name="T31">書式付き番号付け</text:span>
<text:span text:style-name="T37">
<text:note text:id="ftn300" text:note-class="footnote">
<text:note-citation>299</text:note-citation>
<text:note-body>
<text:list text:style-name="Appendix" text:continue-numbering="true">
<text:list-item>
<text:p text:style-name="Footnote">formatted number</text:p>
</text:list-item>
</text:list>
</text:note-body>
</text:note>
</text:span>
<text:span text:style-name="T37">のテキストは,</text:span>
<text:span text:style-name="T44"><text:number></text:span>
<text:span text:style-name="T37">要素に含められうる。そのテキストは,見出しの番号付けを
支持しない応用ソフトウェアで用いられうるが,番号付けを</text:span>
<text:span text:style-name="T31">支持する</text:span>
<text:span text:style-name="T37">
<text:note text:id="ftn301" text:note-class="footnote">
<text:note-citation>300</text:note-citation>
<text:note-body>
<text:list text:style-name="Appendix" text:continue-numbering="true">
<text:list-item>
<text:p text:style-name="Footnote">to support</text:p>
</text:list-item>
</text:list>
</text:note-body>
</text:note>
</text:span>
<text:span text:style-name="T3">応用ソフトウェアでは無視されるだろう。</text:span>
</text:p>
(略)
明らかに,このODFにおいて,<text:p text:style-name="Footnote">要素の内容が「脚注」のテキストであり,<text:span text:style-name="T31">要素の内容が脚注が付けられたテキストです。脚注が付けられたテキストの範囲は,文字色を青色(#000080)にした箇所です。このスタイル指定を入力時に行わないと,その範囲は曖昧になってしまいます。こうした「スタイル」によって「意味」を表す方法は,特別ではありません。例えば,HTML文書における各要素は表示を目的としたものに過ぎず,<h1>要素が「見出し」を,<p>要素が「段落」を意味しているわけではありません。省略時にそのようなスタイルで表示されるというだけのことです。極端な例かもしれませんが,<h1>要素が「氏名」を,<p>要素が「住所」を意味すると考えてもおかしくはないのです。私たちは慣習的に「スタイル」から「意味」を連想しています。言い換えれば,「意味」と「スタイル」は表裏一体の関係にあります。
さて,脚注が付けられたテキストが図3のように<text:span text:style-name="T31">要素の内容に必ず対応するのかが問題になります。つまり,実際にスタイル名(text:style-name属性の値)が「T31」になるのか「T50」になるのか,あるいは幾つかのスタイルに対応するのか,ODFを走査してみないと分からないからです。つまり,それらのテキストのフォントが異なれば,いくつかのスタイル名の異なる<style:style>要素が脚注を表すことになります。したがって,このエクスポート自体は実に単純な処理ですが,複数通りあるかもしれないスタイルについて調べなければならないところが,このフィルター開発の難しさです。そうしたことを考慮したエクスポート・フィルターを図4に示します。なお,紙面の関係から詳細説明は割愛します。
▼図4 エクスポート・フィルター
<?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:k="http://www.jagat.or.jp/xml/oo/MyBook"
office:version="1.0">
<xsl:output method="xml" omit-xml-declaration="no" indent="yes" encoding="UTF-8" />
<xsl:template match="/">
<k:book>
<!-- 脚注が付けられたテキストを区別するスタイル名のリストを得る -->
<xsl:variable name="T">
<xsl:for-each select="//style:style">
<xsl:if test="./style:text-properties[@fo:color = '#000080']">
<xsl:value-of select="@style:name" />,
</xsl:if>
</xsl:for-each>
</xsl:variable>
<!-- 脚注が付けられたテキストかどうかを調べる -->
<xsl:apply-templates select="//text:span">
<xsl:with-param name="t" select="$T" />
</xsl:apply-templates>
</k:book>
</xsl:template>
<!-- 脚注が付けられたテキストと脚注のテキストを出力する -->
<xsl:template match="//text:span">
<xsl:param name="t" />
<xsl:call-template name="fn">
<xsl:with-param name="t" select="$t" />
</xsl:call-template>
</xsl:template>
<!-- 再帰的に呼び出されるテンプレート -->
<xsl:template name="fn">
<xsl:param name="t" />
<xsl:variable name="n">
<xsl:value-of select="substring-before($t,',')" />
</xsl:variable>
<xsl:if test="$n != ''">
<xsl:if test="@text:style-name = $n">
<k:footnote>
<k:no><xsl:value-of select="following::text:note-citation" /></k:no>
<k:text><xsl:value-of select="." /></k:text>
<k:source>
<xsl:value-of select="following::text:p[@text:style-name='Footnote']" />
</k:source>
</k:footnote>
</xsl:if>
<xsl:call-template name="fn">
<xsl:with-param name="t" select="substring-after($t,',')" />
</xsl:call-template>
</xsl:if>
</xsl:template>
</xsl:stylesheet>
このエクスポート・フィルターによって行われたXSL変換の結果を図5に示します。このエクスポート・フィルターを使うことによって,訳語の確認が容易になりました。なお,このXML文書インスタンスをスプレッドシート文書へインポートするには,インポート・フィルターが必要になりますので,そのことは次回にお話しすることにしましょう。この方法は,目次や特定の章の抽出にも応用できますので,ぜひお試しください。
▼図5 XSL変換の結果
<?xml version="1.0" encoding="UTF-8"?>
<k:book xmlns:k="http://www.jagat.or.jp/sgml/oo/MyBook">
(略)
<k:footnote>
<k:no>298</k:no><k:text>見出し番号付け</k:text><k:source>header numbering</k:source>
</k:footnote>
<k:footnote>
<k:no>297</k:no><k:text>リスト体裁</k:text><k:source>list-style</k:source>
</k:footnote>
<k:footnote>
<k:no>299</k:no><k:text>書式付き番号付け</k:text><k:source>formatted number</k:source>
</k:footnote>
<k:footnote>
<k:no>300</k:no><k:text>支持する</k:text><k:source>to support</k:source>
</k:footnote>
<k:footnote>
<k:no>302</k:no><k:text>条件付き体裁</k:text><k:source>conditional-style</k:source>
</k:footnote>
(略)
</k:book>
▲このページのTOPへ