第3章 WordprocessingML

複合的な文書

WordprocessingMLでほかの文書をパッケージレベルで読み込むにはいくつかの方法があります。

Embedded Object Part、Embedded Package Part

WordprocessingMLが対応している画像以外も、文書に埋め込むことができます。

埋め込みには、バイナリファイルなどをオブジェクトとして埋め込むものと、Office文書(パッケージ)の埋め込みがあります。外部参照も指定できますが、パッケージに含める場合、いずれも物理的なファイルはembeddingsフォルダ内に格納します。

埋め込まれたファイルの扱いはアプリケーションに任されます。埋め込まれたそれぞれのオブジェクトまたはパッケージは、メイン文書上では関連イメージ画像が代わりに表示できる必要があります。

画像ファイルの埋め込み

WordprocessingML文書内に画像ファイルを埋め込んだ場合、インライン要素としてdrawing要素が挿入されます。ここでは、数種類の名前空間に属する要素が使われ、その主なものは以下の通りです。

WordprocessingML仕様に基づきWordで画像を埋め込みしたときの親要素
http://schemas.openxmlformats.org/wordprocessingml/2006/main:drawing
DrawingML仕様に基づく画像データを表わすインライン要素
http://schemas.openxmlformats.org/drawingml/2006/wordprocessingDrawing: inline
画像データそのものはDrawingMLの仕様に沿って記述される。Wordで画像を埋め込んだ場合、インライン要素となる。
DrawingML仕様に基づく画像データ要素
http://schemas.openxmlformats.org/drawingml/2006/main: graphic

画像データは旧ファイル形式であるバイナリや、Word 2003で使われていたWordML(XML)では、画像データはバイナリデータとしてそのまま埋め込まれていました。WordprocessingMLでは画像データは外部ファイルとしてパッケージ内の別フォルダへ保存され、メイン文書であるdocument.xmlには画像のIdとファイル名(埋め込んだ時点での元ファイル名)が記録されています。別フォルダには埋め込んだ時点でのファイル名(元ファイル名)ではなく、異なるファイル名(image1.jpgなど)で保存され、関連付け(document.xml.rels)ファイルにidとそのURIが格納されています。

線画、SmartArtなど

OOXMLでは、WordprocessingML文書での線画やクリップアート、スマートアートなどは、DrawingMLおよびVMLという2種類の描画のためのXML仕様を使って、直接document.xmlに記述されます。

Word 2019で図形(四角)を挿入した場合
<w:document xmlns:v="urn:schemas-microsoft-com:vml"
 xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main">
  <w:body>
    <w:p>
      <w:r>
        <w:pict>
          <v:rect id="_x0000_s1026" style="position:absolute;margin-left:14.15pt;margin-top:25.55pt;width:248.8pt;height:77.6pt;z-index:251658240">
            <v:textbox inset="5.85pt,.7pt,5.85pt,.7pt"/>
          </v:rect>
        </w:pict>
      </w:r>
      ...
    </w:p>
    ...
  </w:body>
<w:document>

この場合、画像データとしてのpict要素の子要素としてVMLのrect要素を使って四角形が定義されています。pict要素はVMLオブジェクトを定義するための親要素です。

スマートアートを挿入した場合
<w:document xmlns:v="urn:schemas-microsoft-com:vml" xmlns:wp="http://schemas.openxmlformats.org/drawingml/2006/wordprocessingDrawing" xmlns:w="...">
  <w:body>
  (省略)
    <w:drawing>
      <wp:inline distT="0" distB="0" distL="0" distR="0">
        <wp:extent cx="5400040" cy="3150235"/>
        <wp:effectExtent l="38100" t="0" r="10160" b="0"/>
        <wp:docPr id="1" name="図表 1"/>
        <wp:cNvGraphicFramePr/>
        <a:graphic xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main">
          <a:graphicData uri="http://schemas.openxmlformats.org/drawingml/2006/diagram">
            <dgm:relIds
             xmlns:dgm="http://schemas.openxmlformats.org/drawingml/2006/diagram"
             xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships"
                                        r:dm="rId4" r:lo="rId5" r:qs="rId6" r:cs="rId7"/>
          </a:graphicData>
        </a:graphic>
      </wp:inline>
    </w:drawing>
  <w:body>
    <w:p>
      <w:r>
        <w:pict>
          <v:rect id="_x0000_s1026" style="position:absolute;margin-left:14.15pt;
                       margin-top:25.55pt;width:248.8pt;height:77.6pt;z-index:251658240">
            <v:textbox inset="5.85pt,.7pt,5.85pt,.7pt"/>
          </v:rect>
        </w:pict>
      </w:r>

