[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
メソッド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]
>>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)