[12] [[システム識別子]]は、[[実体]]その他の所在を表す[[システム]]依存の[[識別子]]です。元々 [[SGML]]
では完全にシステム依存の値でしたが、[[公式システム識別子]]としてある程度[[相互運用性]]のある構文が後に規定されています。
とは言えそれもほぼ利用されず、[[ファイル名]]を指定することがほとんどでありました。 [[XML]]
は [[URL]] を[[システム識別子]]として使っています。

* 仕様書

[REFS[
- [23] [CITE@EN[Extensible Markup Language (XML) 1.0 (Fifth Edition)]] ([TIME[2013-05-29 05:49:56 +09:00]] 版) <http://www.w3.org/TR/xml/#dt-sysid>
]REFS]

* SGML の定義

[FIG[
>
:[RUBYB[システム識別子] [system identifier]]:[[外部実体]]を位置づけるため、[[ファイル識別子]]、[[格納場所]]、[[プログラム]][[呼び出し]]、
[[データ列]]の[[位置]]又は他の[[システム特有情報]]を[[特定]]する[[システムデータ]]。 [INS[([[JISX4151]]‐1992 定義 (106)]]
]FIG]

[10] [[公式システム識別子]]

* XML の定義

[2]
システム識別子は、 [[URI参照]]に変換される文字列です。[[実体宣言]]や[[文書型宣言]]や[[記法宣言]]で使います。 [SRC[>>23]]

[24] [[実体]]の[[置換文]]を得るために [[URI]] に変換されることを意図した[[文字列]]である
[SRC[>>23]] とされていますが、[[記法宣言]]で使うこともでき、その場合の意味は厳密には規定がありません。

[4] [[システム識別子]]が使用可能なのは[[文書型宣言]], [[実体宣言]], [[記法宣言]]です。記法宣言以外では [WEAK[(外部識別子を使う場合)]] 必須です。)

** 値

[26] [[システム識別子]]は、[[URL]] です。[[絶対URL]]でも[[相対URL]]でも構いません。

;; [[空文字列]]も禁止されていません。

[27] [[素片識別子]]を含めるのは[[誤り]]です [SRC[>>23]]。

** 文字