このスマートアートは、DrawingMLを使って画像が定義されています。WordprocessingMLで定義されているdrawing要素はDrawingMLオブジェクトを定義するための親要素です。

Excel表の埋め込み

Wordでは文書にExcelファイル(SpreadsheetML文書)を埋め込んでExcelと同じ作業を行うことができます。この場合、Excelのデータは埋め込みデータとしてExcelファイルそのものがWordprocessingML文書パッケージ内に保存されます。

WordへのExcel表の埋め込み
WordへのExcel表の埋め込み

このように、Word文書にExcelワークシートを挿入して、Excelと同じ操作を行うことが可能です。

埋め込まれたExcelオブジェクトのために、wordフォルダ下にembeddingsフォルダが作成されています。word/embeddingsフォルダの内容は、次のようになっています。

この文書のメイン文書パーツではVMLでの表の描画とExcelオブジェクトの定義がされています。

Excelファイルを埋め込んだメイン文書パーツ(document.xml)
<w:document xmlns:o="urn:schemas-microsoft-com:office:office"
                            xmlns:v="urn:schemas-microsoft-com:vml"
                            xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main"
                            > <w:body> (省略) <w:r> <w:object w:dxaOrig="7117"
                            w:dyaOrig="2468"> <v:shapetype id="_x0000_t75"
                            coordsize="21600,21600" o:spt="75" o:preferrelative="t"
                            path="m@4@5l@4@11@9@11@9@5xe" filled="f" stroked="f"> <v:stroke
                            joinstyle="miter"/> 
       <v:formulas> (省略) </v:formulas>
       <v:path o:extrusionok="f" gradientshapeok="t"
                            o:connecttype="rect"/> 
       <o:lock v:ext="edit" aspectratio="t"/>
     </v:shapetype> 
      <v:shape id="_x0000_i1025" type="#_x0000_t75"
                            style="width:356pt;height:123.2pt" o:ole=""> <v:imagedata
                            r:id="rId5" o:title=""/> </v:shape> <o:OLEObject
                            Type="Embed" ProgID="Excel.Sheet.12" ShapeID="_x0000_i1025"
                            DrawAspect="Content" ObjectID="_1243112331" r:id="rId6"/>
    </w:object>
    </w:r>
    ...
  </w:body>
</w:document>

埋め込まれたオブジェクトはobject要素によって表されます。さらに、object要素内でVML(vの名前空間指定子)の要素によって表がシェイプとして描画されています。shapetype要素はシェイプの種別や塗りつぶしなどを定義します。shape要素でシェイプのサイズなどのスタイルを定義しています。

この例では省略しましたが、v:formula要素の中でExcelで使われる関数(数式)が定義されています。

Excelオブジェクトへの参照は、object要素内に参照idが定義されています。

object要素内のExcelオブジェクトへの参照id
<o:OLEObject Type="Embed" ProgID="Excel.Sheet.12" ShapeID="_x0000_i1025"
                                DrawAspect="Content" ObjectID="_1243112331" r:id="rId6"/>

このとき、メイン文書パーツの関連付けファイルには次のようにExcelファイルのURIが追記されています。

関連付けファイルでSpreadsheetMLパッケージURIの追記
<Relationship Id="rId6"
  Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/package"
  Target="embeddings/Microsoft_Office_Excel_______1.xlsx"/>

Attached Document Template

Document Templateは、テンプレートとしてほかのWordprocessingML文書を参照する機能です。文書の内容ではなく、スタイルやナンバリング定義を参照します。

Wordでは「ファイル」の「新規」で文書を作成するときにテンプレートを選択できます。

Wordでテンプレートから新規文書を作成する
Wordでテンプレートから新規文書を作成する

