[2] XML 取込み 1.0 (XInclude 1.0) は、 ある XML文書 (XML情報集合) の一部分として別の文書 (情報集合) を取込むための汎用の規格です。
XML 1.0 と XML 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-8、UTF-16、 および UTF-32 では
BOMとして解釈します。 UTF-16LE、UTF-16BE、 UTF-32LE、UTF-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:lang と
xml: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 章で規定されています。
用語:
xi:include で位置付けられた情報項目。xi:include 要素の href
属性の値 (省略時は空文字列) を正規化して
URI または
IRI とし、
XML基底に基づき解決した絶対URI
または絶対IRI。xi:include で指定された資源の情報集合を併合した新しい情報集合です。
(基本的に原始情報項目と取込み項目の複製になります。)xi:include の親。xi:include の href
を陽にまたは陰に空文字列にすることで自分自身を指すことができますが、
実装方法によっては不都合があるかもしれません。
(自分自身の parse="text" の元データがない場合など。)
href が空文字列になる場合は資源誤りにして構いません。
その場合はそうなる状況を文書化するべきです。
XInclude 4.1xi:include の href
は非 IRI 文字を含んでいるかもしれません。
処理器は逃避する必要があります。
URI として扱う場合は
更に URI 文字も逃避する必要があります。
XInclude 4.1.1xi:include
に accept や accept-charset
を指定するべきです。 XInclude 4.1.2[8] parse=xml の場合:
取込み位置の参照を解き、資源を取出し、
媒体型が application/xml
であるとみなして文字符号化の判定や構文解析を行い、
情報集合を作成します。
(具体的な作成方法はあえて未規定とされており、たとえば妥当性検証を行うか否かは制約されていません。)
資源が何らかの理由で利用できない時は資源誤りになります。
資源が整形式でないときは致命的誤りになります。
(資源誤りと致命的誤りの境界は実装依存なところがあり、例えば取込み位置が誤り頁っぽい HTML 文書を返したら処理器は情報集合が作成できなかろうと資源誤りにしても構いませんし、解析しようとして非整形式で致命的誤りにしても構いません。)
XInclude 4.2
(そういうのは HTTP の状態符号のようなもので判断するのが普通じゃないですか?)
この情報集合の xi:include
要素は最適的に処理して獲得情報集合を作成します。
文書内参照 (xpointer 属性によります。)
では原始情報集合を獲得情報集合として使います。
獲得情報集合のうち、取込む部分を取込み対象といいます。
xpointer 属性が省略されていれば獲得情報集合の文書情報項目を取込み対象とします。
XInclude 4.2
処理器は XPointers のうち最低枠組みの範囲と
element scheme に対応しなければなりません。
XPointer の誤りは資源誤りとします。 XPath 1.0
と XML 情報集合のデータ模型の違いから、
xpointer scheme が使われていて、
未展開実体参照情報項目が対象の文書に含まれている時は、
致命的誤りとします。
XInclude 4.2
文書情報項目の場合文書情報項目の子供となります
(但し、 文書型宣言情報項目を除きます)。
XInclude 4.2.1xi: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。
text/xml, application/xml,
text/*+xml,
application/*+xml
であれば、 XML として。UTF-8 として。[10] Fallback: 資源誤りの場合は、 fallback 動作にならなければなりません。 XInclude 4.4
xi:include
要素情報項目の子供が丁度1つ
xi:fallback を含んでいれば、
最上位取込み項目は xi:fallback
の子供を XInclude
処理した結果とします。
(parse 属性は影響しません。)xi:include に対して、
取込み親の子供の中の
xi:include を最上位取込み項目で置換します。
取込み項目の親は取込み親に設定します。xi:include が根要素で、
最上位取込み項目が要素1つと零個以上の処理指令・注釈でない場合は致命的誤りです。適用範囲内名前空間を継承して構いません。取込み履歴で記録します。取込み履歴特性が最上位水準取込み項目にあれば、
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
取込みの過程で他の要素への参照を持った属性が出てくることがあります。 XInclude 処理でこの不整合が出ればそれを修正します。
対象: 対象となるものは正確には、
で、元々原始情報集合か被取込み情報集合中の要素情報項目を指していたはずですが、
それを対応する結果情報集合中の要素情報項目への参照に置換える必要が出ます。
問題: 具体的に問題となるのは次の場合です。
参照特性の値は未知または値無しとなります。正規化値が同じでも参照が指す先は異なることが起こり得ます。解決法:
簡単に言えば、属性値を元に参照特性を計算しなおします。
属性情報項目で属性型が
IDREF または IDREFS
の場合、
正規化値の各字句について、
対応する要素情報項目を並べたものを参照特性値とします。属性型が XML であって正規化値が字句と一致するような属性情報項目を持つことを意味します。参照特性値は値無しとします。問題:
適用範囲内名前空間特性により名前空間の適用範囲は取込みを通じて保存されますが、
名前空間属性と齟齬が生じることがあります。
解決策:
XInclude 処理器は名前空間属性特性を出さないことが推奨されていますが、
それが叶わない場合は近似のために名前空間属性特性に属性情報項目を追加しても構わないとされています。
[17] 基底 URI の修正 XInclude 4.5.5
問題:
取込み処理を通じて基底URI
特性は保存されるので、相対URI参照は元の情報集合においてと同じ
URI に解決されます。しかし xml:base
属性によって得られる基底URI とは食い違ってきます。
解決策:
最上位被取込み項目中の各要素情報項目について、
取込み親と基底URI
が異なるなら、属性に次の属性情報項目を追加します。
名前空間名は
http://www.w3.org/XML/1998/namespace局所名は base接頭辞は xml正規化値は、
その要素の基底URIか、またはそれと等価な、
取込み親の基底URI
についての相対URI参照]] (その計算法は実装依存)指定は真属性型は CDATA参照は値無し所有要素はその要素情報項目(既に xml:base 属性情報項目が存在していれば、新しいもので置換えます。)
問題:
XML の仕様では xml:lang
属性は継承することになっていますが、
XML情報集合ではこれを特別扱いしていません。
そのため取込み時に取込みが行われた位置で言語情報が不正確になるかもしれません。
解決策:
XInclude 1.0 では独自に言語特性を導入し、
言語情報を保存することにしています。
原始情報集合と獲得情報集合の各要素情報項目に
XInclude 処理器は言語特性を補うべきです。
その値は、
となります。
名前空間名は
http://www.w3.org/XML/1998/namespace局所名は lang接頭辞は xml正規化値は言語で、
値無しの場合は空文字列指定は真属性型は CDATA参照は値無し所有要素はその要素情報項目(既に xml:lang 属性情報項目が存在していれば、新しいもので置換えます。)
[31]
xml:space 属性
XInclude 4.5.6
xml:base 属性と
xml:lang 属性が特別扱いを受けているにも関わらず、
同じように継承する xml:space
属性は特別扱いされません。
XML情報集合で規定されているその他の特性と
XInclude 1.0 で規定されている言語および取込み履歴は、
XInclude 1.0 の処理でも保存されます。
それ以外の情報項目の特性は、既定では捨てます。 しかし、 XInclude 1.0 の処理器は、利用者の任意選択により、 拡張特性の仕様書に従って意味的に正しくできるのであれば保存しても構いません。
例えば PSVI の妥当性特性は普通は捨てますが、
利用者の任意選択により保存しても構いません。
ただし取込みの結果妥当性が変化し得ますから、
それに合わせて新しい結果に修正しなければなりません。
その具体的な方法については XInclude 1.0
の範囲外とされています。
ある要素情報項目は、 XInclude 1.0 仕様書で規定された取込み要素の要件を満たす時、 適合するといいます。 (要素および属性のみに関する制約で、 スキーマ等は制約されていません。)
element()仕様書は xpointer()
XPointer scheme への対応が必須で無いので著者に注意するようにと特に助言しています。
XInclude 1.0 仕様書は XML情報集合 (第2版) に適合すると主張しています。
正しい処理に必要な入力情報集合の情報項目:
XInclude 処理によって更に次の情報項目が結果として生じ得ます。
[2] XLink 1.0
で xlink:show を embed
にしたり、 HTML
の object 要素を使ったりしても、
対応した WWWブラウザで同じような表示にできるかもしれません。
しかし、 XLink や object
はあくまで表現上 (見かけ上) の関係に過ぎないのに対し、
XInclude は文書の構造そのものに別の文書を取込みます。
一度取込みを行った後は、完全に元の文書の一部となります。
[3] XInclude は XML の外部実体とも似ています。 (実際、外部実体の置換えが XInclude の1つの目的です。) しかし、 XInclude は XML と次のような違いがあります。
text/plain
として取込むことができます。[4] XInclude は XML 文書の構文解析の後の情報集合の操作として定義されていますから、 構文解析や情報集合の構築の処理は変更されません。
取込み後の情報集合に対する DTD による妥当性検証については定義されていません XInclude 1.3。 取込みの入力は PSVI のような拡張された情報集合でも構いませんが、 既定では拡張部分は取込み処理で落とされます。 利用者の任意選択で拡張部分も保存しても構いませんが、 処理器は拡張部分の情報が適切であるように配慮する必要があります。 XInclude 4.5.7
[24] xop:Include:
XOP には xop:Include
という似た要素型があります。
XOP は SOAP でバイナリ・データを送るにあたって XML 1 +
Base64 では無駄が多いことから
multipart/related
でバイナリ・データは別に送ればよいという考えで、 XML
情報集合中の挿入点を示すために
xop:Include が使われます。
XOP で XInclude が採用されなかったのは、 XInclude の機能のごく一部しか要らないので無駄が多いこと、 外部データを Base64 で符号化して挿入するために XInclude を改訂する必要があることなどが理由とされています。
参考: XOP Inclusion Mechanism - Frequently Asked Questions <http://www.w3.org/TR/2004/NOTE-xopinc-FAQ-20040608/>
[5] 最初に W3C の Note として公表されたのが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.0 の Java による実装例です。
Document の normalizeDocument
を呼ぶ時に normalize feature で XInclude
が有効に設定されていれば XInclude を処理するようになっています。
(Normalize feature は調べていませんがおそらく DOM水準3
に入れる案があった機能なのでしょう。
DOMConfiguration
があるから要らないということになったのでしょうか。)
クラスXIDocument(抜粋) メソッドnormalizeDocument通常の処理の後、正規化機能http://www.w3.org/2002/04/dom-xincludeが設定されている場合は、文書節点を引数としてXITransformクラスのapplyXIncludeメソッドを実行します。 引数無し 返し値無し 例外無し
クラスXITransformメソッドapplyFallbackxi:xinclude要素を、xi:fallback要素があればその内容で置換えます。 引数 xi, 型Element置換するxi:xinclude要素。 返し値無し 例外無しapplyXIncludeXInclude を与えられた節点から再帰的に適用します。 引数 n, 型NodeXInclude の適用開始点。 返し値無し 例外無しapplyXIncludeAsTextxi:xinclude要素を、parse属性の値がtextであるものとして適用します。 引数 xi, 型Element置換するxi:xinclude要素。 返し値無し 例外無しapplyXIncludeAsXMLxi:xinclude要素を、parse属性の値がxmlであるものとして適用します。 引数 xi, 型Element置換するxi:xinclude要素。 返し値無し 例外無しreplaceXIxi:xinclude要素を与えられた節点の並びで置換えます。 各節点に対してapplyXIncludeした後、 要素節点ならxml:base属性を調整した上で、 要素を置換えます。 引数 xi, 型Element置換するxi:xinclude要素。 children, 型NodeList節点の並び。 importNode, 型booleanもしtrueなら、 並び中の節点を木に挿入する前に輸入する。 返し値無し 例外無し
applyXInclude だけ protected
で、後は全部 private。
(名無しさん)
[27] XInclude Engine <http://xincluder.sourceforge.net/> (名無しさん)
[28]
>>27 の DOM 用は、 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)