XInclude 1.0

XInclude 1.0

[2] XML 取込み (Inclusions) 1.0 (XInclude 1.0) は、 ある XML文書 (XML情報集合) の一部分として別の文書 (情報集合) を取込むための汎用の規格です。

XML 1.0XML 1.1 から構築された情報集合に対応しています XInclude 2

仕様書

[1] 仕様書:

[37] PEX1 <http://www.w3.org/2004/12/xinclude-errata/#PEX1> (2005年9月27日) では、次の段落が追加されています。

xi:fallback 要素内容は、囲んでいる xi:fallback 要素の処理中に資源誤りが発生しない限り、 無視されます。特に、 xi:fallback 要素の内側の要素属性の存在、不存在、または内容により起こる明白な致死誤りは、 無視される xi:fallback 要素中において報告されてはなりません。

無視される xi:fallback 要素に関する誤りは報告しなくてもいいということです。

[38] PEX6 <http://www.w3.org/2004/12/xinclude-errata/#PEX6> では次の段落が追加されています。

最初の文字バイト順印と解釈された時は、 これを捨てるべきです。これは UTF-8UTF-16、 および UTF-32 では BOM として解釈します。 UTF-16LEUTF-16BEUTF-32LEUTF-32BE では BOM として解釈しません。

規定がなかったから追加したそうです。 一々文書形式の仕様で規定するようなことではないと思いますが。。。

[39] PEX7 <http://www.w3.org/2004/12/xinclude-errata/#PEX7> では、 encoding 属性の値について、 XML宣言encoding 擬似属性の値と同じ (is) とされていたのが、妥当符号化名であるべきに変更されました。

違法な値をどうするか (誤り?) が曖昧だったので修正したのだそうですが、 何が妥当符号化名なのでしょうか?

[40] PEX10 <http://www.w3.org/2004/12/xinclude-errata/#PEX10> では、 accept 属性の説明の中の HTTP 頭部では禁止されているのでという記述が削除されました。

よくわからない説明が書いてありますが、 単に事実に反する記述なので削除しただけだと思われます。 規定内容自体に変更はありません。

accept-language 属性の説明にも同じ記述がありますが、なぜか修正されていません。

[41] PEX11 <http://www.w3.org/2004/12/xinclude-errata/#PEX11> では、 UTF-8 の参照先が RFC 2279 から RFC 3629 に参照が変わっています。 ちなみに両者は非互換です。

[42] PEX15 <http://www.w3.org/2004/12/xinclude-errata/#PEX15> では、 xpointer 属性百分率符号化に関するメモで、 百分率符号化されていたら誤りであるかのような表現が、 そうではなく、 PERCENT SIGN が現れても PERCENT SIGN そのものとして解釈されることに改められています。

[34] (冒頭の説明に反して) 日付が書かれていないので正確な時期はわかりませんが、 正誤表に項目が追加されています。

(名無しさん 2006-05-14 10:35:19 +00:00)

[35] PEX16 では xml:langxml:base の調整について、 利用者の任意選択によって抑制しても構わないと追記しています。

適合性に変更は無いと述べられていますが、 xml:lang は元々するべきxml:base助動詞なしの定義だったわけですから、影響がないともいえないような。

[36] PEX17 では IRI に関する規定を XML 1.1 で規定する XML資源識別子への参照に置き換えています。 やはり適合性に変更は無いと述べられていますが、 怪しいところです (IRI の項を参照)。 しかも現時点で XML 1.1 および正誤表に XML資源識別子はまだ規定されていなかったりします。

[44] XML Inclusions (XInclude) Version 1.0 (Second Edition) <http://www.w3.org/TR/2006/REC-xinclude-20061115/> (名無しさん 2006-11-16 12:11:22 +00:00)

[45] XInclude 1.0 Second Edition Errata <http://www.w3.org/XML/2006/11/xinclude-errata/> (名無しさん 2006-11-16 12:12:22 +00:00)

[46] PEX18 <http://www.w3.org/XML/2006/11/xinclude-errata/#PEX18> (名無しさん 2007-06-24 10:21:37 +00:00)

