第2章 パッケージ

内容タイプ

[Content_Types].xmlは、パッケージを解凍するとルートに存在するファイルです。

パッケージ内のパーツの内容タイプを定義しています。内容タイプとは、パッケージ内のパーツの属性です。どのパーツがどのような機能を持っているのかを示しています。

WordprocessingMLのパッケージでは、 [Content_Types].xmlファイルの中は次のようになっています。

Wordパッケージの [Content_Types].xml
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <Types xmlns="http://schemas.openxmlformats.org/package/2006/content-types">
    <Default Extension="rels" 
        ContentType="application/vnd.openxmlformats-package.relationships+xml"/>
    <Default Extension="xml" ContentType="application/xml"/>
    <Override PartName="/word/document.xml" 
        ContentType="application/vnd.openxmlformats-officedocument.wordprocessingml.document.main+xml"/>
    <Override PartName="/word/styles.xml"
        ContentType="application/vnd.openxmlformats-officedocument.wordprocessingml.styles+xml"/>
    <Override PartName="/docProps/app.xml"
        ContentType="application/vnd.openxmlformats-officedocument.extended-properties+xml"/>
    <Override PartName="/word/settings.xml"
        ContentType="application/vnd.
                              openxmlformats-officedocument.wordprocessingml.settings+xml"/>
     <Override PartName="/word/theme/theme1.xml"
        ContentType="application/vnd.openxmlformats-officedocument.theme+xml"/>
    <Override PartName="/word/fontTable.xml"
        ContentType="application/vnd.openxmlformats-officedocument.wordprocessingml.fontTable+xml"/>
    <Override PartName="/word/webSettings.xml" 
        ContentType="application/vnd.openxmlformats-officedocument.wordprocessingml.webSettings+xml"/>
    <Override PartName="/docProps/core.xml"
        ContentType="application/vnd.openxmlformats-package.core-properties+xml"/>
    </Types>

Types要素をルートとして、Default要素とOverride要素があります。Default要素はパッケージ内のファイルの拡張子と内容タイプの定義、Override要素はパッケージの各パーツのファイル名とその内容タイプを定義します。

Default要素ではパッケージ内のすべてのパーツの拡張子を定義します。

最もシンプルなリレーションシップの例
<Default Extension="rels" 
  ContentType="application/vnd.openxmlformats-package.relationships+xml"/>
<Default Extension="xml" ContentType="application/xml"/>

サンプルで示したWordprocessingML文書は非常に単純なものです。パッケージ内に存在するファイルは関連付けするためのリレーションシップファイル(拡張子は.rels)と文書パーツ(拡張子は.xml)だけとなります。

Default要素ではExtension属性とContentType属性が必須です。Extention属性にはパッケージに含まれるファイルの拡張子が定義されます。上のサンプルでは、パッケージ内の"rels"、"xml"の2種類が定義されています。ContentType属性はRFC2616で定義されるURIの形式で、Extention属性で示された拡張子を持つファイルの内容タイプを指定します。いずれも空でない属性値を指定する必要があります。

例えばWord文書にJPEG画像を埋め込んだ場合、次のようにDefault要素が追加されます。

Word文書にJPEG画像を埋め込んだときのDefault要素
<Default Extension="jpeg" ContentType="image/jpeg"/>

また、WordprocessingML文書にグラフ(SpreadsheetMLのデータ)がある場合、SpreadsheetMLデータはパッケージそのものが埋め込まれ、次のように“xlsx”の拡張子を定義するDefault要素が追加されます。

WordprocessingML文書にグラフ(SpreadsheetMLのデータ)がある場合
<Default Extension="xlsx" 
  ContentType="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"/>

Override要素にはContentType属性とPartName属性があります。ContentType属性によって内容タイプの種別を表します。PartName属性はパッケージ内のパーツのファイル名です。

たとえば、Wordのメイン文書パーツは以下のように定義されます。

Override要素の例
<Override PartName="/word/document.xml"
  ContentType="application/vnd.openxmlformats-officedocument.wordprocessingml.document.main+xml"/>

「Default要素は拡張子ごとに内容タイプを設定し、Override要素ではファイル単位で扱いを上書きする」と考えるとよいでしょう。上の例ではword/document.xmlは汎用の拡張子.xmlを使用していますが、WordprocessingMLのメイン文書パーツとして扱われる必要があります。そこで「汎用のXML」から「WordprocessingMLのメイン文書パーツ」へと内容タイプの上書きを行っているのです。Override要素では、メイン文書パーツに限らず指定したファイルの内容タイプ定義を上書きできます。

最終的にDefaultとOverrideを組み合わせた結果を評価するため、パッケージ内のファイルすべてをOverride要素で記述した場合、Default要素の記述がなくとも有効です。

ContntType属性の値は、各アプリケーションとパーツの種類によって決まった値を記述します。

WordprocessingML(Word)、SpreadsheetML(Excel)、PresentationML(Powerpoint)のメインパーツのファイル名(カッコ内)と内容タイプ定義は次の通りです。

WordprocessingML

メインパーツ:
メイン文書パーツ(word/document.xml)
内容タイプ定義:

application/vnd.openxmlformats-officedocument.wordprocessingml.document.main+xml

SpreadsheetML

メインパーツ:
ワークブックパーツ(xl/workbook.xml)
内容タイプ定義:

application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml

PresentationML

メインパーツ:
プレゼンテーションパーツ(ppt/presentation.xml)
内容タイプ定義:

application/vnd.openxmlformats-officedocument.presentationml.presentation.main+xml

ファイル名やフォルダ名はOOXML仕様としては固定されていません。本書では簡単のためMS Officeで利用されているフォルダ名、ファイル名を使用します。

パーツのファイル名、フォルダ名

メインパーツのファイル名やフォルダ名については、[Content_Types].xmlによる内容タイプと後述のリレーションシップでの記述によって確定します。この記述については、利用可能な文字や表記方法に制限が存在します。制限についてはISO 29500-2をご覧ください。ファイル名が完全に固定されているのは[Content_Types].xmlのみとなります。ISO 29500-1:2016内の例示では「word/document.xml」のように、Word、Excel、PowerPointの挙動と同様のファイル名、フォルダ名が多用されています。

たとえばWordprocessingMLのメインパーツdocument.xmlのファイル名をdocumentMod.xmlに変更してみましょう。[Content_Types].xmlのPartName属性の値、_rels/.relsで、該当Relationship要素のTarget属性をword/documentMod.xmlに変更することでWord 2019でもWordprocessingML文書として認識されました。また、この変更が不正確なとき破損したファイルとして認識されました。