システム識別子

システム識別子 (SGML、XML)

[12] システム識別子は、実体その他の所在を表すシステム依存の識別子です。元々 SGML では完全にシステム依存の値でしたが、公式システム識別子としてある程度相互運用性のある構文が後に規定されています。 とは言えそれもほぼ利用されず、ファイル名を指定することがほとんどでありました。 XMLURLシステム識別子として使っています。

仕様書

SGML の定義

システム識別子 (system identifier)
外部実体を位置づけるため、ファイル識別子格納場所プログラム呼び出しデータ列位置又は他のシステム特有情報特定するシステムデータ(JISX4151‐1992 定義 (106)

XML の定義

[2] システム識別子は、 URI参照に変換される文字列です。実体宣言文書型宣言記法宣言で使います。 >>23

[24] 実体置換文を得るために URI に変換されることを意図した文字列である >>23 とされていますが、記法宣言で使うこともでき、その場合の意味は厳密には規定がありません。

[4] システム識別子が使用可能なのは文書型宣言, 実体宣言, 記法宣言です。記法宣言以外では (外部識別子を使う場合) 必須です。)

[26] システム識別子は、URL です。絶対URLでも相対URLでも構いません。

空文字列も禁止されていません。

[27] 素片識別子を含めるのは誤りです >>23

文字