テンプレートから作成した文書を保存し、XMLを確認してみましょう。

document.xmlの内容などが埋まっていますが、記述内容は通常のWordprocessingMLと変わりありません。

違いがあるのは設定パーツです。

settings.xml
<w:settings ... xmlns:w="..." ...>
    ...
    <w:attachedTemplate r:id="rId1"/>
    ...
</w:setting>
_rels/settings.xml.rels
<Relationships ...>
    <Relationship Id="rId1" Type=".../relationships/attachedTemplate" Target="..." TargetMode="External"/>
</Relationships>

Relationshipに外部テンプレートとするWordprocessingMLを指定し、設定パーツで参照します。attachedDocumentTemplagte要素で関連付けのIDを指定することで、参照した文書が読み込まれます。

サンプルとして使用したdocxファイルでは、TargetにはWordで設定されたフォルダ内のdotxファイルが指定されていました。dotxはWord 2019では保存形式「Wordテンプレート」を選択したときの拡張子です。dotxファイルのことをWordはテンプレートとして認識します。しかし、WordprocessingML文書としては通常の文書と変わらず、このファイルを読み込む側に特殊な記述がある、ということになります。

設定パーツでlinkStyles要素のval属性にtrueを指定すると、参照先のdotxファイルで変更があったとき、参照している文書にもこの変更が反映されます。

マスター文書とサブ文書

あるWordprocessingML文書に他のWordprocessingML文書を含め、まとめて扱うことが可能です。このとき、主体となる文書をマスター文書(Master Document)、参照される文書をサブ文書(Sub Document)と呼びます。

Word 2019では、「表示」から「アウトライン」を選択し、「グループ文書」からサブ文書の作成、または既存の文書をサブ文書として挿入ができます。

サブ文書を挿入してアウトラインの表示
サブ文書を挿入してアウトラインの表示

メイン文書(word/document.xml)にsubDoc要素を記述することで、マスター文書として扱われます。

サブ文書の対応を記述する関係付けファイル(_rels/document.xml.rels)
<Relationships xmlns="…">
<Relationship Id="rId5"
  Type="http://…/subDocument"
  Target="Start.docx" TargetMode="External"/>
マスター文書のメイン文書パーツ(document.xml)
<w:document ...>
    <w:body>
        ...
        <w:p ...>
            <w:pPr>
                ...
            </w:pPr>
            <w:r>
                <w:rPr>
                    ...
                </w:rPr>
                <w:t>これはメインドキュメントの文章です。</w:t>
            </w:r>
        </w:p>
        <w:p ...>
            <w:pPr>
                ...
            </w:pPr>
            <w:subDoc r:id="rId5"/>
        </w:p>
        ...
    </w:body>
</w:document>
document.xml.rels
<Relationships ...>
    ...
    <Relationship Id="rId5" Type=".../relationships/subDocument" Target="subDoc.docx" TargetMode="External"/>
    ...
</Relationships>

subDoc要素を記述し、外部のサブ文書を参照しています。

スタイル、書式の適用順序

マスター文書とサブ文書のスタイル、書式の適用順序についてはISO/IEC 29500仕様には言及がありません。これらについてWordの挙動に近いものを実装する場合、ECMA 376を参照することになります。

まず、サブ文書に直接記述されたスタイルは保持されます。次に、サブ文書中のそれぞれのスタイルは、マスター文書に同名のスタイル定義があれば、マスター文書のものを優先します。マスター文書に存在しない名前のスタイル定義があるとき、マスター文書へそのスタイル定義を追加します。また、複数のサブ文書で同名のスタイル定義が存在するとき、先にインポートされたサブ文書のスタイルが適用され、他は無視されます。

ナンバリング定義については記述がなく、番号付きリストを含むサブ文書をマスター文書からWord 2019で確認すると、検証環境では番号は連番を指定していても独立して扱われていました。

埋め込みとサブ文書

埋め込みとサブ文書の違いとしては次の2点があります。まず、サブ文書として指定可能なのはWordprocessingML文書だけとなります。

そして、埋め込みでは埋め込まれた文書の扱いは独立していますが、サブ文書ではマスター文書からスタイルなどの挙動が決定されています。