[11] [[XML]] の[[文書実体]]の先頭に書くことができる [CODE(XML)@en[<?xml?>]] を
[DFN[XML [RUBYB[宣言]@en[declaration]]]]、[[外部解析対象実体]]の先頭に書くことができる [CODE(XML)@en[<?xml?>]]
を[DFN[[RUBYB[テキスト宣言]@en[text declaration]]]]といいます。

* XML 宣言

[12] [[XML宣言]]は[[文書実体]]の先頭に1つだけ指定することができます。

[13] [[XML宣言]]は必須ではありません。

[15] [[空白]]や[[注釈]]も含め、[[テキスト宣言]]より前に何かがあってはいけません。 ([[BOM]] はあってもOKです。)

* テキスト宣言

[6] [[テキスト宣言]]は[[文書実体]]を除くすべての[[外部解析対象実体]] ([[外部一般解析対象実体]]、[[外部引数実体]]、[[外部部分集合実体]])
の先頭に1つだけ指定することができます。

[14] [[テキスト宣言]]は必須ではありません。

[7] [[空白]]や[[注釈]]も含め、[[テキスト宣言]]より前に何かがあってはいけません。 ([[BOM]] はあってもOKです。)

[8] [[XML]] [[文書]]は [[SGML]] [[文書]]である、という建前からすると、[[テキスト宣言]]は [[SGML]]
[[処理指令]]の一種として解釈されることになりますが、[[マーク付け宣言]]の中の[[引数実体参照]]が[[参照]]する[[外部引数実体]]に[[テキスト宣言]]が含まれていると、
[[マーク付け宣言]]の[[引数]]として[[処理指令]]が含まれることになって、好ましくないように思えます。

;; [9] [[外部実体]]については[[リテラル実体値]]ではなく[[置換文]]が[[SGML実体]]に相当すると解釈すれば [[SGML]]
的には[[テキスト宣言]]は対応するものが何もない (システム側に属する何かである) ということになりますが、
そういう任意の解釈を導入してしまうと何とでも言えてしまうのでちょっと・・・。

;; [10] [[属性値]]で使われる[[一般実体参照]]からは[[外部実体]]を[[参照]]してはいけないことになっているので、
この問題は生じません。

;; [34] ここでいう「テキスト」とは、[RUBYB[[[テキスト実体]]]@en[text entity]]
([[解析対象実体]]) や[RUBYB[[[実体文]]]@en[entity text]]の「text」
の意味 (= 「parsed」) と思われます。

* 擬似属性

[16] [[XML宣言]]や[[テキスト宣言]]には、[[属性]]のように見える引数を指定することができます。
これは[[要素]]に指定される[[属性]]とは違った専用の構文を持っています。[[属性]]の順序が固定である、
特定の[[属性値]]しか使えず、[[実体参照]]も認められないなどの違いがあります。

[17] これらは[[擬似属性]]と呼ばれることがあります。ただし「[[擬似属性]]」という用語は [CODE(XML)@en[[[<?xml-stylesheet?>]]]]
で導入されたもので、[[XML]] の仕様書では使われていません。

[FIG[
[FIGCAPTION[
[18] [[擬似属性]]の一覧
]FIGCAPTION]
,[[擬似属性]]の名前,XML 仕様書での呼称,説明
,[CODE(XMLa)@en[[[version]]]],,[[XML]] の版
,[CODE(XMLa)@en[[[encoding]]]],[[符号化宣言]],[[実体]]の[[文字符号化]]
,[CODE(XMLa)@en[[[standalone]]]],[[単独文書宣言]],[[外部実体]]の有無
]FIG]

[22] [[擬似属性]]は >>16 に示した順序でのみ指定できます。

[19] [[XML宣言]]では [CODE(XMLa)@en[[[version]]]] [[擬似属性]]が必須です。

[20] [[テキスト宣言]]では [CODE(XMLa)@en[[[encoding]]]] [[擬似属性]]が必須です。

[21] [CODE(XMLa)@en[[[standalone]]]] [[擬似属性]]は [[XML宣言]]でのみ使えます。

* DOM 表現

[29] [[DOM3中核]]では [CODE(DOMi)@en[[[Document]]]] に [CODE(XMLa)@en[[[xmlVersion]]]]、
[CODE(XMLa)@en[[[xmlEncoding]]]]、[CODE(XMLa)@en[[[xmlStandalone]]]] という[[属性]]があり、
[[XML宣言]]の情報がここに現れます。

[30] 同じく[[DOM3中核]]では [CODE(DOMi)@en[[[Entity]]]] に [CODE(XMLa)@en[[[xmlVersion]]]]、
[CODE(XMLa)@en[[[xmlEncoding]]]] という[[属性]]があり、[[テキスト宣言]]の情報がここに現れます。

[31] 現在の [[DOM Standard]] では >>29 も >>30 も削除されており、[[XML宣言]]や[[テキスト宣言]]の情報にはアクセスできません。
また [[DOM3]] 仕様上も、[[引数実体]]の[[テキスト宣言]]にはアクセスできません。

[32] また [[DOM3]] 仕様上、[[XML宣言]]や[[テキスト宣言]]の有無の情報にアクセスできるのかは曖昧です。

[33] [[Chrome]] は >>29 を実装しています。今後削除されるかは不明です。 [TIME[2014-02-16T06:01:55.300Z]]

* 処理指令との関係

[27] [[XML]] の[[処理指令]]は構文上「[CODE(XML)@en[[[xml]]]]」が[[対象名]]となることを認めていません。
従って、[[XML宣言]]や[[テキスト宣言]]以外でこれらと似た[[処理指令]]を[[文書]]に含めることはできません。