[3] 区切子 (" 又は ') を除いたどんな文書文字集合中の文字でも使用できます。 <http://www.w3.org/TR/REC-xml#NT-SystemLiteral>

[1] >>23 より

[定義: SystemLiteral は実体のシステム識別子 (system identifier) と呼びます。 システム識別子は FE E26 URI で、実体を取り出すのに使うことが出来るかもしれません SE E26 FE E66 (RFC 2369 で定義され、 RFC 2732 で更新された) FE E26 URI FE E76 参照XML処理系置換文を構築するための入力を得るためにSE E26 参照を解くことになります SE E26 その参照を解く過程の一部として (RFC 2369 で定義され、 RFC 2732 で更新された) URI 参照に変換されることになるものです。] FE E76 なお、 URI と共によく使われる # と素片識別子は、正確には URI の一部ではありません。 XML 処理系は素片識別子がシステム識別子の一部として出現した場合には誤りとしても構いません。 FE E76 素片識別子 (# で始まる。) がシステム識別子の一部であったなら、これは誤りです。 XML 1.0 仕様書の適用範囲外の情報が提供されない限り、 (例えば特定の DTD で規定された特別な XML 要素型とか、 特定の応用の仕様で定義されている処理指令とかで指定されない限り、) 相対 URI はその実体宣言が出現する資源の位置からの関係とします。 SE E18 これは宣言を開始させる < が、宣言の解釈される時点で含まれている外部実体であると定義します。 従って URI は文書実体からの関係であったり、外部 DTD 部分集合を含んでいる実体からのであったり、 あるいは他の外部引数実体からのものであったりします。 SE E3 URI により識別される資源を取り出そうとする時、解析器水準で (例えば実体解決器中で)、あるいは下位 (プロトコル水準、例えば HTTP Location: ) で redirect されるかもしれません。資源中にこの仕様の適用範囲外の追加情報が無い場合、資源の基底 URI は、常に実際に返された資源の URI となります。言い換えれば、全ての redirect を処理した後に取り出した資源の URI です。

.FE E78 FE E49 URI は予約文字 (RFC 2396 2.2 節参照。) や非 ASCII 文字を含んでいるかもしれません。 XML 処理系は、 URI 中のFE E49 非 ASCII FE E49 そのような 文字を、その文字を UTF-8 の1つ以上のバイトの列として表現し、それからそのバイトを URI escape 機構で escape する (つまり各バイトを %HH に変換する。ここで HH はバイト値の16進数表記。) ことで扱うべきです。

.FE E78 SE E4 URI 参照ではある文字群について符号化と escape が必要です。禁止文字には全ての非 ASCII 文字と、 RFC 2396 の2.4節に列挙されている除外文字を含みます。但し数値記号 (#) 及び百分率記号 (%) 及び RFC 2732で再許可された四角括弧文字を除きます。禁止文字は次のように escape しなければなりません。 SE E26 SE E4 XML 処理系は禁止文字を次の手順で escape しなければなりません。 SE E26 システム識別子 (及び他の XML 文字列で URI 参照として使われることになるもの) は、 RFC 2396 及び RFC 2732 に従えば URI をその参照している資源を取り出すのに使う前に escape しなければならないある文字群を含んでいるかもしれません。 Escape される文字は、制御文字 #x0#1F, #7F (このほとんどは XML では出現できない)、間隔 #x20, 区切子 '<' #x3C, '>' #x3E, '"' #x22, 非賢明 (unwise) 文字 '{' #x7B, '}' #x7D, '|' #x7C, '\' #x5C, '^' #x5E, '`' #x60, それに #x80 以上の全ての文字です。 Escape は必ずしも完全に復元可能な過程ではないので、完全に必要な場合に限って可能な限り処理の連鎖の遅い過程で適用しなければなりません。特に、相対 URI を絶対 URI に変換する過程も、あるいは URI 参照をその参照を解くことを担当する過程又はソフトウェア部品に渡す過程も、 escape を行うきっかけとなるべきではありません。 Escape が行われる時には、次の手順で処理しなければなりません。

  1. SE E26 禁止 SE E26 escape する文字を UTF-8 の1つ以上のバイトの列SE E26 に変換 SE E26 で表現する。
  2. SE E26 禁止文字に対応する各SE E5 オクテット SE E5 バイト SE E26 結果のバイト列を URI escape 機構によって escape する。 (つまり、 %HH に変換する。ここで、 HH はそのバイト値の16進表記。)
  3. 元の文字を得た文字列で置換する。

修正歴:

  • FE
    • E26 明確化 URI を解決して得たバイト列を置換文の元にすることが不明瞭だった。
      • E76 URI ではなく URI 参照。素片識別子は意味がないから誤りに。
    • E49 本質的 URI の予約文字に触れていなかった。
      • E78 本質的 説明なし
    • E66 編集上 最新の URI RFCs の参照に修正。
    • E88 本質的 文書の全ての URI を URI 参照に変更。
      • nihonLinux みたいだ(w 「URI URI 参照」ってなんよ?
  • SE
    • E3 明確化 説明なし
    • E4 明確化 URI 参照の解決に当たって XML 処理系が escape に責任があるという説明が SE では抜けていた。
      • E26 明確化 いつ誰が escape するのか不明瞭だった。
        • E43 編集上 E26 の修正時に E3, E4, E18 を見落としていた。
    • E5 編集上 バイトオクテットは同じことだが数の論理でバイトにした。
    • E16 本質的 URI RFCs をその他の参考文献から規定参考文献に変更。
    • E18 明確化 >>1-2 参照

  • [19] ほんとに二転三転七転八倒(謎)ですねぇ。
  • [18] URI → URI 参照→ URI 参照に変換されるものと変わってきたのがおもしろおかしいw。そのうち IRI に変換されるもの、とかにまた訂正されるに違いない。
  • [20] まとめると、システム識別子の値は URI ではなく、 URI 参照に変換されるものだから、 URI では使ってはいけない文字も使ってもいい、ということらしいです。ものは言いようとはまさに。
  • [21] Escape が非可逆だからいくない!ってのも意味不明ですね。確かに http://foo.example/"/http://foo.example/%22/ の区別は失われますが、前者はそもそも URI として不正なので、そんなものに復元する必要はないのでして。
  • [22] XML 処理系は URI として不正な文字が含まれていたら警告するのがよいでしょう。仕様書がそういうのも扱えと言っている以上、誤りには残念ながら出来ませんが。

基底 URL

[37] 宣言基底URLを参照。

処理

[25] 外部実体記法宣言も参照。

メモ

[31] システム識別子 (及び他の XML 文字列で URI 参照として使われることになるもの) の、システム識別子以外の XML 文字列たる URI 参照になるものって何? まさか xml:base のような関連規格を指しているわけではありませんよね? でもシステム識別子以外に XML 本体に URI 参照って使われますか?

XML Schema の定義

[9] XML SchemaXMLNOTATION に対応する notation を規定しており、これにもシステム識別子が存在します。その値は xs:anyURI とされています。

システム識別子の欠落

[15] 文書型宣言連結型宣言実体宣言記法宣言未展開実体参照情報項目のいずれでもシステム識別子は必須ではありません。 ただし XML では公開識別子がある場合システム識別子も必須です。また XML実体宣言ではシステム識別子は必須です。またいずれも空文字列とすることもできます。

[8] システム識別子空文字列にしてしまうと、本当に外部部分集合を読もうとする処理器 (で公開識別子から型録を引かない場合) はその文書実体自体を外部部分集合実体とみなすわけですから、 当然外部部分集合として整形式になりません。こんなんでいいんでしょうか。

[16] XML情報集合ではいずれも無値 (no value) となり得ます。また未展開実体参照情報項目については未知 (unknown) ともなり得ます。

[17] DOM Standard では DocumentTypesystemIdnull にすることができません。 HTML Living Standard および Webブラウザーシステム識別子のない DOCTYPE の場合空文字列にします。

[11] DOM3DocumentTypesystemIdnull になる可能性に言及していません。 Entity, Notation については null になり得るとしていました。

セキュリティーとプライバシー

[6] 外部実体セキュリティーの項を参照。

関連

[13] ほとんどすべての場面でシステム識別子公開識別子がセットで用いられます。 元々はシステム識別子はシステム固有の値であって相互運用性は保証されず、 公開識別子はシステム非依存の値であって相互運用性のあるものと想定されていたようですが、 SGML型録を実装していたまともな SGML処理器以外では公開識別子はあまり意味のない記号列と化しており、 特に XML ではもっぱらシステム識別子実体を識別する用途に使われています。

メモ

[5] 鳥さんの独り言 XHTML文書のDTDのURL(URI)は必須? (2007-08-14 20:56:14 +09:00 版) <http://gowest.blog2.fc2.com/blog-entry-47.html>

HTML鳩丸倶楽部さんの「文書型宣言の読み方」(URIを示すと横幅オーバーになってしまうので、ググッてください)に書かれている内容が、一般的な理解と言ってよいでしょう。

一般的な理解ってなにさw SGML の仕様書嫁だよw

[7] NetscapeRSS 0.91 仕様では、文書型宣言は次のいずれかでなければならないとされていました。

<!DOCTYPE rss PUBLIC "-//Netscape Communications//DTD RSS 0.91//EN" "http://my.netscape.com/publish/formats/rss-0.91.dtd">
<!DOCTYPE rss PUBLIC "-//Netscape Communications//DTD RSS 0.91//EN" ""> 
RSS 0.91 Specification (Netscape) ( 版) <http://www.rssboard.org/rss-0-9-1-netscape#DOCTYPE>