処理模型

[7] 処理模型は仕様書 4 章で規定されています。

用語:

原始情報集合 (source infoset)
取込み処理の入力です。
最上位被取込み項目 (top‐level included item)
xi:include で位置付けられた情報項目
被取込み項目 (included item)
最上位被取込み項目とその属性, 名前空間, 子孫
取込み位置 (include location)
xi:include 要素の href 属性の値 (省略時は空文字列) を正規化して URI または IRI とし、 XML基底に基づき解決した絶対URI または絶対IRI
結果情報集合 (result infoset)
原始情報集合と xi:include で指定された資源の情報集合を併合した新しい情報集合です。 (基本的に原始情報項目と取込み項目の複製になります。)
取込み親 (include parent)
xi:include

[8] parse=xml の場合: 取込み位置の参照を解き、資源を取出し、 媒体型application/xml であるとみなして文字符号化の判定や構文解析を行い、 情報集合を作成します。 (具体的な作成方法はあえて未規定とされており、たとえば妥当性検証を行うか否かは制約されていません。) 資源が何らかの理由で利用できない時は資源誤りになります。 資源が整形式でないときは致命的誤りになります。 (資源誤りと致命的誤りの境界は実装依存なところがあり、例えば取込み位置が誤り頁っぽい HTML 文書を返したら処理器は情報集合が作成できなかろうと資源誤りにしても構いませんし、解析しようとして非整形式で致命的誤りにしても構いません。) XInclude 4.2

(そういうのは HTTP状態符号のようなもので判断するのが普通じゃないですか?)

この情報集合の xi:include 要素は最適的に処理して獲得情報集合 (acquired infoset) を作成します。 文書内参照 (xpointer 属性によります。) では原始情報集合を獲得情報集合として使います。 獲得情報集合のうち、取込む部分を取込み対象 (inclusion target) といいます。 xpointer 属性が省略されていれば獲得情報集合の文書情報項目を取込み対象とします。 XInclude 4.2

処理器は XPointers のうち最低枠組みの範囲と element scheme に対応しなければなりません。 XPointer の誤りは資源誤りとします。 XPath 1.0XML 情報集合のデータ模型の違いから、 xpointer scheme が使われていて、 未展開実体参照情報項目が対象の文書に含まれている時は、 致命的誤りとします。 XInclude 4.2

取込み対象が文書情報項目の場合
最上位取込み項目は獲得情報集合の文書情報項目子供となります (但し、 文書型宣言情報項目を除きます)。 XInclude 4.2.1
取込み対象が複数の節点の場合
最上位取込み項目は獲得情報集合内の指された節点を獲得情報集合の文書順にしたものです。 XInclude 4.2.2
取込み対象が範囲の場合
最上位取込み項目は、指定された範囲をすべて文書順に、 重複は除いて選んだものとなります。 XInclude 4.2.3
点位置の場合
取込み対象が点の場合は、取込み項目は空となります。 XInclude 4.2.4
要素・注釈・処理指令の場合
取込み対象が要素・注釈・処理指令の場合、 それが最上位取込み項目になります。 XInclude 4.2.5
属性・名前空間宣言の場合
取込み対象が属性節名前空間節の場合は致命的誤りです。 XInclude 4.2.6
循環の場合
xi:include 要素の処理で、 別の xi:include 要素が既に取込み鎖で処理された取込み位置・ xpointer 属性値の時は、致命的誤りです。 (しかし、 xi:include を含む文書を parse="text" で指す、同じ局所資源の異なる部分 (異なる xpointer) を指す、 2つの入れ子でない xi:include が同じ 1つの文書 (xi:include を含む。) を指すなどは構いません。自分や先祖を parse="xml" で指したり、上位で既に処理した取込み要素・先祖を指すのは違法です。) XInclude 4.2.7

[9] parse="text" の場合: 取込み位置の参照を解き、資源を取出し、 文字情報項目の集合に変換します。 要素内容項目特性はとします。 この文字情報項目の集合を最上位取込み項目とします。 何らかの理由で資源が利用できない時は資源誤りになります。 XInclude 4.3

