XMLDB.jp

XML技術
HOME  >  XML技術  >  探検 XMLボキャブラリの世界 第16回

探検 XMLボキャブラリの世界 第16回

第16回:オフィス文書のボキャブラリ ~ODF(その5)~
2008年5月15日 更新


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


前回は,OpenOfficeのXMLボキャブラリであるOpenDocument Format(ODF)の仕様書を和訳する作業で訳語の確認に用いている手法についてお話ししました。先ずテキスト文書から訳語データをエクスポート(輸出)し,次にそれをスプレッドシート文書へインポート(輸入)しました。その処理を行うフィルターでは,意味を持たせたスタイルの名前を参照してODF要素を扱いました。今回は,いよいよスタイルそのものの話です。


スタイルの指定

OpenOfficeのWriterでは,スタイルの指定は既存のスタイルをメニューから選んで指定するか,任意のスタイルを段落または文字の単位で指定するか,のいずれかです。つまり,その操作は従来のオフィス・スイートとほとんど変わりません。そうした操作を前提として,ODFにおけるスタイルの種類は,共通スタイルと自動的スタイルに大別されます。


共通スタイルは,あらかじめODFの要素の中で定義されたものです。参照した共通スタイルのフォントやインデントなどが変更された際は,その共通スタイルは変更されないで,その共通スタイルに上書きされるスタイルとして要素が生成されます。それが自動的スタイルです。


既存の共通スタイルで指定した文書の例を図1に示します。そのスタイルと内容の関係を表1に示します。ここで,すべてのスタイルを説明することは紙面の関係からできませんので,図1の5行目にある「本文(2)」に注目することにします。これは,要素の共通スタイル「Text body」のフォント寸法を変更しましたので,自動的スタイル「T1」が生成されています。図1の8行目にある「リストの内容(2)」も同様です。ODFにおけるこの部分を図2に示します。ここで,共通スタイル「Text body」と自動的スタイル「T1」は,図3のようになります。なお,OpenOfficeのユーザーインターフェースとして,共通スタイルの名前は表示されますが,生成された自動的スタイルの名前は表示されません。


▼図1 共通スタイルで指定した文書の例

voc16-fig1.png


▼表1 スタイルと内容

スタイル名 内容 ODF要素
Title タイトル p
Subtitle 副題 p
Contents Heading (目次)目次 index-body/index-title/p
Contents 1→P1 (目次)見出し1 index-body/p
Contents 2→P2 (目次)見出し2 index-body/p
Contents 3→P3 (目次)見出し3 index-body/p
Heading 1 見出し1 h
Text body 本文(1) p
Text body→T1 本文(2) p
Footnote 脚注(1) note
List Heading リストの見出し p
List Contents リストの内容(1) p
List Contents→T2 リストの内容(2) p
Heading 2 見出し2 h
Text body 本文(3) p
Text body 本文(4) p
Footnote 脚注(2) note
Table 図表番号 p
Table Contents 表の内容(1) table/table-row/table-cell/p
Table Contents 表の内容(2) table/table-row/table-cell/p
Text body 本文(5) p
注:→印の右側は,共通スタイルに対する自動的スタイルの名前を示す。

▼図2 共通スタイルが変更された部分(ODF)

<text:h text:style-name="Heading 1" text:outline-level="1">見出し1</text:h>
<text:p text:style-name="Text body">本文
  <text:note text:id="ftn1" text:note-class="footnote">
    <text:note-citation>1</text:note-citation>
    <text:note-body>
      <text:p text:style-name="Footnote">脚注(1)</text:p>
    </text:note-body>
  </text:note>
  (1)

</text:p>
<text:p text:style-name="Text body">
  <text:span text:style-name="T1">本文</text:span>
  (2)
</text:p>
<text:p text:style-name="List Heading">リストの見出し</text:p>
<text:p text:style-name="List Contents">リストの内容(1)</text:p>
<text:p text:style-name="List Contents">
  <text:span text:style-name="T2">リストの内容</text:span>
  (2)
</text:p>

▼図3 共通スタイルと自動的スタイルを表す部分(ODF)

<office:styles>
    (略)
  <style:style style:name="Standard" style:family="paragraph" style:class="text"/>
  <style:style style:name="Text body" style:display-name="Text body" 
               style:family="paragraph" style:parent-style-name="Standard" style:class="text">
    <style:paragraph-properties fo:margin-top="0cm" fo:margin-bottom="0.212cm"/>
    <style:text-properties style:font-name="MS Mincho" style:font-size-asian="10.5pt"/>
  </style:style>
    (略)
