* 排他的 XML 正準化仕様 (大文字)
[1] 
[DFN[[RUBY[排他的][はいたてき]@en[Exclusive]] XML [RUBY[正準化][せいじゅんか]@en[Canonicalization]]]]は、
[[XML]] [[文書]]の一種の[[正準形]]を作成する方法を規定した仕様です。

[[正準XML]] 仕様により [[XML]] [[文書]]の一部分の[[正準形]]を作成すると、
その外側の[[名前空間宣言]]や [CODE(XMLa)@en[[[xml]]:[VAR[*]]]]
[[属性]]が[[継承]]されるため、[[電子署名]]など一部の[[応用]]で不都合が生じていました。
[[排他的XML正準化]]仕様による[[正準形]]の作成方法を使えば、
このような影響を排除できます。

[2] 仕様書:
- [CITE[Exclusive XML Canonicalization Version 1.0]] 
-- 最新版
<http://www.w3.org/TR/xml-exc-c14n/>
== [14] 
[CITE@en[Exclusive XML Canonicalization Version 1.0]], [TIME[2018-10-09T13:20:56.000Z]], [TIME[2021-05-18T01:02:53.020Z]] <https://www.w3.org/TR/2002/REC-xml-exc-c14n-20020718/>
--- [[正誤表]]
<http://www.w3.org/2002/07/xml-exc-c14n-errata>

[3] '''応用'''

排他的 XML 正準化が想定している[[応用]]は、
[[正準XML]] と似ていますが、 [[XML]] 
的文脈が変わり得るものです。
[SRC[排他的 XML 正準化 1.0 1.2]]

例えば、[[署名]]のために別の[[名前空間]]の[[要素]]の中にある[[文書]]片を入れると、
その入れた中身にまで[[名前空間宣言]]が適用されてしまうので、
[[正準XML]] では中身だけ[[正準化]]しても、
[[名前空間宣言]]まで含まれてしまいます。
[[排他的XML正準化]]はこの問題に対処するために開発されました。

[5] 例えば、
[PRE(XML example code)[
   <n1:elem1 xmlns:n1="http://b.example">
       content
   </n1:elem1>
]PRE]
を[[封筒]]に包み、
[PRE(XML example code)[
   <n0:pdu xmlns:n0="http://a.example">
      <n1:elem1 xmlns:n1="http://b.example">
          content
      </n1:elem1>
   </n0:pdu>
]PRE]
とした[[文書]]を転送したとします。転送先で[[封筒]]の[[内容]]を
[[XPath]] [[式]]
[PRE(XPath example code)[
(//. | //@* | //namespace::*)[ancestor-or-self::n1:elem1]
]PRE]
で選択し、 (素の) [[正準XML]]
化すると、
[PRE(XML example code)[
   <n1:elem1 xmlns:n0="http://a.example" xmlns:n1="http://b.example">
       content
   </n1:elem1>
]PRE]
のようになります。 [SRC[排他的 XML 正準化 1.0 2.1]]
[[封筒]]のための[[名前空間]]が残ってしまいます。
[[排他的XML正準化]]すると、
[PRE(XML example code)[
   <n1:elem1 xmlns:n1="http://b.example">
       content
   </n1:elem1>
]PRE]
となります。

[4] '''制約'''

[[正準XML]] と[[排他的XML正準化]]の違いは、
[[排他的XML正準化]]の利点 (というか目的)
であると同時に、欠点でもあります。

[[排他的XML正準化]]には2つの欠点があります。
[SRC[排他的 XML 正準化 1.0 1.3]]
- [[文書部分集合]]の外 (かつ[[祖先]]) の
[CODE(XMLa)@en[[[xml]]:[[lang]]]]、
[CODE(XMLa)@en[[[xml]]:[[space]]]]、
[CODE(XMLa)@en[[[xml]]:[[base]]]]
は (本来[[継承]]されますが) 失われます。
予め[[文書部分集合]]内の[[要素]]に明示しておくしかありません。
- [[文書部分集合]]の外 (かつ[[祖先]]) で[[宣言]]されている、
[[可視的利用]]されていない[[名前空間接頭辞]]の関連付けは失われます。
例えば [[XPath]] [[式]]でしか使われていない[[名前空間接頭辞]]の[[宣言]]は失われます。
予め[[文書部分集合]]内の[[要素]]に明示しておくか、
[[包括的名前空間接頭辞並び]]に[[名前空間接頭辞]]を含めておく必要があります。

[[#comment]]

* 排他的 XML 正準化 (小文字)

[3]
> [[用語]][DFN[[RUBY[排他的][exclusive]] XML [RUBY[正準化][せいじゅんか]@en[canonicalization]]]]は、
[[XML]][[文書部分集合]]に[[排他的XML正準化法]]を適用する処理を指します。

;; 出典: <IW:XC14N:"#def-exclusive-XML-canonicalization">

[6] '''識別'''

[[XMLデジタル署名]]や[[XML暗号化]]の
[CODE(XMLe)@en[[[Transform]]]] や
[CODE(XMLe)@en[[[CanonicalizationMethod]]]]
には、[[排他的XML正準化]]を表す次の [[URI]]
を指定できます [SRC[排他的 XML 正準化 1.0 4.]]:

-[7] [CODE(URI)@en[[[http://www.w3.org/2001/10/xml-exc-c14n#]]]]
([[注釈]]なし)
-[8] [CODE(URI)@en[[[http://www.w3.org/2001/10/xml-exc-c14n#WithComments]]]]
([[注釈]]あり)

;; [[正準XML]] と同様、[[注釈宣言]]を残すか否かで2種類あります。

[[包括的名前空間接頭辞並び]][[引数]]は、
[CODE(XMLe)@en[[QN[[[InclusiveNamespaces]]][[[http://www.w3.org/2001/10/xml-exc-c14n#]]]]]]
[[要素]]で指定できます。

* 歴史

- [12] [CITE@en[rfc3741]], [TIME[2021-05-18T01:00:39.000Z]] <https://datatracker.ietf.org/doc/html/rfc3741>
-- [13] [CITE[RFC Errata Report » RFC Editor]], [TIME[2021-05-18T01:02:21.000Z]] <https://www.rfc-editor.org/errata_search.php?rfc=3741&rec_status=0>

* メモ

[9] [[RDF/XML]] (2004年版) と [[RDFa 1.1]] は [[rdf:XMLLiteral]] の[[直列化]]のために[[排他的XML正準化1.0]] を使っています。

[10] [[RDF 1.1]] の [[RDF/XML]] は使っていません。

[11] [CITE@en[SAML Specifications | SAML XML.org]]
( ([TIME[2014-09-02 22:28:44 +09:00]] 版))
<http://saml.xml.org/saml-specifications>

[15] [CITE@en[rfc4154]], [TIME[2021-07-14T04:02:46.000Z]] <https://datatracker.ietf.org/doc/html/rfc4154#section-5.8.1>