資源の文字符号化は、次により決定します XInclude 4.3

  1. 外部情報があれば、それにより。
  2. text/xml, application/xml, text/*+xml, application/*+xml であれば、 XML として。
  3. UTF-8 として。

[10] Fallback: 資源誤りの場合は、 fallback 動作にならなければなりませんXInclude 4.4

[11] 結果情報集合の作成 XInclude 4.5:

  1. 原始情報集合の複製を作ります。
  2. xi:include に対して、 取込み親の子供の中の xi:include を最上位取込み項目で置換します。 取込み項目の親は取込み親に設定します。

[12] 注意: 文書内参照は原始情報集合で解決されます。 ですから、 xi:include の処理順は結果に影響しません。 XInclude 4.5

XInclude 4.5

<x xmlns:xi="http://www.w3.org/2001/XInclude">
  <xi:include href="something.xml"/>
  <xi:include xpointer="xmlns(xi=http://www.w3.org/2001/XInclude)xpointer(x/xi:include[1])">
              parse="xml"/>
</x>

この例では、

<x xmlns:xi="http://www.w3.org/2001/XInclude">
  <xi:include href="something.xml"/>
  <xi:include href="something.xml"/>
</x>

と同じような結果が得られます。循環誤りにはなりません。

[13] 非解析対象実体: 取込み項目や子孫の属性から参照される非解析対象情報項目は、 重複でなければ結果情報項目に追加されます。 同じ名前で重複でないのを追加しようとする場合は致命的誤りです。 XInclude 4.5.1

ここで、重複とは、名前, システム識別子, 公開識別子, 宣言基底URI, 記法名, 記法が同じことを意味します。 (応用は他の方法、例えばシステム識別子宣言基底URI を使って重複を判断しても構いません。)XInclude 4.5.1

[14] 記法: 取込み項目の属性から参照される記法情報項目は既存のものと重複していなければ結果情報集合の文書情報項目記法特性に追加します。 >>13 で追加される非解析対象実体情報項目記法も追加します。 同じ名前で重複でない記法情報項目を追加しようとする場合は致命的誤りです。 XInclude 4.5.2

記法が重複とは、名前, システム識別子, 公開識別子, 宣言基底URI が同じことを言います。 (応用は他の手段で重複としても構いません。)XInclude 4.5.2

[15] 参照特性の修正 XInclude 4.5.3

取込みの過程で他の要素への参照を持った属性が出てくることがあります。 XInclude 処理でこの不整合が出ればそれを修正します。

対象: 対象となるものは正確には、

で、元々原始情報集合被取込み情報集合中の要素情報項目を指していたはずですが、 それを対応する結果情報集合中の要素情報項目への参照に置換える必要が出ます。

問題: 具体的に問題となるのは次の場合です。

解決法: 簡単に言えば、属性値を元に参照特性を計算しなおします。

属性情報項目属性型IDREF または IDREFS の場合、

[16] 名前空間の修正 XInclude 4.5.4

問題: 適用範囲内名前空間特性により名前空間の適用範囲は取込みを通じて保存されますが、 名前空間属性と齟齬が生じることがあります。

解決策: XInclude 処理器名前空間属性特性を出さないことが推奨されていますが、 それが叶わない場合は近似のために名前空間属性特性に属性情報項目を追加しても構わないとされています。

[17] 基底 URI の修正 XInclude 4.5.5

問題: 取込み処理を通じて基底URI 特性は保存されるので、相対URI参照は元の情報集合においてと同じ URI解決されます。しかし xml:base 属性によって得られる基底URI とは食い違ってきます。

解決策: 最上位被取込み項目中の各要素情報項目について、 取込み親基底URI が異なるなら、属性に次の属性情報項目を追加します。

(既に xml:base 属性情報項目が存在していれば、新しいもので置換えます。)

[18] 言語の修正 XInclude 4.5.6

問題: XML の仕様では xml:lang 属性は継承することになっていますが、 XML情報集合ではこれを特別扱いしていません。 そのため取込み時に取込みが行われた位置で言語情報が不正確になるかもしれません。

解決策: XInclude 1.0 では独自に言語特性を導入し、 言語情報を保存することにしています。 原始情報集合獲得情報集合の各要素情報項目XInclude 処理器言語特性を補うべきです。 その値は、

となります。

そして、 最上位被取込み項目中の各要素情報項目について、

には次の属性情報項目属性に追加します。

(既に xml:lang 属性情報項目が存在していれば、新しいもので置換えます。)

[31] xml:space 属性 XInclude 4.5.6

xml:base 属性と xml:lang 属性が特別扱いを受けているにも関わらず、 同じように継承する xml:space 属性は特別扱いされません

[32] その他の特性 XInclude 4.5.7

XML情報集合で規定されているその他の特性XInclude 1.0 で規定されている言語および取込み履歴は、 XInclude 1.0 の処理でも保存されます。

それ以外の情報項目の特性は、既定では捨てます。 しかし、 XInclude 1.0処理器は、利用者の任意選択により、 拡張特性の仕様書に従って意味的に正しくできるのであれば保存しても構いません

例えば PSVI妥当性特性は普通は捨てますが、 利用者の任意選択により保存しても構いません。 ただし取込みの結果妥当性が変化し得ますから、 それに合わせて新しい結果に修正しなければなりません。 その具体的な方法については XInclude 1.0 の範囲とされています。

適合性

[19] マークの適合性 XInclude 5.1

ある要素情報項目は、 XInclude 1.0 仕様書で規定された取込み要素の要件を満たす時、 適合するといいます。 (要素および属性のみに関する制約で、 スキーマ等は制約されていません。)

[20] 応用の適合性 XInclude 5.2

仕様書は xpointer() XPointer scheme への対応が必須で無いので著者に注意するようにと特に助言しています。

[21] XML 情報集合適合性 XInclude 5.3

XInclude 1.0 仕様書は XML情報集合 (第2版) に適合すると主張しています。

正しい処理に必要な入力情報集合の情報項目:

XInclude 処理によって更に次の情報項目が結果として生じ得ます。

XInclude 拡張の 取込み履歴特性が出現し得る情報項目:

XInclude 拡張の 言語特性が出現し得る情報項目:

他との関係

[2] XLink 1.0xlink:showembed にしたり、 HTMLobject 要素を使ったりしても、 対応した WWWブラウザで同じような表示にできるかもしれません。

しかし、 XLinkobject はあくまで表現上 (見かけ上) の関係に過ぎないのに対し、 XInclude は文書の構造そのものに別の文書を取込みます。 一度取込みを行った後は、完全に元の文書の一部となります。

[3] XIncludeXML外部実体とも似ています。 (実際、外部実体の置換えが XInclude の1つの目的です。) しかし、 XIncludeXML と次のような違いがあります。

[4] XIncludeXML 文書の構文解析の後の情報集合の操作として定義されていますから、 構文解析や情報集合の構築の処理は変更されません。

取込み後の情報集合に対する DTD による妥当性検証については定義されていません XInclude 1.3。 取込みの入力は PSVI のような拡張された情報集合でも構いませんが、 既定では拡張部分は取込み処理で落とされます。 利用者の任意選択で拡張部分も保存しても構いませんが、 処理器は拡張部分の情報が適切であるように配慮する必要があります。 XInclude 4.5.7

[24] xop:Include: XOP には xop:Include という似た要素型があります。

XOPSOAPバイナリ・データを送るにあたって XML 1 + Base64 では無駄が多いことから multipart/relatedバイナリ・データは別に送ればよいという考えで、 XML 情報集合中の挿入点を示すために xop:Include が使われます。

XOPXInclude が採用されなかったのは、 XInclude の機能のごく一部しか要らないので無駄が多いこと、 外部データを Base64 で符号化して挿入するために XInclude を改訂する必要があることなどが理由とされています。

参考: XOP Inclusion Mechanism - Frequently Asked Questions <http://www.w3.org/TR/2004/NOTE-xopinc-FAQ-20040608/>

メモ

[5] 最初に W3CNote として公表されたのが1999年の11月。 それから勧告されたのが2004年12月で丁度5年。 随分と掛かりましたねぇ。

[6] さて、今更こういうのを出してきたところで使ってもらえるのかどうか。 確かに現状のように各仕様それぞれで取込み輸入の仕組みを別個に持つよりは汎用のが1個あった方が色々便利なのは確かなのですが・・・。

[22] XML Inclusions (XInclude) Issues List <http://www.w3.org/XML/2001/05/xinclude-issues>

[23] XInclude CR Issues <http://www.w3.org/XML/2004/07/ExIT-xinclude/issues.html>

[25] PHP: DomDocument->xinclude - Manual <http://www.php.net/manual/ja/function.domdocument-xinclude.php>

PHP には DomDocument (Document 相当) に include () メソッドがあり、 当該文書に関する取込み処理を行います。 (名無しさん)

[26] 2002/dom-xinclude/org/w3c/tools/dom/xinclude/ <http://dev.w3.org/cvsweb/2002/dom-xinclude/org/w3c/tools/dom/xinclude/>

DOM + XInclude 1.0Java による実装例です。

DocumentnormalizeDocument を呼ぶ時に normalize feature で XInclude が有効に設定されていれば XInclude を処理するようになっています。 (Normalize feature は調べていませんがおそらく DOM水準3 に入れる案があった機能なのでしょう。 DOMConfiguration があるから要らないということになったのでしょうか。)

クラス XIDocument (抜粋)
  メソッド
    normalizeDocument
      通常の処理の後、正規化機能 http://www.w3.org/2002/04/dom-xinclude
      が設定されている場合は、文書節点を引数として XITransform クラスの
      applyXInclude メソッドを実行します。
    引数無し
    返し値無し
    例外無し
クラス XITransform
  メソッド
    applyFallback
      xi:xinclude 要素を、 xi:fallback 要素があればその内容で置換えます。
      引数
        xi, 型 Element
          置換する xi:xinclude 要素。
      返し値無し
      例外無し
    applyXInclude
      XInclude を与えられた節点から再帰的に適用します。
      引数
        n, 型 Node
          XInclude の適用開始点。
      返し値無し
      例外無し
    applyXIncludeAsText
      xi:xinclude 要素を、 parse 属性の値が
      text であるものとして適用します。
      引数
        xi, 型 Element
          置換する xi:xinclude 要素。
      返し値無し
      例外無し
    applyXIncludeAsXML
      xi:xinclude 要素を、 parse 属性の値が
      xml であるものとして適用します。
      引数
        xi, 型 Element
          置換する xi:xinclude 要素。
      返し値無し
      例外無し
    replaceXI
      xi:xinclude 要素を与えられた節点の並びで置換えます。
      各節点に対して applyXInclude した後、
      要素節点なら xml:base 属性を調整した上で、
      要素を置換えます。
      引数
        xi, 型 Element
          置換する xi:xinclude 要素。
        children, 型 NodeList
          節点の並び。
        importNode, 型 boolean
          もし true なら、
          並び中の節点を木に挿入する前に輸入する。
      返し値無し
      例外無し

applyXInclude だけ protected で、後は全部 private

(名無しさん)

[27] XInclude Engine <http://xincluder.sourceforge.net/> (名無しさん)

[28] >>27DOM 用は、 merge というメソッドがあって文書節点か要素節点と基底 URI を与えると XInclude 処理を行います。 (名無しさん)

[29] Using XInclude <http://xml.apache.org/xerces2-j/faq-xinclude.html>

Xerces の場合。読込んで木を作る時の option で有効にすれば XInclude 処理結果に。 (名無しさん)

[30] Module xinclude from libxml2 <http://xmlsoft.org/html/libxml-xinclude.html>

libxml の場合。

Context って中身は何? (名無しさん)

[43] XML Inclusions (XInclude) Version 1.0 (Second Edition) <http://www.w3.org/TR/2006/PER-xinclude-20061003/> (名無しさん 2006-10-05 23:48:38 +00:00)