</style:style>
<office:automatic-styles>
    (略)
  <style:style style:name="T1" style:family="text">
    <style:text-properties fo:font-size="16pt" style:font-size-asian="16pt" 
                           style:font-size-complex="16pt"/>
  </style:style>
    (略)
</office:automatic-styles>

内容とスタイルの分離

このようにして,ODFでは内容とスタイルが分離された形で表されます。この方法は,HTMLにおける段階スタイルシート(CSS)に似ています。CSSは,図4のように独特の構文で表されるのに対して,ODFのスタイルはXML構文で表されます。ちなみにXSLのフォーマッティング・オブジェクト(XSL FO)では内容とスタイルは,図5のように一体化した形で表されます。ODFがスタイルが動的に変更されることに対応するようになっているのに対して,XSL FOは最終出力を表すためにスタイルが固定的であることから,こうした違いになったのでしょう。CSSが独特の構文になったのもスタイルが動的に変更されないせいかもしれません。


▼図4 段階スタイルシートにおけるスタイル指定

<STYLE TYPE="text/css">
    (略)
  P.T1 { margin-top:0cm;margin-bottom:0.212cm;font-family:"MS 明朝";font-size:16pt; }
    (略)
</STYLE>

▼図5 図1の「本文(2)」を表す部分(XSL FO)

<fo:block margin-top="0cm" margin-bottom="0.212cm" font-family="MS 明朝" font-size="10.5pt">
  <fo:inline font-size="16pt">本文</fo:inline>
  (2)
</fo:block>

ODFにおけるスタイル指定の属性はきわめて多く,現在,ODF仕様書を訳しながら,どのように整理すべきか思案しているところです。とりわけ仕様書におけるスタイルの説明には図解が少なく,あるスタイルがどのように表示されるかを想像することが実際に困難です。そこで(英語版ですが)文書作成者のための操作説明書を参考にしています。その操作説明書はOpenOfficeのヘルプよりも詳しいので参考になると思います。


ODFのRelax-NGスキーマ

さて,前々回と前回にお話しした脚注の取り出しと同様に,ODFを定義するRelax-NGスキーマをODFの仕様書からスタイル名を参照して取り出すBasicマクロ[図6を参照]を作りましたので,参考までに掲載します。なお,この処理はエクスポート・フィルターに比べてかなり遅く,マクロとフィルターの使い分けの一指針となるでしょう。ちなみに,ODFのRelax-NGスキーマは単独ではサイト上にはなく,仕様書の中に含まれているものだけのようです。それは何と約1万8000行もあります。マクロやフィルターの役割が実感できる一例です。


▼図6 指定したスタイルを持つ段落の内容を取り出すためのBasicマクロ

Sub ExportDataWithStyle 
  Dim Path    As String
  Dim Style   As String
  Dim FA      As Object
  Dim O       As Object
  Dim OS      As Object
  Dim Doc     As Object
  Dim Cursor  As Object
  Dim Proceed As Boolean

  Path  = "odf.xsd"  ' この場合は,ルートの「odf.xsd」へ出力する
  Style = "RelaxNG"  ' この場合は「RelaxNG」を検出する
  FA = createUnoService("com.sun.star.ucb.SimpleFileAccess") 
  O  = createUnoService("com.sun.star.io.TextOutputStream")
  OS = FA.openFileWrite(Path)
  OS.truncate() 
  O.setOutputStream(OS) 
  Doc    = ThisComponent
  Cursor = Doc.Text.createTextCursor
  Cursor.gotoStart(True)
  Do 
    Cursor.gotoStartOfParagraph(false) 
    Cursor.gotoEndOfParagraph(true) 
    If (Cursor.ParaStyleName = Style) Then
      O.writeString(Cursor.getString() & chr(10))
    End IF 
    Proceed = Cursor.gotoNextParagraph(False)
  Loop While Proceed
  O.closeOutput()
End Sub

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




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


▲このページのTOPへ

  • 無償で使える!XMLDB「NeoCore」
  • サイバーテック求人情報
  • メールマガジン申し込み
  • TEchScore

  • ▲NeoCoreについて記載されています!

  • ▲XMLマスター教則本です。試験対策はこれでばっちり!
Copyright (c) CyberTech corporation ltd. All ights Reserved. | サイバーテックについて | ご利用ガイド