はじめに
第1章 Office Open XMLとは
第2章 導入(HelloWorld)
第3章 基本構造
第4章 文章(WordprocessingML)
第5章 描画(DrawingML)
第6章 互換性と拡張性
付録
本書はOffice Open XML(以降、OOXML)を扱うときのとっかかりになることを目標にしている。そのため、本書を読めばOOXMLのすべてを理解できるわけではないことを前もってお伝えする。そもそも、ISOやECMAで公開されている公式の仕様書を真正面から読み始めるには数千ページにおよぶPDFが精神的なハードルを上げてくる。そこで、OOXMLを読み解く上で必要最低限な情報と著者が過去に苦労した部分をピックアップして解説している。
OOXMLは、ざっくりと言えばZIPで固められたXMLファイルの集合だ。一般的なコンピューターシステムであれば当たり前に提供されている機能を使用して取り扱うことが容易にできる仕組みだ。本書ではXML内で使用される要素(タグ)について解説しつつ、それらのリファレンスだけを見ても分かりづらい内容を中心にまとめている。そのため、要素ひとつひとつの詳しい説明はISOやECMAの仕様書を参照することをお勧めする。ただ、どのような仕様書があり、どのあたりにどのような情報が書かれているかをまとめているため、OOXMLの内容以前の手がかりを得られる本になっている。
いろいろと書き連ねたいこともあるが、本書が仕様書の膨大な情報によってそびえ立つ壁を乗り越えるきっかけになればと願っている。
対象仕様・動作確認環境
本書の内容は次の仕様と環境で確認している。
・対象仕様:ECMA-376第5版(Part2のみ第4版)のStrict版
・確認環境:Microsoft Office 365 Version 1905(Office 2019相当)
サンプルデータ
本書で使用するサンプルコードは次のGitHubリポジトリーよりダウンロードして活用してほしい。
https://github.com/ioriayane/OfficeOpenXmlFormatGuide
注意
本章でOffice Open XMLに関連する英語を和訳する場合、Microsoft Officeのユーザーインターフェースで使用されている言葉を可能な限り採用する。
また、紙面の都合でサンプルのXMLを適当な位置で改行しているが、XML的に不正な状況になっている場面もある。その場合は、不要な改行がないものとして扱ってほしい。なお、ダウンロードできるサンプルデータに不要な改行はない。
本章では、OOXMLについての概要や情報の入手元などについて述べる。
OOXMLとは、主にMicrosoft Office(以降、MS Office)で使用されているファイルフォーマットである。XMLをベースにしたファイル群がZIP形式で圧縮されている。MS Office 2003まではバイナリ形式だったものが、XMLを使用したテキスト形式かつ仕様が国際標準となった。そのため、誰でもMS Officeが扱うファイルを読み書きできるようになった。つまり、個人レベルのプロダクトでもMS Officeのインストール状況に関係なくdocxやxlsx、pptxファイルが扱えるのである。そもそも、MS Officeのファイルを扱うオープンソースプロダクト「Apache POI」の存在自体が、国際標準になった意義の大きさを示しているのではないだろうか(MS Officeのファイルを使用すること自体について望む望まないの問題は置いておくが……)。
さて、OOXMLとしてサポートしている主な形式はワードプロセッサ、スプレッドシート、プレゼンテーションの3種類となる。MS Officeシリーズとしてはいくつかのアプリケーションが存在するが、WordとExcelとPowerPointが対象となる。OOXMLではそれぞれのドキュメントの特性にあった異なるデータ構造が定義がされている。しかし、XMLファイル自体を管理するためのプラットフォーム的な仕様やドキュメント内で使用する共通要素(図や数式など)もあり、近い概念で扱えるようになっている。
OOXMLの仕様には「Strict」と「Transitional」の2種類が存在する。MS Officeとしては基本的にStrict版の読み書きに対応することでISOに準拠1している体をとっているが、大抵のユーザーが日常的にMS Officeで利用しているファイル形式はTransitional版になる。過去の製品(Office 2003以前)との互換性を維持するためだ。つまり、Strict版はTransitional版のサブセットとなる。
なお、MS Officeのファイルを保存するときのファイル形式を次から選択するとStrict版になる。
・Word:完全 Open XML ドキュメント(*.docx)
・Excel:Strict Open XML スプレッドシート(*.xlsx)
・PowerPoint:完全 Open XML プレゼンテーション(*.pptx)
OOXMLの仕様は2006/12にECMA-376として標準化され、2008/11にISO/IEC 29500として公開された。公開後に数回の更新が行われ現在の仕様は次の4編に分かれている。
・Part1 : Fundamentals and Markup Language Reference
OOXMLの基本やStrict版の仕様についてを定義。各ドキュメント(ワープロ・スプレッドシート・プレゼンテーション)におけるデータ構造、要素や属性のリファレンスなど
・Part2 : Open Packaging Conventions
ドキュメントファイル(*.docxや*.xlsxや*.pptx)としてXMLファイルやリソースをパッケージングするための仕様を定義。どのファイルに何が書かれているかの定義やリソースの関連付け方法、デジタル署名など
・Part3 : Markup Compatibility and Extensibility
将来の仕様変更にそなえて互換性の維持方法などを定義。ドキュメントをどのように作成するべきか、読み込むべきかなど
・Part4 : Transitional Migration Features
Trasitionalとして追加されている仕様についての定義
また、次の表のとおりMS Officeのバージョンアップに合わせて更新されていっている。ECMA-376の第2版以降はタイミングに若干のバラツキはあるものの基本的にISO 29500とセットで更新されている。
年 | 月 | リリース内容 | 対応Office |
2006 | 12 | ECMA-376第1版 | Office 2007 |
2008 | 11 | ISO/IEC 29500第1版 | Office 2008 |
|
12 | ECMA-376第2版 |
|
2011 | 06 | ECMA-376第3版 | Office 2010 |
|
08 | ISO/IEC 29500第2版 |
|
2012 | 09 | ISO/IEC 29500第3版 | Office 2013 |
|
12 | ECMA-376第4版 |
|
2015 | 07 | ISO/IEC 29500第4版(Part3のみ) | Office 2016 |
|
12 |
ECMA-376第5版(Part3のみ) ※注:Part3の第5版のPDFにはしおりが設定されておらず、非常に見づらい。他のPartや第4版にはしおりが設定されている。 |
|
2016 | 11 | ISO/IEC 29500第4版(Part1, 4のみ) |
|
|
12 | ECMA-376第5版(Part1, 4のみ) |
|
仕様書は次のECMAとISOのWebサイトで入手可能だ。
ECMAより
・Standard ECMA-376 Office Open XML File Formats
https://www.ecma-international.org/publications/standards/Ecma-376.htm
ISOより
・ISO/IEC 29500-1:2016
https://www.iso.org/standard/71691.html
・ISO/IEC 29500-2:2012
https://www.iso.org/standard/61796.html
・ISO/IEC 29500-3:2015
https://www.iso.org/standard/65533.html
・ISO/IEC 29500-4:2016
https://www.iso.org/standard/71692.html
なお、ISO版はアクセスするとわかるが「ISO/IEC Information Technology Task Force (ITTF)」でダウンロード可能となっている。
・ITTF
https://standards.iso.org/ittf/PubliclyAvailableStandards/index.html
また、ITTFからダウンロードする際は「Electronic inserts」のリンクで示されるファイルもダウンロードしないとスキーマ定義ファイルなど仕様書以外の添付資料が入手できないため、注意してほしい。ECMA-376の方はPartごとにファイルがセットになっている。
すべてを解説はできないが、仕様書とセットで入手できるファイルについて紹介する。なお、ファイル名はECMA-376基準である。
・ECMA-376, Fifth Edition, Part 1 - Fundamentals And Markup Language Reference.zip
・Ecma Office Open XML Part 1 - Fundamentals And Markup Language Reference.pdf
OOXMLの基本的なことやStrict版の仕様について記載
・OfficeOpenXML-DrawingMLGeometries.zip
プリセットの図形やワードアートの描画方法を定義したファイル一式(*.xml)。仕様書のAnnex H.にも記載されているがサンプル扱いとなっている
・OfficeOpenXML-RELAXNG-Strict.zip
RELAX NGの短縮構文で書かれたスキーマ定義ファイル一式(*.rnc)。仕様書のAnnex B.にも記載されている。ただし、XML Schemeから自動生成されており、もし、XML Schemeと矛盾する場合は、そちらが優先される
・OfficeOpenXML-SpreadsheetMLStyles.zip
SpreadsheetMLで使用するスタイル定義ファイル一式(*.xml, *.xlsx)。表とセルとピボットテーブルのスタイルが対象。仕様書のAnnex G.に具体的な見た目の見本もあり
・OfficeOpenXML-WordprocessingMLArtBorders.zip
WordprocessingMLで使用するアート枠線の画像ファイル一式(*.png)。仕様書のAnnex F. にも記載されており、リンクを辿るとサンプルも含めた具体的な説明あり
・OfficeOpenXML-XMLSchema-Strict.zip
XML Schemeで記述されたスキーマ定義ファイル一式(*.xsd)。仕様書のAnnex A.にも記載されており、対応するxsdファイル名も記載あり。次は代表的なファイル
-wml.xsd(WordprocessingML)
-sml.xsd(SpreadsheetML)
-pml.xsd(PresentationML)
-dml-main.xsd(DrawingML)
-ECMA-376, Fourth Edition, Part 2 - Open Packaging Conventions.zip
・Ecma Office Open XML Part 2 - Open Packaging Conventions.pdf
ドキュメントに含めるファイルの構成方法について記載
・OpenPackagingConventions-RELAXNG.zip
RELAX NGの短縮構文で書かれたドキュメントパッケージング用のスキーマ定義ファイル一式(*.rnc)
・OpenPackagingConventions-XMLSchema.zip
XML Schemeで記述されたドキュメントパッケージング用のスキーマ定義ファイル一式(*.xsd)
・ECMA-376, Fifth Edition, Part 3 - Markup Compatibility and Extensibility.zip
・Ecma Office Open XML Part 3 - Markup Compatibility and Extensibility.pdf
互換性を意識したドキュメントの作り方、読み方について記載
・ECMA-376, Fifth Edition, Part 4 - Transitional Migration Features.zip
・Ecma Office Open XML Part 4 - Transitional Migration Features.pdf
Transitional版の仕様について記載
・OfficeOpenXML-RELAXNG-Transitional.zip
RELAX NGの短縮構文で書かれたスキーマ定義ファイル一式(*.rnc)
・OfficeOpenXML-XMLSchema-Transitional.zip
XML Schemeで記述されたTransitionalのスキーマ定義ファイル一式(*.xsd)。Strictとの大きな差として「vml-*.xsd」ファイルが存在
ECMA-376のWebサイトでOOXMLの概要についてまとめたドキュメントがダウンロードできる。
ファイル名:OpenXML White Paper.pdf
このドキュメント自体は第1版のときに書かれたもののようだが2、重要なポイントをざっと参照するには丁度良いだろう。
または、仕様書Part1の次の章が入門となっている。
Annex L. (informative) Primer
まず、仕様書に書かれているアプリケーションのOOXMLへの適合性3について紹介する。
・読み込みにおいて適合したドキュメントを拒否してはいけない
・書き出しにおいて適合したドキュメントを作成できなければならない
・ただし、OOXMLで定義された仕様に矛盾しないかぎり、そのすべてに対応しなくても良い
1番目と2番目を見ると少し気負ってしまうかもしれない。しかし、3番目を見て安心していただけただろう。
例えば、Wordファイルから著者名を取得してくるアプリケーションを作成する場合、著者名が記述された場所を特定するために必要な機能にのみ正確に対応していれば、他を無視しても良い。逆にWordファイルを生成するアプリケーションは、ドキュメントとして成立する最低限の機能に対応していれば、他を無視しても良い。当たり前の内容ではあるが、使いたい機能についてしっかりと理解して使っていればOKということだ。
ちなみに、Excelであれば計算式や外部ドキュメント参照に対応しなくても結果のキャッシュが保存されているため、読み込みだけで良ければ問題になることは少ないだろう。ただし、Excelの再計算機能を手動にしているドキュメントは問題になる可能性がある。
とは言え、ワープロやスプレッドシートやプレゼンテーションのドキュメントを自由に編集するアプリケーションとなると事情が変わってくるのは想像に難くない。繰り返しになるが、あまり使用しない機能は省略しても良いし、限られた範囲から作っていくことが普通の流れだろう。たゆまぬ努力の先には素晴らしいアプリケーションの完成が待っているはずである。
本章ではOOXMLに慣れてもらうため、技術書で定番のHelloWorld的なドキュメントで基本的な部分を解説する。ワードプロセッサ・スプレッドシート・プレゼンテーションをテキストエディターでもできるレベルに調整した最小構成サンプルを使用する。厳密にはZIP圧縮できるソフトが必要となるが、今どきWindowsでも標準状態で可能なためあえて言及しない。
また、最小構成と述べたが、OOXMLのドキュメントとして成立する最小構成ではない。本当の最小構成にすると内容がまったくない寂しい状態になってしまい導入での説明にしても不十分なため、少し増やしている。必要最低限と言ったところだ。
なお、ワードプロセッサ→スプレッドシート→プレゼンテーションの順番にデータ構造(ファイル構成)が少しずつ複雑になり、OOXMLらしい説明が増えていく。
WordprocessingMLのサンプルデータを次のフォルダーに用意した。サンプルの出来上がりは図2-1のとおりだ。
サンプルフォルダー:HelloWorld\WordprocessingML
出来上がり見本:HelloWorld\WordprocessingML.docx
次の3つのファイルを作成し、順番に解説する。
・[Content_Types].xml
・_rels\.rels
・document.xml
最初に[Content_Types].xmlについて解説する。このファイルはドキュメント内に含まれるすべてのファイルがそれぞれどのような役割(本文や画像など)を担っているかを定義する。
なお、コンテンツタイプとして定義されていないファイルがドキュメント内(ZIPファイル内)に紛れ込んでいるとMS Officeでは不正なファイル扱いとなる。後述するが、OOXMLは役割ごとにファイルを分けることになっているため、それらのファイルを追加したときにコンテンツタイプとして登録を忘れないようにしてほしい。
コンテンツタイプを定義するファイル[Content_Types].xmlの名称は固定となっており、かつ、このファイルが置かれるフォルダーがドキュメントのルートとなる。
具体的にはリスト2-1のようにTypes要素の配下でDefault要素とOverride要素の2種類を用いてコンテンツタイプを定義する。各要素の説明は表2-1のとおりだ。
<?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"/>
<Override PartName="/document.xml"
ContentType="application/vnd.openxmlformats-
officedocument.wordprocessingml.document.main+xml"/>
</Types>
要素名 | 説明/属性 |
Types |
[Content_Types].xmlのルート要素 名前空間にはXML Schemeでターゲット指定されている値を指定する。詳細な定義は仕様書Part2の「Annex D.(normative) Schemas - W3C XML Schema」か添付の「opc-contentTypes.xsd」を参照 |
Default |
拡張子単位でコンテンツタイプを設定 ・Extension(必須) 拡張子を指定 ・ContentType(必須) コンテンツタイプを指定。MIMEタイプのようなものでOOXML特有のものはリスト2-1のように固有な値になるが、画像や任意の内容のテキストファイルなどは次のように一般的に使用されている値を使用する 例: JPEG:image/jpeg/TXT:text/plain |
Override |
拡張子単位(Default要素)で定義された内容をファイル単位で設定(上書き)。ファイル単位で設定するとDefault要素がなくても有効な情報となる ・PartName(必須) 対象ファイルの場所と名前を設定。ルートフォルダー([Content_Types].xmlのあるフォルダー)からの絶対パスで記述 ・ContentType(必須) Default要素と同様 |
Default要素でドキュメント間の参照関係を定義するためのファイルとして拡張子「.rels」を定義する(内容は「2.1.2ドキュメントルートの参照関係の定義」で解説)。OOXMLではお約束の定義となる。
サンプルにはないが、他にも画像など一般的なものはDefault要素を使って簡潔に定義していく。
OOXMLでは「xml」という汎用的な拡張子を使用するため、WordprocessingML固有の情報を含むファイルとしてOverride要素を使用して本文ファイルを定義する。
また、Override要素の名前どおりの使い方としてはリスト2-2のようにもできる。
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Types xmlns="http://schemas.openxmlformats.org/package/2006/content-types">
<Default Extension="pict" ContentType="image/jpeg"/>
<Override PartName="/hoge/foo.pict" ContentType="image/png"/>
</Types>
拡張子「pict」はJPEGファイルとして扱うが、特定のファイルだけPNGファイルとして扱うように定義している例だ。
ワードプロセッサの本文などOOXMLの構成パーツは決まった単位でファイルに分割されている。それらのファイル(XML)から参照関係(本文から画像、本文からスタイル情報のような参照)にあるファイルの場所を示す必要がある。そこで、参照関係を示すファイルとして「参照定義ファイル(*.rels)」を作成する。
ただし、例外としてドキュメントルートだけは元になる構成パーツがなくても作成しなければならない。
参照定義ファイルを作成するときのルールは次のふたつだ。
・参照元になるファイルと同じフォルダーに「_rels/hoge.xml.rels」の命名規則で作成(例:「/document.xml」に対しては「/_rels/document.xml.rels」)
・ドキュメントルートは「/_rels/.rels」固定
このサンプルでは、本文(document.xml)からの参照はなくドキュメントルートのみであるため、作成する参照定義ファイルはリスト2-3の1ファイルのみになる。使用する要素の説明は表2-2のとおりだ。
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Relationships
xmlns="http://schemas.openxmlformats.org/package/2006/relationships">
<Relationship Id="rId1"
Type="http://purl.oclc.org/ooxml/officeDocument/
relationships/officeDocument"
Target="document.xml"/>
</Relationships>
要素名 | 説明/属性 |
Relationships |
参照定義ファイル(*.rels)のルート要素 名前空間にはXML Schemeでターゲット指定されている値を設定。詳細な定義は仕様書Part2の「Annex D.(normative) Schemas - W3C XML Schema」か添付の「opc-relationships.xsd」を参照 |
Relationship |
拡張子単位でコンテンツタイプを定義 ・Id(必須) 識別子。ファイル単位で一意であれば良い(厳密にはRelationships要素の配下内だが、結果的にファイル単位)。明示的に参照先にアクセスするときに使用するが、Type属性を使用して参照関係にあるファイルを探しにくる場合もあるため、必ずしも使用するとは限らない ・Type(必須) 参照先に応じたURIを設定。コンテンツタイプとは違うため注意 ・Target(必須) 参照先へのURIか相対パスを設定。基準は参照元になるファイルとなる 相対パスの例: 次のファイル構成のとき /word/document.xml /word/_rels/document.xml.rels /images/image1.jpg document.xmlがimage1.jpgを参照する場合は次のとおり Target="../images/image1.jpg" ・TargetMode(任意) 参照先がドキュメントの内部にあるか外部にあるかを設定 Internal:内部(デフォルト)/External:外部 |
このサンプルでは本文への参照定義のみだが、実際には複数のファイルへの定義が並ぶことになる。外部ファイルを参照する場合は、TargetMode属性のつけ忘れに注意したい。
ちなみにドキュメントルートの参照定義に並ぶファイルの候補は表2-3のとおりだ。
構成パーツ | ファイル名の例 | 備考 |
Main Document | word/document.xml | WordprocessingMLのみ |
Workbook | xl/workbook.xml | SpreadsheetMLのみ |
Presentation | ppt/presentation.xml | PresentationMLのみ |
Digital Signature Origin | _xmlsignatures/origin.sigs | 共通 |
File Properties, Extended | docProps/app.xml | 共通 |
File Properties, Core | docProps/core.xml | 共通 |
File Properties, Custom | docProps/custom.xml | 共通 |
Thumbnail | docProps/thumbnail.jpg | 共通 |
OOXMLには様々な構成パーツが存在しており、その情報を「3.1構成パーツと関係性」にまとめている。表2-3に登場するパーツ以外は本文・ワークブック・プレゼンテーションのいずれかを起点とした構造の中にだけ登場する。
いよいよ本文を定義する。「Hello World!」の文字を中央寄せかつ太字にする。内容はリスト2-4で、使用している要素の解説は表2-4のとおりだ。
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<w:document xmlns:w="http://purl.oclc.org/ooxml/wordprocessingml/main"
w:conformance="strict">
<w:body>
<w:p>
<w:pPr>
<w:jc w:val="center"/>
</w:pPr>
<w:r>
<w:rPr>
<w:b/>
</w:rPr>
<w:t>Hello World!</w:t>
</w:r>
</w:p>
</w:body>
</w:document>
要素名 | 説明/属性 |
document |
本文のルート要素(Document):名前空間にはXML Schemeでターゲット指定されている値を指定。詳細な定義は仕様書Part1の「Annex A.(normative)Schemas – W3C XML Schema」か添付の「wml.xsd」を参照 ・conformance(任意) 仕様への適合性を設定 strict:Strict版/transitional:Transitional版(デフォルト) |
body | 本文の本体要素(Document Body):この配下に複数の段落(p要素)などを持つ |
p | 段落(Paragraph):文章を管理する基本単位であり、WordprocessingMLにおけるデータ構造の基本でもある。body要素の配下に兄弟の関係でいくつも配置できる |
pPr | 段落プロパティー(Paragraph Properties):段落全体に対しての書式設定などを行う |
jc |
段落アライメント(Paragraph Alignment):段落をページ(表示領域)内での表示位置を設定 ・val(必須) 表示位置を示す値を設定。ST_Jcで定義される次の値を使用。アラビア文字などのための設定もあるため、設定値に左右(right/left)はない both:均等割り付け center:中央寄せ end:右寄せ(右から左への記述設定では左寄せ) start:左寄せ(右から左への記述設定では右寄せ) |
r | ラン(Text Run):段落内の文字列を含む。段落内を部分的に装飾したい場合はr要素を分割 |
rPr | ランプロパティー(Run Properties):ランの範囲に対しての書式設定 |
b | 太字(Bold):同一r要素の配下に太字を設定 |
t |
文字列(Text):段落内の文字列を設定。この要素の中が本文(の一部)として画面に表示され、印刷される ・xml:space(任意) ホワイトスペースの取り扱いを設定。XML 1.0におけるホワイトスペースの取り扱いと同様 default:アプリケーション次第/preserve:維持する |
OOXML内のXMLファイルでは、それぞれの内容に合わせた名前空間を設定する。本文では複数の機能をひとつのファイルで使用するため、プレフィックスを使用して区別できるようにする。ちなみに、DrawingMLも使用する場合は次のようになる。
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<w:document xmlns:w="http://purl.oclc.org/ooxml/wordprocessingml/main"
xmlns:wp="http://purl.oclc.org/ooxml/drawingml/wordprocessingDrawing"
w:conformance="strict">
<!-- 略 -->
</w:document>
そして、Wordで保存したファイルは大量に名前空間のプレフィックスが設定される。
body要素の配下にユーザー目線的な意味での本文データが配置される。その中の代表格は、p要素で表す「段落」である(その他にp要素と同じレベルで登場する要素として表関連もある)。その次にr要素で表す「ラン」、最後にt要素などの「ランコンテンツ」だ。構造としては図2-2のイメージとなる。
本体の配下に段落が複数登場することはすぐにイメージできるとして、段落の下のランも複数配置できるし、ランの下のランコンテンツ(例えばt要素)も複数配置できる。図2-2のようにt要素を無駄に分割することはないが、pgNum要素(現在のページ番号)やbr要素(段落内改行)のような要素を含めると分割することになる。
ここで注意したいのはプロパティーの効果範囲だ。段落プロパティーもランプロパティーも自身と兄弟関係にある要素に対して効果を与える。ランコンテンツはランの中に複数回配置できるが、それぞれに別の書式を設定したければラン自体を分割しなければならない。HelloWorldのサンプルで単語の最初の文字だけを太字に設定するとリスト2-5のようになる。r要素の分割具合を確認してほしい。
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<w:document xmlns:w="http://purl.oclc.org/ooxml/wordprocessingml/main"
w:conformance="strict">
<w:body>
<w:p>
<w:pPr>
<w:jc w:val="center"/>
</w:pPr>
<!-- 太字の範囲 -->
<w:r>
<w:rPr>
<w:b/>
</w:rPr>
<w:t>H</w:t>
</w:r>
<!-- 通常の範囲 -->
<w:r>
<w:t xml:space="preserve">ello </w:t>
</w:r>
<!-- 太字の範囲 -->
<w:r>
<w:rPr>
<w:b/>
</w:rPr>
<w:t>W</w:t>
</w:r>
<!-- 通常の範囲 -->
<w:r>
<w:t>orld!</w:t>
</w:r>
</w:p>
</w:body>
</w:document>
t要素について補足する。本文で使用できる要素として表2-4でも解説しているが、t要素内のホワイトスペースを要素内で記述したとおりにアプリケーションに処理させたい(維持させたい)場合に「xml:space="preserve"」を指定する。リスト2-5の「ello 」の部分のように単語の最後にホワイトスペースが来てしまう場合は、扱いに気をつけないと意図せず消えてしまい悩むことになる。
ちなみに、段落プロパティーで使用できる要素、ランプロパティーで使用できる要素は決まっており、段落全体を太字にしたいからと段落プロパティーにb要素を追加してはいけない。スキーマ定義違反となる。
最後にワードプロセッサ(*.docx)として使用できるように1ファイルにまとめる。方法は簡単で圧縮するだけだ。ただし、[Content_Types].xmlがZIPファイル内のルートフォルダーに配置されるようにすること。作成したXMLファイルなどが入ったフォルダーを圧縮してしまわないように注意してほしい。
圧縮後は、拡張子をdocxに変更して実際にWordで開いて確認してみよう。