* 仕様書

[REFS[
- [1] [CITE@en-US-x-hixie[HTML Standard]] ([TIME[2012-12-31 05:55:07 +09:00]] 版) <http://www.whatwg.org/specs/web-apps/current-work/#serializing-xhtml-fragments>
- [4] [CITE[DOM Parsing and Serialization Standard]] ([TIME[2012-12-24 08:36:45 +09:00]] 版) <http://domparsing.spec.whatwg.org/#serializing>
]REFS]

[2] >>1 では [CODE(DOMi)@en[[[Document]]]] や [CODE(DOMi)@en[[[Element]]]] の[[子孫]]の[[直列化]]が規定されています。
>>4 では各種 [CODE(DOMi)@en[[[Node]]]] の[[直列化]]が規定されています。

* 誤り処理

[3] >>1 は[[名前空間整形式]]にならない場合[[例外]]を投げると規定しています。また適宜[[名前空間]]の [[fixup]]
を行うよう指示しています。 >>4 でも[[例外]]は投げられますが[[名前空間]]の [[fixup]] はされないことがあります。

[5] [[Chrome]] はそれなりに[[名前空間]]の [[fixup]] を行なっているようです。しかし正しく直列化できない場合であっても[[例外]]は投げないようです。 [TIME[2013-01-02T07:57:35.700Z]]

;; [6] [[HTMLの直列化]]との整合性を考慮するなら、[[例外]]は投げないで無理に直列化する方が一貫した動作ではあります。
もちろんその場合再度[[構文解析]]しても元には戻りませんが。

* 名前空間 fixup

[7] [[Chrome]] [SRC[[TIME[2013-01-03T13:03:33.100Z]]]] は [[XML文書]]での [CODE(DOMa)@en[[[innerHTML]]]] 取得の時、
- 元の[[要素]]・[[属性]]の [[QName]] をそのまま使います。
- [[名前空間接頭辞]]が[[宣言]]されていなければ、初出の[[属性]]の直後 ([[要素]]名なら最初) に追加の[[属性]]として[[名前空間宣言]]が出力されます。
-- [[名前空間接頭辞]]のない[[属性]]なら、 [CODE(XMLa)@en[[[xmlns]]]] になります。
-- その結果[[属性]]が重複したり、他の [[QName]] の解釈に影響してしまったりしても気にしません。
-- 同じ[[名前空間URL]]で他の[[名前空間接頭辞]]が[[宣言]]されているかどうかはこれに影響しません。

[8] [[Firefox]] [SRC[[TIME[2013-01-03T13:05:46.00Z]]]] は [[XML文書]]での [CODE(DOMa)@en[[[innerHTML]]]] 取得の時、
= 元の[[名前空間接頭辞]]が有効ならそのまま使います。
= そうでなければ同じ[[名前空間URL]]で最後に[[宣言]]された[[名前空間接頭辞]]があれば使います。
= [[要素]]の[[名前空間接頭辞]]が[[宣言]]されていなければ、最初に追加の[[属性]]として[[名前空間宣言]]が出力されます。
= [[属性]]の[[名前空間接頭辞]]が無いか[[宣言]]されていなければ、 [CODE[a0]]、[CODE[a1]]、... と順に割り振られた[[名前空間接頭辞]]が使われます。[[属性]]の直後に追加の[[属性]]として[[名前空間宣言]]が出力されます。
- [[null名前空間]]の[[要素]]に [CODE(XMLa)@en[[[xmlns]]]] [[属性]]で[[名前空間URL]]が指定されている場合、最上位の[[要素]]ならその[[属性]]は削除され、他の[[既定名前空間]]がある[[要素]]の[[子要素]]なら [CODE(XML)[xmlns=""]] が追加されます。
- [[要素]]の[[名前空間URL]]が[[名前空間属性]]と矛盾するなら、 [CODE[a0]]、... が割り振られます。

* 文字参照

[9] [[Chrome]] の [CODE[innerHTML]] は、
[[属性値]]中の[CODE[<]]、[CODE[&]]、[CODE[>]]、[CODE["]] を[[文字参照]]にします。
それ以外の [CODE[U+00A0]] や [[C0]] や [[C1]] や[[サロゲート]]や[[非文字]]はそのままにします。
[TIME[2016-11-09T00:17:28.200Z]]

;; [10] つまり [[C0]] が含まれると[[整形式]]になりません。

[11] [CITE@en[Serialize non-well-formed documents too]]
([[annevk]]著, [TIME[2017-03-13 23:05:31 +09:00]])
<https://github.com/whatwg/xhr/commit/59c9cd9ae31fc8fafd1c327f2d2a1ca1e88da28f>

[12] [CITE@en[XSLT and XQuery Serialization 3.1]]
([TIME[2017-03-20 12:35:18 +09:00]])
<https://www.w3.org/TR/2017/REC-xslt-xquery-serialization-31-20170321/#xml-output>