[28] [[DOM]] の [CODE(DOMm)@en[[[createProcessingInstruction]]]] [[メソッド]]は[[対象名]]が
[CODE(XML)@en[[[xml]]]] かどうかチェックしません。ですから[[XML宣言]]や[[テキスト宣言]]であるかのような[[処理指令]]を含む
[[DOM]] [[木]]を作ることはできます。

* HTML における XML 宣言

[23] ([[XHTML]] ではなく) [[HTML]] では[[XML宣言]]を使うことができません。かつて [[XHTML]] を
[CODE(MIME)@en[[[text/html]]]] で提供することが流行った時代には、[[XML宣言]]を含む [[HTML文書]]が数多く生み出されました。
しかし[[HTML構文解析器]]は[[XML宣言]]を壊れた[[注釈]]と解釈するので、[[XML宣言]]に含まれる情報が解釈されることはありません。

[24] かつては[[XML宣言]]の有無が [[DOCTYPEスイッチ]]に影響する[[Webブラウザー]]がありました。

;; [25] ただし[[XML宣言]]の有無により動作を変えているというよりは、未知の文字列として扱っていたとみられます。

[26] [[HTML]] なのに[[XML宣言]]が含まれる場合、それより前に[[空白]]や[[注釈]]が含まれていることもあります。

* 関連

[SEE[ [[charset sniffing]] ]]

* メモ

[1] XML 宣言 (というか[[符号化宣言]]) って便利なんですよー。 [[NC]]4 って日本語の[[文字コード]]の判別が今ほど精度よくないんで、たまに[[シフトJIS]] と[[日本語EUC]] 間違っちゃうんです。でも、 NC4 にはもれなく XML 宣言 (や他の[[処理指令]]) をもれなく表示しちゃう機能がついてますから、それをみながら文字コードを手動で指定できますっ!

[2]
[PRE[
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<!-- saved from url=(0064)http://foo.example/ -->
<?xml version="1.0" encoding="iso-2022-jp"?><html lang=ja 
xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja"><head><title>
[INS[(略)]]
]PRE]

こういうのを見てどう思います?
出力したのは例の [[WWWブラウザ]]。

[3]
Q: XML 宣言って必須ですよね?

A: いいえ。 XML 宣言は必須ではありません。

;; XML 宣言必須説、あちこちで見かけるのですけど、お前は本当に仕様書読んだのかと問い詰めたいですよ。

;; あ、 [[XML 1.1]] をお使いであれば、必須です。

([[名無しさん]] [sage])

[4]
無料鯖とか広告のために内容を改竄する形の鯖のせいで XML 宣言が一番最初じゃなくなることがあるみたいです。
そういう鯖の利用者は XML 宣言つきにするべきではありませんね。むしろへんてこな XML 宣言はつけては'''ならない'''ですよね。
([[名無しさん]] [WEAK[2004-07-10 09:05:38 +00:00]])


[5]
[CODE(XMLa)@en[[[encoding]]]] [[擬似属性]]を[CODE(XMLa)@en[[[charset]]]]にしている人がいくらかいるみたいです。どうみても非[[整形式]]です。本当にありがとうございました。

;;
<IW:Google:"\"xml version 1.0 charset\"">

[FIG(quote)[
[FIGCAPTION[
[35] [CITE@ja[時事ドットコム:文化庁の京都移転有力に=「一部機能」軸に検討-政府]]
([TIME[2015-12-31 14:45:39 +09:00]] 版)
<http://www.jiji.com/jc/zc?k=201512/2015123000492&g=pol>
]FIGCAPTION]

> 
> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
>   <?xml version="1.0" encoding="euc-jp"?>
>   <html xmlns="http://www.w3.org/1999/xhtml" xmlns:og="http://ogp.me/ns#" xmlns:fb="http://ogp.me/ns/fb#" lang="ja">
>   <head>

]FIG]


[FIG(quote)[
[FIGCAPTION[
[36] [CITE@en[RFC 5070 - The Incident Object Description Exchange Format]]
([TIME[2017-05-07 20:04:30 +09:00]])
<https://tools.ietf.org/html/rfc5070#section-4.1>
]FIGCAPTION]

> Every IODEF document MUST begin with an XML declaration, and MUST
>    specify the XML version used.  If UTF-8 encoding is not used, the
>    character encoding MUST also be explicitly specified. 

]FIG]


[FIG(quote)[
[FIGCAPTION[
[37] [CITE@en[RFC 7970 - The Incident Object Description Exchange Format Version 2]]
([TIME[2017-05-14 16:49:04 +09:00]])
<https://tools.ietf.org/html/rfc7970#section-4.1>
]FIGCAPTION]

> Every IODEF document MUST begin with an XML declaration and MUST
>    specify the XML version used.  The character encoding MUST also be
>    explicitly specified.  UTF-8 '''['''RFC3629''']''' SHOULD be used unless UTF-16
>    '''['''RFC2781''']''' is necessary.  Encodings other than UTF-8 and UTF-16 SHOULD
>    NOT be used.  

]FIG]


[38] [CITE@en[Bogo-XML Declaration Returns to Gecko]]
([[Henri Sivonen]], [TIME[2021-06-02T07:36:32.000Z]], [TIME[2021-06-04T09:37:02.388Z]])
<https://hsivonen.fi/xml-decl/>

[39] [CITE@en[rfc3920]], [TIME[2021-06-22T06:19:09.000Z]] <https://datatracker.ietf.org/doc/html/rfc3920#section-11.4>

[[text declaration]] を[SHOULD[使え]]と言っているが実際には
[[XML宣言]]しか書けない。