XML Inclusions

XML Inclusions（XInclude）は、ひとつの XML 文書の中へ別の XML 文書（またはテキストファイル）を取り込み、複数の XML 文書を一つに統合する言語構文である。XInclude 自体も XML に準拠した埋め込み式のマークアップ言語である。 米国時間2004年12月20日に World Wide Web Consortium (W3C) から「XML Inclusions Version 1.0」が仕様としてリリースされ、W3C勧告となった。その後改定され、2006年11月15日に1.0 Second EditionがW3C勧告となっている。 XInclude は「xi」の名前空間接頭辞をもち、名前空間名は "http://www.w3.org/2001/XInclude" である。つまり、XInclude の要素 <xi:include> の先祖ノードで、予約属性 xmlns:xi を用いて以下のような名前空間宣言が必要となる。 <先祖ノード名 xmlns:xi="http://www.w3.org/2001/XInclude" > XML Inclusions Version 1.0 では、2つの要素と6つの属性が定義されている。 <xi:include> 要素 XInclude の必須要素である。他の文書を取り込み、この要素と置き換える。xi:fallback 要素を高々1つ含んでもよい。parse 属性が "xml" の場合は、href 属性またはxpointer 属性のどちらかを記述しなければならない。 href 属性（省略可能） 取り込む文書の URL を指定する。省略した場合には空文字列が指定された場合と同じように扱われ、この xi:include 要素を含む文書自身を指す。フラグメント識別子を含んでいてはいけない。 parse 属性（省略可能） 文書を XML として取り込む場合は "xml" を、プレーンテキストとして取り込む場合は "text" を指定する。省略時は "xml" となる。 xpointer 属性（省略可能） parse 属性が "xml" の場合、文書の内取り込む部分を指定する XPointer を指定する。parse 属性が "text" の場合は指定してはならない。 encoding 属性（省略可能） parse 属性が "text" の場合に取り込む文書の文字エンコード形式を指定する。parse 属性が "xml"の場合は無視される。外部からエンコード形式が指定されている場合や、メディアタイプが text/xml などの場合でエンコード形式が指定されている場合はそちらが優先される。省略された場合は UTF-8 が使われる。 accept 属性（省略可能） 文書を取得する際に HTTP リクエストの Accept ヘッダに指定するメディアタイプのリストを指定する。 accept-language 属性 (省略可能) 文書を取得する際に HTTP リクエストの Accept-Language ヘッダに指定するIETF言語タグのリストを指定する。 <xi:fallback> 要素 xi:include 要素の子としてのみ出現できる。任意の内容を含められる。文書の取得ができない場合にこの要素の中身で親の xi:include 要素を置き換える。親の xi:include 要素の parse 属性で "text" が指定してあっても、要素の中身は XML として扱われる。 wikipedia.txt として保存された (1) の文書を、(2) の XML 文書の中へ取り込む例。 (1) wikipedia.txt <p>ウィキペディアはオープンコンテントの百科事典です。</p> (2) XML 文書 <?xml version="1.0"?> <root xmlns="..." xmlns:xi="http://www.w3.org/2001/XInclude"> ... <body> <p><xi:include href="wikipedia.txt" parse="text"/></p> </body> </root> この XML 文書を処理すると、以下のような結果となる。 <?xml version="1.0"?> <root xmlns="..." xmlns:xi="http://www.w3.org/2001/XInclude"> ... <body> <p>&lt;p&gt;ウィキペディアはオープンコンテントの百科事典です。&lt;/p&gt;</p> </body> </root> wikipedia.xml として保存された (1) の文書を、(2) の XML 文書の中へ取り込む例。 (1) wikipedia.xml <?xml version="1.0"?> <p>ウィキペディアはオープンコンテントの百科事典です。</p> (2)XML 文書 <?xml version="1.0"?> <root xmlns="..." xmlns:xi="http://www.w3.org/2001/XInclude"> ... <body> <xi:include href="wikipedia.xml" parse="xml" /> </body> </root> この XML 文書を処理すると、以下のような結果となる。 <?xml version="1.0"?> <root xmlns="..." xmlns:xi="http://www.w3.org/2001/XInclude"> <head>...</head> <body> <p>ウィキペディアはオープンコンテントの百科事典です。</p> </body> </root> XPointer と組み合わせて、別の XML 文書の一部を取り込むこともできる。wikipedia.xml として保存された (1) の文書のテキスト部分のみを、(2) の XML 文書の中へ取り込む例。 (1) wikipedia.xml <?xml version="1.0"?> <p>ウィキペディアはオープンコンテントの百科事典です。</p> (2) XML 文書 <?xml version="1.0"?> <root xmlns="..." xmlns:xi="http://www.w3.org/2001/XInclude"> ... <body> <p><xi:include href="wikipedia.xml" xpointer="xpointer(//p/text())" parse="xml" /></p> </body> </root> この XML 文書を処理すると、以下のような結果となる。 <?xml version="1.0"?> <root xmlns="..." xmlns:xi="http://www.w3.org/2001/XInclude"> ... <body> <p>ウィキペディアはオープンコンテントの百科事典です。</p> </body> </root> 取り込んだ XML 文書にさらに xi:include 要素があれば、その xi:include 要素も再帰的に処理される。この処理は xpointer が解釈される前に実行される。ただし href 属性が自分自身を差している場合は xi:include が処理される前に xpointer は解釈される。 再帰処理の中で既に処理した xi:include 要素と同じ文書を指定し、なおかつ同じ xpointer を指定した xi:include 要素を処理しようとした場合、エラーとなる。 文書を取得する際、xml:base などで指定されたベース URI は考慮される。 取り込まれた文書のベース URI、言語（xml:lang で指定されるもの）は保存される。つまり取り込む文書と取り込まれた文書でベース URI や言語が違う場合は、xml:base 属性や xml:lang 属性が付加される。ただし、この動作はユーザによって抑制できるように実装してもよい。 一方、ID による参照は保存されない。ID は文書を取り込んだ後に解釈される。複数の参照先がある場合は、どれも参照しない。 XInclude は (X)HTML の<object> 要素や、show 属性として "embed" を指定した XLink とは異なる。object 要素や XLink は、文中に埋め込んで表示すべきリソースを差し示すのみであり、その具体的な処理方法はアプリケーションに委ねられている。Firefox 3 等の既存の Web ブラウザでの実装や、HTML5 のドラフトで示されている処理方法では、object 要素は DOM ツリー上では置き換えられず、表示上置き換えられるのみである。一方 XInclude では XML infoset の一部を他の XML 文書またはテキストから作成した XML infoset で置き換えた新しい XML infoset を作成する具体的な処理モデルが定められている。取り込まれた文書は取り込まれた先の文書の一部として扱われ、元の文書中での位置などの情報は失われる。 XSLT は XML を変換するための汎用的な機構であり、2009年10月現在 Internet Explorer, Firefox, Opera, Safari, Google Chromeなどの主要なブラウザでサポートされている。document 関数を使うことで、XInclude に似た効果が得られる。 2009年10月現在、主要なWeb ブラウザはXInclude をサポートしていない。