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


↑Get! NeoCore!


↑ITスキルを
のばすなら


↑XMLのことなら

↑セミナー開催
NeoCoreXMS/Xpriori


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



2008年5月15日 更新


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

著者:岸 和孝(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 共通スタイルで指定した文書の例

▼表1 スタイルと内容
スタイル名内容ODF要素
Titleタイトルp
Subtitle副題p
Contents Heading(目次)目次index-body/index-title/p
Contents 1→P1(目次)見出し1index-body/p
Contents 2→P2(目次)見出し2index-body/p
Contents 3→P3(目次)見出し3index-body/p
Heading 1見出し1h
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見出し2h
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ボキャブラリの世界




  探検 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.