[3] 区切子 ([CODE(XML)["]] 又は [CODE(XML)[']]) を除いたどんな[[文書文字集合]]中の文字でも使用できます。 <http://www.w3.org/TR/REC-xml#NT-SystemLiteral>

[FIG(quote)[
[FIGCAPTION[
[1] [SRC[>>23]] より
]FIGCAPTION]

> [定義: [CODE(XML)[SystemLiteral]] 
は実体の[DFN[[RUBYB[システム識別子] [system identifier]]]]と呼びます。
システム識別子は [DEL[[INS[[WEAK[FE E26]]]] URI で、実体を取り出すのに使うことが出来るかもしれません]] [DEL[[INS[[WEAK[SE E26]]]] [INS[[INS[[WEAK[FE E66]]]] (RFC 2369 で定義され、 RFC 2732 で更新された)]] [INS[[INS[[WEAK[FE E26]]]] URI [INS[[INS[[WEAK[FE E76]]]] 参照]]で]]、[[XML処理系]]が[[置換文]]を構築するための入力を得るために[DEL[[INS[[WEAK[SE E26]]]] 参照を解くことになります]]]] [INS[[INS[[WEAK[SE E26]]]] その参照を解く過程の一部として (RFC 2369 で定義され、 RFC 2732 で更新された) URI 参照に変換されることになるものです]]。] [DEL[[INS[[WEAK[FE E76]]]] なお、 URI と共によく使われる [CODE(URI)[#]] と素片識別子は、正確には URI の一部ではありません。 XML 処理系は素片識別子がシステム識別子の一部として出現した場合には誤りとしても構いません。]] [INS[[INS[[WEAK[FE E76]]]] [[素片]]識別子 ([CODE(URI)[#]] で始まる。) がシステム識別子の一部であったなら、これは[[誤り]]です。]]
XML 1.0 仕様書の適用範囲外の情報が提供されない限り、
(例えば特定の DTD で規定された特別な XML 要素型とか、
特定の応用の仕様で定義されている[[処理指令]]とかで指定されない限り、)
相対 URI はその実体宣言が出現する資源の位置からの関係とします。 [INS[[INS[SE E18]] これは宣言を開始させる [CODE(XML)[<]] が、宣言の解釈される時点で含まれている外部実体であると定義します。]]
従って URI は[[文書実体]]からの関係であったり、外部 DTD
部分集合を含んでいる実体からのであったり、
あるいは他の外部引数実体からのものであったりします。 [INS[[INS[SE E3]] URI により識別される資源を取り出そうとする時、解析器水準で (例えば実体解決器中で)、あるいは下位 (プロトコル水準、例えば [[HTTP]] [CODE(HTTP)[[[Location:]]]] [[頭]]) で redirect されるかもしれません。資源中にこの仕様の適用範囲外の追加情報が無い場合、資源の基底 URI は、常に実際に返された資源の URI となります。言い換えれば、全ての redirect を処理した後に取り出した資源の URI です。]]
>
[DEL[

.[INS[[WEAK[FE E78]]]] [INS[[INS[[WEAK[FE E49]]]] URI は予約文字 (RFC 2396 2.2 節参照。) や非 ASCII 文字を含んでいるかもしれません。]] XML 処理系は、 URI 中の[DEL[[INS[[WEAK[FE E49]]]] 非 ASCII]] [INS[[INS[[WEAK[FE E49]]]] そのような]] 文字を、その文字を UTF-8 の1つ以上のバイトの列として表現し、それからそのバイトを URI escape 機構で escape する (つまり各バイトを [CODE(URI)[%[VAR[HH]]]] に変換する。ここで [VAR[HH]] はバイト値の16進数表記。)
ことで扱うべきです。
]DEL]
>
[INS[

.[INS[[WEAK[FE E78]]]] [DEL[[INS[[WEAK[SE E4]]]] URI 参照ではある文字群について符号化と escape が必要です。禁止文字には全ての非 ASCII 文字と、 RFC 2396 の2.4節に列挙されている除外文字を含みます。但し数値記号 ([CODE(URI)[#]]) 及び百分率記号 ([CODE(URI)[%]]) 及び RFC 2732で再許可された四角括弧文字を除きます。禁止文字は次のように escape しなければなりません。]] [DEL[[INS[[WEAK[SE E26]]]] [INS[[INS[[WEAK[SE E4]]]] XML 処理系は禁止文字を次の手順で escape しなければなりません。]]]] [INS[[INS[[WEAK[SE E26]]]] システム識別子 (及び他の XML 文字列で URI 参照として使われることになるもの) は、 RFC 2396 及び RFC 2732 に従えば URI をその参照している資源を取り出すのに使う前に escape しなければならないある文字群を含んでいるかもしれません。 Escape される文字は、制御文字 [CODE(XML)[#x0]]〜[CODE(XML)[#1F]], [CODE(XML)[#7F]] (このほとんどは XML では出現できない)、間隔 [CODE(XML)[#x20]], 区切子 [CODE(XML)['<']] [CODE(XML)[#x3C]], [CODE(XML)['>']] [CODE(XML)[#x3E]], [CODE(XML)['"']] [CODE(XML)[#x22]], [RUBYB[非賢明] [[[unwise]]]]文字 [CODE(XML)['{']] [CODE(XML)[#x7B]], [CODE(XML)['}']] [CODE(XML)[#x7D]], [CODE(XML)['|']] [CODE(XML)[#x7C]], [CODE(XML)['\']] [CODE(XML)[#x5C]], [CODE(XML)['^']] [CODE(XML)[#x5E]], [CODE(XML)['`']] [CODE(XML)[#x60]], それに [CODE(XML)[#x80]] 以上の全ての文字です。 Escape は必ずしも完全に復元可能な過程ではないので、完全に必要な場合に限って可能な限り処理の連鎖の遅い過程で適用しなければなりません。特に、相対 URI を絶対 URI に変換する過程も、あるいは URI 参照をその参照を解くことを担当する過程又はソフトウェア部品に渡す過程も、 escape を行うきっかけとなるべきではありません。 Escape が行われる時には、次の手順で処理しなければなりません。]]
= 各[DEL[[INS[[WEAK[SE E26]]]] 禁止]] [INS[[INS[[WEAK[SE E26]]]] escape する]]文字を UTF-8 の1つ以上のバイトの列[DEL[[INS[[WEAK[SE E26]]]] に変換]] [INS[[INS[[WEAK[SE E26]]]] で表現]]する。
= [DEL[[INS[[WEAK[SE E26]]]] 禁止文字に対応する各[DEL[[INS[[WEAK[SE E5]]]] オクテット]] [INS[[INS[[WEAK[SE E5]]]] バイト]]]] [INS[[INS[[WEAK[SE E26]]]] 結果のバイト列]]を URI escape 機構によって
escape する。 (つまり、 [CODE(URI)[%[VAR[HH]]]]
に変換する。ここで、 [VAR[HH]] はそのバイト値の16進表記。)
= 元の文字を得た文字列で置換する。
]INS]
]FIG]

修正歴:
- [[FE]]
-- E26 [WEAK[明確化]] URI を解決して得たバイト列を置換文の元にすることが不明瞭だった。
--- E76 URI ではなく URI 参照。素片識別子は意味がないから誤りに。
-- E49 [WEAK[本質的]] URI の予約文字に触れていなかった。
--- E78 [WEAK[本質的]] [WEAK[説明なし]]
-- E66 [WEAK[編集上]] 最新の URI RFCs の参照に修正。
-- E88 [WEAK[本質的]] 文書の全ての URI を URI 参照に変更。
--- [WEAK[[[nihonLinux]] みたいだ(w 「URI URI 参照」ってなんよ?]]
- [[SE]]
-- E3 [WEAK[明確化]] [WEAK[説明なし]]
-- E4 [WEAK[明確化]] URI 参照の解決に当たって XML 処理系が escape に責任があるという説明が SE では抜けていた。
--- E26 [WEAK[明確化]] いつ誰が escape するのか不明瞭だった。
---- E43 [WEAK[編集上]] E26 の修正時に E3, E4, E18 を見落としていた。
-- E5 [WEAK[編集上]] [[バイト]]と[[オクテット]]は同じことだが[[数の論理]]でバイトにした。
-- E16 [WEAK[本質的]] URI RFCs をその他の参考文献から規定参考文献に変更。
-- E18 [WEAK[明確化]] >>1-2 参照

- [19] ほんとに二転三転七転八倒(謎)ですねぇ。
- [18] URI → URI 参照→ URI 参照に変換されるものと変わってきたのがおもしろおかしいw。そのうち IRI に変換されるもの、とかにまた訂正されるに違いない。
- [20] まとめると、システム識別子の値は URI ではなく、 URI 参照に変換されるものだから、 URI では使ってはいけない文字も使ってもいい、ということらしいです。ものは言いようとはまさに。
- [21] Escape が非可逆だからいくない!ってのも意味不明ですね。確かに [SAMP(URI)[http://foo.example/"/]] と [SAMP(URI)[http://foo.example/%22/]] の区別は失われますが、前者はそもそも ''URI として不正''なので、そんなものに復元する必要はないのでして。
- [22] '''XML 処理系は URI として不正な文字が含まれていたら警告'''するのがよいでしょう。仕様書がそういうのも扱えと言っている以上、誤りには残念ながら出来ませんが。

** 基底 URL

[37] [[宣言基底URL]]を参照。

** 処理

[25] [[外部実体]]、[[記法宣言]]も参照。

** メモ

[31]
[Q[システム識別子 (及び他の XML 文字列で URI 参照として使われることになるもの)]]
の、システム識別子以外の XML 文字列たる URI 参照になるものって何?
まさか [CODE(XMLa)[xml:base]] のような関連規格を指しているわけではありませんよね? でもシステム識別子以外に XML 本体に URI 参照って使われますか?

@@ [14] [[XML情報集合]]...

* XML Schema の定義

[9] [[XML Schema]] は [[XML]] の [CODE(XML)@en[[[NOTATION]]]] に対応する [CODE(XMLe)@en[[[notation]]]]
を規定しており、これにも[[システム識別子]]が存在します。その値は [CODE(XML)@en[[[xs:anyURI]]]] とされています。

* システム識別子の欠落

[15] [[文書型宣言]]、[[連結型宣言]]、[[実体宣言]]、[[記法宣言]]、
[[未展開実体参照情報項目]]のいずれでも[[システム識別子]]は必須ではありません。
ただし [[XML]] では[[公開識別子]]がある場合[[システム識別子]]も必須です。また [[XML]]
の[[実体宣言]]では[[システム識別子]]は必須です。またいずれも[[空文字列]]とすることもできます。

[8] [[システム識別子]]を[[空文字列]]にしてしまうと、本当に[[外部部分集合]]を読もうとする[[処理器]]
(で[[公開識別子]]から[[型録]]を引かない場合) はその[[文書実体]]自体を[[外部部分集合実体]]とみなすわけですから、
当然[[外部部分集合]]として[[整形式]]になりません。こんなんでいいんでしょうか。

[16] [[XML情報集合]]ではいずれも[RUBYB[[[無値]]]@en[no value]]となり得ます。また[[未展開実体参照情報項目]]については[RUBYB[[[未知]]]@en[unknown]]ともなり得ます。

[17] [[DOM Standard]] では [CODE(DOMi)@en[[[DocumentType]]]] の [CODE(DOMa)@en[[[systemId]]]]
を [[null]] にすることができません。 [[HTML Living Standard]] および [[Webブラウザー]]は[[システム識別子]]のない
[CODE(HTML)@en[[[DOCTYPE]]]] の場合[[空文字列]]にします。

[11] [[DOM3]] は [CODE(DOMi)@en[[[DocumentType]]]] の
[CODE(DOMa)@en[[[systemId]]]] が [CODE(IDL)@en[[[null]]]]
になる可能性に言及していません。
[CODE(DOMi)@en[[[Entity]]]], [CODE(DOMi)@en[[[Notation]]]]
については [[null]] になり得るとしていました。

* セキュリティーとプライバシー

[6] [[外部実体]]の[[セキュリティー]]の項を参照。

* 関連

[13] ほとんどすべての場面で[[システム識別子]]と[[公開識別子]]がセットで用いられます。
元々は[[システム識別子]]はシステム固有の値であって[[相互運用性]]は保証されず、
[[公開識別子]]はシステム非依存の値であって[[相互運用性]]のあるものと想定されていたようですが、
[[SGML型録]]を実装していたまともな [[SGML処理器]]以外では[[公開識別子]]はあまり意味のない記号列と化しており、
特に [[XML]] ではもっぱら[[システム識別子]]が[[実体]]を識別する用途に使われています。

* メモ

[5]
[CITE@ja[鳥さんの独り言 XHTML文書のDTDのURL(URI)は必須?]] ([CODE[2007-08-14 20:56:14 +09:00]] 版) <http://gowest.blog2.fc2.com/blog-entry-47.html>

> HTML鳩丸倶楽部さんの「文書型宣言の読み方」(URIを示すと横幅オーバーになってしまうので、ググッてください)に書かれている内容が、一般的な理解と言ってよいでしょう。

[Q[一般的な理解]]ってなにさw [[SGML]] の仕様書嫁だよw

[7] [[Netscape]] の [[RSS 0.91]] 仕様では、[[文書型宣言]]は次のいずれかでなければならないとされていました。
[FIG[
[PRE(XML example code)[
<!DOCTYPE rss PUBLIC "-//Netscape Communications//DTD RSS 0.91//EN" "http://my.netscape.com/publish/formats/rss-0.91.dtd">
]PRE]

[PRE(XML example code)[
<!DOCTYPE rss PUBLIC "-//Netscape Communications//DTD RSS 0.91//EN" ""> 
]PRE]

[FIGCAPTION[
[CITE@en[RSS 0.91 Specification (Netscape)]] ([TIME[2008-11-22 17:21:58 +09:00]] 版) <http://www.rssboard.org/rss-0-9-1-netscape#DOCTYPE>
]FIGCAPTION]
]FIG]