W3C公司

规范XML
版本1.0

W3C建议2001年3月15日

此版本:
http://www.w3.org/TR/2001/REC-xml-c14n-20010315
最新版本:
http://www.w3.org/TR/xml-c14n
以前的版本:
http://www.w3.org/TR/2001/PR-xml-c14n-20010119
作者/编辑:
John Boyer,PureEdge Solutions Inc。,jboyer@PureEdge.com

摘要

任何XML文档都是一组XML文档的一部分在应用程序上下文中逻辑上等效,但会有所不同基于允许的语法变化的物理表示XML 1.0[XML]和XML中的命名空间[姓名]本规范描述了一种方法用于生成物理表示,即说明允许更改的XML文档。除了如果有两份文件相同的规范形式,那么这两个文档在逻辑上是在给定的应用程序上下文中等效。注意两个文档可能具有不同的规范形式,但仍然是基于特定应用程序的给定上下文中的等效通用XML规范无法满足的等价规则账户。

本文件的状态

本节描述了本文档发布时的状态。其他文件可能取代本文件。此文档系列的最新状态为由W3C维护。

本文件已由W3C成员和其他相关方审查经董事认可为W3C建议.它是一个稳定的文件,可以用作参考材料或作为规范引用引用其他文档。

本文件由IETF/W3C XML签名工作组(另请参见W3C XML签名活动声明). 这个版本包含了与前一版本相比的一些小的编辑改进版本。唯一的实质性变化是增加了对更正的引用[NFC勘误表]第页,共页TR15,Unicode码规范化表单[非金融公司]. 本勘误表更正了字符U+FB1D HEBREW LETTER YOD WITH HIRIQ的错误错误地从组成除外责任属于Unicode 3.0标准。规范XML实现现在必须(正确)在[非金融公司]处理。

Canonical XML规范在其开发过程中进行了广泛的审查由W3C进程提供。工作组成功解决了提出的所有问题在期间最后的呼吁实施并记录了互操作的存在its中的实现互操作性报告.

请将此文档中的错误报告给编辑并抄送:公共电子邮件列表w3c-ietf-xmldsig@w3.org。任何此类错误都将记录在勘误表中,网址为http://www.w3.org/2001/03/C14N-勘误表.

有关所有当前W3C技术报告的列表,请访问http://www.w3.org/TR网站.

目录

  1. 介绍
    1. 术语
    2. 应用
    3. 限制
  2. XML规范化
    1. 数据模型
    2. 文件顺序
    3. 处理模型
    4. 文档子集
  3. XML规范化示例
    1. 个人信息、评论和文件外部元素
    2. 文档中的空白内容
    3. 开始和结束标记
    4. 字符修改和字符工具书类
    5. 实体引用
    6. UTF-8编码
    7. 文档子集
  4. 决议
    1. 无XML声明
    2. 无字符模型规范化
    3. 文档元素外部空白的处理
    4. 无命名空间前缀重写
    5. 命名空间声明和属性的顺序
    6. 多余的命名空间声明
    7. 文档子集中默认命名空间声明的传播
    8. 按命名空间URI对属性排序
  5. 工具书类
  6. 致谢

1引言

XML 1.0建议[XML]指定的语法一类称为XML文档的资源。XML推荐中的命名空间[姓名]指定其他语法和语义用于XML文档。XML文档可以等效于许多应用程序在物理表示上不同的目的。对于例如,它们可能在实体结构、属性顺序和字符编码。本规范的目标是建立一种方法用于确定两个文件是否相同,或一个应用程序是否未更改文档,但XML 1.0允许的转换除外和XML中的命名空间。

1.1术语

关键词“必须”、“不得”、“必需”、“应”、“不应”、,本文件中的“应该”、“不应该”、”建议”、“可以”和“可选”将按照RFC 2119中的描述进行解释[关键词].

请参见[姓名]用于定义限定名.

一个文档子集是XML文档的一部分,由节点集,可能不包括文档中的所有节点。

这个标准形XML文档的物理表示通过本规范中描述的方法生成的文档。这个以下列表总结了更改:

术语规范XML引用规范形式的XMLXML规范化方法算法是由这个定义的吗生成给定XML文档的规范形式的规范,或文档子集。术语XML规范化指的是将XML规范化方法应用于XML文档子集。

XPath 1.0建议[X路径]定义术语节点集并指定用于表示输入XML的数据模型文档作为各种类型的节点集合(元素、属性、名称空间等),文本、注释、处理指令和根)。节点包含在或中基于表达式的求值从节点集中排除。在此范围内规范中,节点集用于直接指示每个节点是否节点应该以规范形式呈现(在这个意义上,它被用作形式数学集)。不渲染从集合中排除的节点以生成的规范形式,即使其父节点包含在节点集。然而,被省略的节点仍然可能影响其渲染子体(例如,通过增加子体的名称空间上下文)。

1.2应用

自XML1.0建议以来[XML]以及XML推荐中的命名空间[姓名]定义表示相同信息的多种语法方法,XML应用程序倾向于自由地进行对文档的信息内容。XML规范化设计为对于需要测试文档或文档子集的信息内容已更改。这是通过比较之前原始文档的规范形式完成使用文档结果的规范形式进行应用程序处理应用程序处理。

例如,XML文档规范形式上的数字签名或文档子集将允许签名摘要计算忽略了原始文档物理表示的更改,前提是这些更改被XML定义为逻辑上等价1.0或XML中的命名空间。在签名生成期间,计算摘要超过文档的规范形式。然后将文档转移到依赖方,它通过阅读文档和计算所接收文档的规范形式的摘要。这个签名方和依赖方计算的摘要的等效性(和因此,它们被计算的规范形式的等价性)确保文档的信息内容自它已经签字了。

1.3限制

两个XML文档可能具有不同的信息内容,即尽管如此,在给定的应用程序上下文中,逻辑上是等价的。尽管两个XML文档是等价的(除了本节中给出的限制之外)如果它们的规范形式相同,那么建立一种方法,如果只有当他们的规范形式是相同的。这种方法是无法实现的,部分原因是特定于应用程序的规则,例如管理不重要空白的规则和等效数据(例如。<颜色>黑色</color><颜色>rgb(0,0,0)</color>). 也有等效项由其他W3C建议和工作草案制定。会计这些额外的等价规则超出了本文的范围被应用或成为未来的主题规范。

XML文档的规范形式可能不完全可操作在应用程序上下文中,尽管发生的情况是不寻常的。此问题在某些应用中可能会引起关注因为文档的规范形式和文档的规范形式是等效的。例如,在数字签名应用程序,无法确定原始文档或非操作规范表已签名因为规范形式可以替代原始文档不更改摘要计算。然而,只有安全风险发生在以下所述的异常情况下,这些情况都可能在生成数字签名之前已解决或至少已检测到。

由于以下信息的丢失而产生的困难在中可用数据模型:

  1. 基本URI,尤其是在从替换文本派生的内容中外部通用解析实体引用
  2. 符号和外部未分析的实体引用
  3. 文档类型声明中的属性类型

在第一种情况下,请注意包含相对URI的文档[URI]仅当从特定URI访问时才可操作提供正确的基URI。此外,如果文档包含对包含相对URI的内容的外部通用解析实体引用,则相对URI将无法以规范形式运行,这将实体引用替换为内部内容(从而隐式地更改该内容的默认基本URI)。这两个问题都可能通常通过添加对xml:基础属性[XBase]添加到应用程序,然后添加适当的xml:基础属性到文档元素和所有顶级外部实体中的元素。此外,应用程序通常具有在需要规范形式之前解决相对URI的机会。例如,在数字签名应用程序中,经常检索文档并在生成签名之前进行处理。处理应该创建一个将相对URI转换为绝对URI的新文档,从而减轻新文档的任何安全风险。

在第二种情况下,外部未分析实体引用的丢失和将它们绑定到应用程序的符号意味着规范形式不能通过以下方式正确区分包含未分析数据的XML文档这种机制。这是一个不寻常的情况,因为大多数XML处理器当前放弃文档类型声明,该声明放弃了符号,实体与URI的绑定,以及绑定该属性的属性类型值设置为实体名称。对于必须服从多个条件的文件XML处理器,XML设计通常指示对未分析数据的引用在属性值中使用URI。

在第三种情况下,属性类型的丢失会影响规范根据类型以不同的方式形成。ID类型的属性停止为是ID属性。因此,任何引用规范表单使用id()功能停止运行。属性类型ENTITY和ENTITIES不属于这种情况;它们被覆盖在第二种情况。枚举类型和ID、IDREF、,IDREFS、NMTOKEN、NMTOKENS和NOTATION未能得到适当约束在以后尝试更改属性值时在应用程序处理期间替换原始文档。应用程序可以通过确保一份适当的文件来避免本案的困难在进一步的XML中使用规范形式之前,预先准备类型声明处理。这可能是一项简单的任务,因为属性列表通常从标准外部DTD子集以及任何实体和不在外部DTD子集中的符号声明通常是根据应用程序配置信息构造并添加到内部DTD子集。

虽然这些限制并不严重,但可以解决它们在未来版本的XML规范化中,如果XPath是基于XML信息集创建的[信息集]目前正在W3C开发中。

2 XML规范化

2.1数据模型

XPath 1.0建议中定义的数据模型[XPath]用于表示输入XML文档或文档子集。实现应该但不需要基于XPath实施。XML规范化是根据XPath定义的节点集的定义,并且实现必须产生等效的结果。

XML规范化方法的第一个输入参数是包含格式良好的XML文档的XPath节点集或八位字节流。实现必须支持八位字节流输入,并且还应支持通过节点集输入的文档子集功能。为了描述根据XPath节点集进行规范化,本节描述八位字节流被转换为XPath节点集。

输入的第二个参数XML规范化方法是一个布尔标志,指示是否注释应包含在XML的规范格式输出中规范化方法。如果规范形式包含注释对应于输入节点集中的注释节点,结果被调用带注释的规范XML。请注意,XPath数据模型没有为出现在文档类型声明中的注释创建注释节点(DTD)。实现需要能够生成规范的XML排除输入文档或文档中可能出现的所有注释子集。建议支持带注释的规范XML。

如果必须将XML文档转换为节点集,XPath要求XML处理器用于创建其数据模型的节点以完全表示文档。XML处理器按顺序执行以下任务:

  1. 标准化换行
  2. 规范化属性值
  3. 用字符内容替换CDATA节
  4. 解析字符和解析的实体引用

输入八位字节流必须包含格式良好的XML文档,但输入无需验证。然而,属性值规范化和实体引用解析必须按照行为执行验证XML处理器。此外,默认属性的节点(声明在ATTLIST中使用AttValue(附件值)但不是在每个元素中创建。因此,文件中的声明类型声明用于帮助创建规范形式,即使文档类型声明没有以规范形式保留。

XPath数据模型使用UCS字符表示数据。启动位置必须使用支持UTF-8型UTF-16型并转换为UCS字符域。对于UTF-16,前导字节顺序标记被视为编码和从UCS字符数据中剥离(后续零宽度非中断UTF-16数据中出现的空格不会被删除)[UTF-16,第3.2节].支持ISO-8859-1标准建议编码,以及所有其他字符编码是可选的。

必须保留根文档元素中的所有空白(除了对于通过行分隔符规范化删除的任何#xD字符)。这包括外部实体中的所有空白。根文档外部的空白必须丢弃元素。

在XPath数据模型中,存在以下节点类型:root、,元素、注释、处理指令、文本、属性和命名空间。那里存在一个根节点,其子节点正在处理指令节点,并且注释节点表示文档元素外部的信息(和文档类型声明之外)。根节点还有一个表示顶级文档元素的元素节点。每个元素节点可以具有类型为element、text、processing instruction和评论。与元素关联的属性和命名空间不是被视为元素的子节点,但它们与元素的属性和命名空间轴中包含。请注意属性和名称空间轴可能与出现的文本不直接对应在原始文档中元素的开始标记中。

注:元素具有表示非命名空间的属性节点出现在其开始标记中的属性声明以及节点到表示默认属性。

借助XPath数据模型,XML规范化是命名空间软件[姓名]然而,它不能,因此也不能使用名称空间前缀重写说明名称空间等效性(请参见第4节中的解释). 在XPath数据中模型中,每个元素和属性都有函数返回的名称名称()根据应用程序的判断,可以是原始文档中出现的Q名称。XML规范化要求XML处理器保留足够的信息,以便可以提供原始文档中出现的元素。

注:一个元素E类具有表示其命名空间声明以及任何名称空间声明在中未被覆盖的祖先E类声明、默认名称空间(如果非空)和前缀xml格式.

注:本规范支持最新的XML全体决策抨击亲戚命名空间URI如下:XML规范化的实现必须报告对包含相对命名空间URI的文档的操作失败。不能使用转换相对URI与绝对URI。

字符内容在XPath数据模型中用文本节点表示。所有连续字符都放置在单个文本节点中。此外,文本节点的字符在UCS字符域中表示。这个XML规范化方法不执行字符模型规范化(请参见第4节中的解释). 然而,XML需要使用用于准备XPath数据模型输入的处理器Unicode规范化表单C[非金融公司NFC勘误表]转换XML文档时从任何非基于UCS的编码(当前,基于UCS的编码包括UTF-8、UTF-16、UTF-16BE、UTF-16LE、UCS-2和UCS-4)。

因为XML规范化将XPath节点集转换为规范表单中,第一个参数必须是XPath节点集,或者必须是通过执行XML处理从八位位组流转换为节点集需要创建上述XPath节点,然后设置初始值XPath评估上下文:

并计算以下默认表达式:

注释参数值 违约XPath表达式
无(假) (//. | //@* |//命名空间::*)[非(self::comment())]
带(true) (//.|//@*|//命名空间::*)

此表中的表达式生成一个节点集,其中包含XML文档(如果注释参数值为false)。

如果输入是XPath节点集,则该节点集必须显式包含要呈现为规范形式的每个节点。例如XPath表达式的结果id(“E”)是包含以下内容的节点集仅与ID属性值为“E”的元素对应的节点。由于其子节点都不在集合,规范形式将仅由元素的开始和end标记,减去属性和名称空间声明,没有内部内容。第3.7节举例说明如何序列化已标识元素及其内部内容、属性和命名空间声明。

2.2文件顺序

虽然XPath节点集被定义为无序的,但XPath 1.0建议[XPath]定义术语文件秩序XML的第一个字符的顺序每个节点的表示出现在文档的XML表示中扩展常规实体后,命名空间和属性节点除外其文档顺序取决于应用程序。

XML规范化方法通过将在名称空间和属性节点上遵循其他文档顺序规则每个元素的:

词汇比较,将字符串从最小到最大排序按字母顺序,基于UCS代码点值,即相当于基于UTF-8的词典排序。

2.3处理模型

XPath节点集被转换为八进制流,即规范形式,通过为节点集中的每个节点生成代表性UCS字符以升序文件顺序,然后对结果为UTF-8(没有前导字节顺序标记)。不再处理任何节点不止一次。注意,处理元素节点E类包括处理其节点集的所有成员E类是一个祖先。因此,直接在代表性文本之后E类生成,E类以及其中的所有节点E类是否从节点集中删除了祖先(或一些发生逻辑上等效的操作,使得节点集的下一个节点文档顺序尚未处理)。但是请注意,元素节点是在处理其子节点之前,不会从节点集中删除。

处理节点的结果取决于节点的类型以及是否它在节点集中。如果节点不在节点集中,则没有文本为节点生成,但处理其命名空间和属性轴(仅元素)及其子节点(元素和根节点)。如果节点位于节点集中,则生成文本来表示节点除了处理节点的名称空间和属性轴以及子节点。

注:节点集被视为一组节点,而不是子树。规范化元素,包括其命名空间、属性和内容,节点集必须实际包含与文档的这些部分,而不仅仅是元素节点。

为节点生成的文本取决于节点类型并在中给出以下列表:

这个限定名如果命名空间前缀字符串为空,则node是本地名称,或者名称空间前缀、冒号,然后是元素的本地名称。命名空间QName中使用的前缀必须与输入中出现的前缀相同文档。

2.4文件子集

一些应用程序需要创建物理表示的能力对于XML文档子集(默认生成的子集除外,它可以如果省略注释,则成为文档的适当子集)。基于XPath的XML规范化的实现可以提供通过将节点集接受为输入而不是八位字节流。

元素节点的处理E类必须稍作修改当XPath节点集作为输入而元素的父元素被忽略时来自节点集。处理元素属性轴的方法E类在节点集中得到了增强。所有元素节点E类祖先检查轴是否最近属性在xml格式命名空间,例如xml:langxml:空间(无论他们是否在节点集)。从该属性列表中,删除E类的属性轴(无论它们是否在节点集中)。然后,按字典顺序将该属性列表与E类节点集中的属性轴。的结果访问属性轴是通过处理中的属性节点来计算的这个合并的属性列表。

注:XML实体可以从XML标记中的任何位置以及XML 1.0中未表达的规则XML建议中的命名空间。显然,无法指定这些规则在本文档中,输入节点集的创建者必须负责保留捕获的完整语义所需的信息结果节点集的成员。

为整个XML文档生成的规范XML格式良好。这个XML文档子集的规范形式可能不是格式良好的XML。然而,因为规范形式可能需要进一步的XML处理,为规范化提供的大多数XPath节点集将设计为生成规范形式,即格式良好的XML文档或经过解析的外部通用格式实体。无论是从完整文档还是文档子集,如果表单是格式良好的XML,然后是相同XML的后续应用程序规范化方法对规范形式没有任何更改。

3个XML示例规范化

本节中的示例假设一个非验证处理器,主要是这样文档类型声明可以用于声明实体以及默认属性和各种类型的属性(例如ID和枚举)必须声明文档中所有元素的所有属性。还有,一个示例包含一个故意违反有效性约束的元素(因为它仍然很完善)。

3.1个人信息,注释和文档元素外部

输入文件 <?xml版本=“1.0”?>

<?xml-stylesheet href=“doc.xsl”
type=“text/xsl”?>

<!DOCTYPE文档系统“doc.dtd”>

你好,世界注释1--></doc>

<?pi-无数据?>

<!-- 注释2-->

<!-- 注释3-->
规范形式(未注释) <?xml-stylesheet href=“doc.xsl”
type=“text/xsl”?>
你好,世界</文档>
<?pi-无数据?>
规范形式(注释) <?xml-stylesheet href=“doc.xsl”
type=“text/xsl”?>
你好,世界注释1--></doc>
<?pi-无数据?>
<!-- 注释2-->
<!-- 注释3-->

演示:

3.2文件内容中的空白

输入文档 <文档>
<清洁>
<脏>A B</脏>
<混合>
A类
<clean></clean>
B类
<脏>A B</脏>
C类
</混合>
</doc>
规范形式 <文档>
<清洁>
<脏>A B</脏>
<混合>
A类
<清洁>
B类
<脏>A B</脏>
C类
</混合>
</doc>

演示:

注:在这个例子中,输入文档和规范形式是完全相同。两者都以“>”字符结尾。

3.3开始和结束标签

输入文档 <!DOCTYPE文档[<!ATTLIST e9 attr CDATA“默认”>>
<文档>
<e1/>
<e2>
<e3 name=“elem3”id=“elem3“/>
<e4 name=“elem4”id=“elem四”>
<e5 a:attr=“out”b:attr=“sorted”attr2=“all”attr=“I’m”
xmlns:b=“网址:http://www.ietf.org"
xmlns:a=“网址:http://www.w3.org"
xmlns=“网址:http://example.org"/>
<e6 xmlns=“”xmlns:a=“网址:http://www.w3.org">
<e7 xmlns=“网址:http://www.ietf.org">
<e8 xmlns=“”xmlns:a=“网址:http://www.w3.org">
<e9 xmlns=“”xmlns:a=“网址:http://www.ietf.org"/>
</e8>
</e7>
</e6>
</doc>
规范形式 <文档>
<e1>
<e2>
<e3 id=“elem3”name=“elem3“>
<e4 id=“elem4”name=“elem5”>
<e5 xmlns=“http://example.org“xmlns:a=”网址:http://www.w3.org“xmlns:b=”网址:http://www.ietf.org“attr=”I'm“attr2=”all“b:attr=“sorted”a:attr=“out”></e5>
<e6 xmlns:a=“网址:http://www.w3.org">
<e7 xmlns=“网址:http://www.ietf.org">
<e8 xmlns=“”>
<e9 xmlns:a=“网址:http://www.ietf.org“attr=”default“></e9>
</e8>
</e7>
</e6>
</doc>

演示:

注:一些规范形式的开始标记很长,但每个本例中的开始标记完全在一行上。

注:e5(电子5)b: 属性先于a: 属性因为主键是命名空间URI而不是命名空间前缀,和属性2先于b: 属性因为默认名称空间不应用于非限定属性(因此名称空间的URI属性2为空)。

3.4字符修改和字符引用

输入文档 <!DOCTYPE文档[
<!ATTLIST normId id id#IMPLIED>
<!ATTLIST normNames属性NMTOKENS#隐含>
]>
<文档>
<text>第一行&#x0d&#10;第二行</text>
<value>&#x32</值>
<计算><![CDATA[value>“0”&&value<“10”?“valid”:“error”]]></compute>
<compute-expr='value>“0”&amp&amp;价值&lt;"10" ?“valid”:“error”'>有效</compute>
<normal attr='&apos;&#x20&#13;&#xa&#9;&apos;'/>
<normaNames attr='A&#x20&#13;&#xa&#9;B'/>
<normId id='&apos;&#x20&#13;&#xa&#9;&apos;'/>
</doc>
规范形式 <文档>
<text>第一行&#xD;
第二行</text>
<值>2</value>
<计算>值&gt;“0”&amp&amp;价值&lt;"10" ?“有效”:“错误”</compute>
有效
<norm attr=“'&#xD;&#xA;&#x9;'”></norm>
<normaNames attr=“A&#xD;&#xA;&#x9;B”></normNames>
<normId id=“'&#xD;&#xA;&#x9;'”></normId>
</doc>

演示:

注:最后一个元素,正常Id,成型良好,但违反了类型ID的属性的有效性约束。用于测试基于验证处理器的规范XML实现,删除从输入和规范形式中包含此元素的行。通常,不鼓励XML消费者使用XML的这一特性。

注:空白字符引用而不是&#x20;不是受属性值规范化的影响[XML].

注:在规范形式中,名为属性在元素中规范以空格开始撇号(单引号),然后第一个字符前有空格参考。

注:这个快递第二个属性计算元素不包含换行符。

3.5实体工具书类

输入文档 <!DOCTYPE文档[
<!ATTLIST文档attrExtEnt ENTITY#IMPLIED>
<!实体ent1“你好”>
<!实体ent2系统“world.txt”>
<!实体entExt系统“earth.gif”NDATA gif>
<!符号gif SYSTEM“viewgif.exe”>
]>
<doc attrExtEnt=“entExt”>
&ent1&ent2;!
</doc>

<!-- 让world.txt包含“world”(不包括引号)-->
规范形式(未注释) <doc attrExtEnt=“entExt”>
你好,世界!
</doc>

演示:

3.6 UTF-8编码

输入文件 <?xml version=“1.0”encoding=“ISO-8859-1”?>
<文档>&#169</文档>
规范形式 <doc>#xC2#xA9</doc>

演示:

注:doc元素的内容不是字符串#xC2#xA9,而是而是十六进制值为C2和A9的两个八位字节,即版权标志(©)的UCS码位UTF-8编码。

3.7文件子集

输入文档 <!DOCTYPE文档[
<!ATTLIST e2 xml:space(默认|保留)“保留”>
<!ATTLIST e3 id id#隐含>
]>
<doc xmlns=“网址:http://www.ietf.org“xmlns:w3c=”网址:http://www.w3.org">
<e1>
<e2 xmlns=“”>
<e3 id=“e3”/>
</e2>
</e1>
</doc>
文档子集表达式 <!-- 使用声明xmlns求值:ietf=“网址:http://www.ietf.org" -->

(//.|//@*|//命名空间::*)
[
self::ietf:e1或(parent::ietf:e1而不是(self:

count(id(“E3”)|ancestor-or-self::node())=计数
]
规范形式 <e1 xmlns=“网址:http://www.ietf.org“xmlns:w3c=”网址:http://www.w3.org“><e3 xmlns=”“id=”e3“xml:space=”preserve“></e3></e1>

演示:

注:在文档子集表达式中,子表达式(//.|//@*|//命名空间::*)选择输入中的所有节点文档,使每个文档都服从方括号中的谓词表达式。这个表达式为true第1页及其隐式命名空间节点,以及如果E3标识的元素位于祖先或自己上下文节点的路径(这样,在与E3标识的元素的联合)。

注:规范形式不包含行分隔符。

4决议

本节讨论了一些关键决策点以及每个决定的理由。尽管该规范现在定义了XML规范化XPath(XPath)而是数据模型信息集中描述的规范形式文档在大多数方面与中描述的规范形式非常相似2000年1月的规范XML草案[C14N-20000119].然而,存在一些差异,许多小节讨论了变化。

4.1无XML声明

XML声明,包括版本号和字符编码是从规范形式中省略。由于规范形式采用UTF-8编码。由于缺少版本号明确表示XML 1.0。

未来版本的XML需要包含一个XML声明指示版本号。然而,中描述的规范化方法如果没有一些修改。当需要对新版本的XML进行规范化时,可以更新此规范以将XML声明包含为XPath数据模型中缺少XML声明可能是在该时间修复(例如,根据信息集数据模型)。

4.2无字符模型规范化

Unicode标准[统一码]允许多个某些“预编字符”的不同表示(一个简单的例如“ç”)。因此,两个XML文档的内容相当于大多数应用程序的目的可能包含不同的字符序列。W3C正在准备规范化表示[字符模型]. The14N-20000119元规范XML草稿使用了这种规范化的形式。然而,许多XML1.0处理器不使用执行此规范化。此外,必须解决此问题的应用程序问题通常从开始时就强制执行字符模型规范化当创建字符内容以避免处理失败时否则可能导致(例如,参见考恩). 因此,字符模型规范化已经超出了XML规范化。然而,用于准备XPath数据的XML处理器需要模型输入(由数据模型)使用规范化表格C[非金融公司NFC勘误表]转换XML文档时从任何非基于UCS的编码(当前,基于UCS的编码包括UTF-8、UTF-16、UTF-16BE、UTF-16LE、UCS-2和UCS-4)。

4.3处理文档元素外的空白

这个14N-20000119元标准XML草稿在文档元素外的每个PI后面放置#xA和#xA在文档元素的结束标记之后。本规范中的方法执行相同的功能,除了在最后一个PI之后省略最后的#xA(或文档元素的注释或结束标记)。这种技术确保了根的PI(和注释)子级通过换行符与标记分隔开即使输出中省略了根节点或文档元素节点集。

4.4否命名空间前缀重写

这个14N-20000119元标准XML草稿描述了一种重写命名空间前缀的方法,使两个文档具有逻辑上等效的命名空间声明也将具有相同的命名空间前缀。目标是消除对特定测试逻辑等效时,文档中的命名空间前缀。然而,现在存在许多上下文,其中命名空间前缀可以在XML文档中赋予信息价值。例如,XPath表达式在属性值或元素中,内容可以引用命名空间前缀。因此,重写名称空间前缀会通过更改其意思(如果它的意思改变了,它就不能在逻辑上等价)。

更正式地说,让D1是一个在属性中包含XPath的文档引用D1中使用的命名空间前缀的值或元素内容。进一步假设D1中的命名空间前缀都将由规范化方法。让D2=D1,然后修改D2中的名称空间前缀并修改XPath表达式对命名空间前缀的引用,以便D2和D1在逻辑上保持等效。由于命名空间重写不会在属性值和元素中包含命名空间引用的出现内容,D1的标准形不等于D2的标准型因为XPath会有所不同。因此,尽管命名空间正在重写规范化名称空间声明,目的是消除对文档中没有特定的名称空间前缀。

此外,可以证明名称空间重写是有害的,而不仅仅是无效。让D1是包含XPath的文档引用中使用的命名空间前缀的属性值或元素内容D1.进一步假设D1中的命名空间前缀都将被重写规范化方法。现在让D2成为D1的标准形式。显然,D1和D2的规范形式是等价的(因为D2是规范形式但D1和D2在逻辑上并不等价因为前面提到的XPath在D1中工作,而在D2中不工作。

请注意,可以针对XML调整类似的参数基于限制,这些问题不容易解决这些情况,而在这里我们有机会故意避免引入这样的限制。

必须测试逻辑等效性的应用程序必须执行更多比单纯的八位字节流比较更复杂的测试。然而,这相当在任何情况下都可能需要测试逻辑等效性基于应用程序规则以及其他XML相关规则建议、工作草案和未来工作。

4.5名称空间的顺序声明和属性

这个14N-20000119元标准XML草稿在名称空间声明和属性声明之间交替。这是命名空间前缀重写方案的一部分,该规范消除。该规范遵循XPath数据模型命名空间节点位于所有属性节点之前。

4.6多余命名空间声明

不必要的命名空间声明不是以规范形式进行的。无论是空默认命名空间、非空默认命名空间还是命名空间前缀绑定,XML规范化方法省略声明如果它确定直接父元素在规范中形式在范围中具有等效声明。根文档元素是由于它没有父元素,因此进行了特殊处理。所有命名空间声明在中保留,但空默认命名空间的声明是自动忽略。

相对于简单呈现的整个命名空间上下文的方法每个元素的实现不会受到超过一个常量因素的阻碍在处理时间和内存使用方面。其优点包括:

请注意,在文档子集中,一个从其祖先元素中删除的元素元素链将呈现为具有名称空间的规范形式可能在其遗漏的祖先身上做出的声明,从而保存元素的含义。

4.7文档子集中默认命名空间声明的传播

XPath数据模型表示一个空的默认命名空间节点,不存在具有空值的默认命名空间节点。因此,关于元素e3(电子3)在以下方面示例没有限定名称空间,我们无法区分<e1 xmlns=“a:b”><e1 xmlns=“a:b”><e2>. 我们只知道e3(电子3)不是输入限定的命名空间,因此我们保留有关输出的信息,如果第2页省略,以便e3(电子3)不采用的默认命名空间限定第1页.

4.8按命名空间URI对属性排序

考虑到需要保留文档中声明的名称空间前缀,使用前缀而不是名称空间URI对属性进行排序主键是可行的,并且更容易实现。然而,命名空间URI是选择为主键,因为这更接近XML中的命名空间规范,用于识别名称空间按URI和本地名称,而不是按前缀和本地名称。影响排序是将同一名称空间中的所有属性组合在一起。

5参考文献

14N-20000119元
规范XML版本1.0,W3C工作草案。T.Bray,J。克拉克、J.陶伯和J.考恩。2000年1月19日。http://www.w3.org/TR/2000/WD-xml-c14n-20000119.html.
字符模型
万维网的字符模型,W3C工作草案。编辑。Martin J.Dürst、François Yergeau、Misha Wolf、Asmus Freytag和Tex Texin。http://www.w3.org/TR/charmod网站/.
考恩
字符模型规范化的有害影响示例XML格式信函签名工作组邮件存档。约翰·考恩,7月7日,2000http://lists.w3.org/Archives/Public/w3c-ietf-xmldsig 2000年7月至9月/0038.html.
信息集
XML信息集,W3C工作草案。约翰·考恩和理查德·托宾编辑。http://www.w3.org/TR/xml-infoset.
ISO-8859-1标准
ISO-8859-1拉丁文1字符集.http://www.utoronto.ca/webdocs/HTMLdocs/NewHTML/iso_table.html网址:http://www.iso.ch/cate/cat.html.
关键词
RFC中用于指示需求级别的关键词、IETFRFC 2119。S.Bradner(布拉德纳)。1997年3月。http://www.ietf.org/rfc/rfc2119.txt.
命名空间
XML中的命名空间,W3C推荐标准。编辑:Tim Bray,DaveHollander和Andrew Layman。http://www.w3.org/TR/REC-xml-names网站/.
非金融公司
TR15,Unicode规范化表单。M.Davis和M.Dürst。修订18:1999年11月。http://www.unicode.org/unicode/reports/tr15/tr15-18.html.
NFC勘误表
规范化勘误表Unicode联盟。http://www.unicode.org/unicode/uni2errata/Normalization_Corrrentication.html.
Unicode码
Unicode标准,3.0版。Unicode联盟。十亿美元0-201-61633-5.http://www.unicode.org/unicode/standard/versions/Unicode3.0.html.
UTF-16型
UTF-16,ISO 10646编码,IETF RFC第2781页。P.霍夫曼,F.耶尔戈。2000年2月。http://www.ietf.org/rfc/rfc2781.txt.
UTF-8型
UTF-8,ISO 10646的转换格式,IETF RFC 2279。F、。耶尔戈。1998年1月。http://www.ietf.org/rfc/rfc2279.txt.
URI(URI)
统一资源标识符(URI):通用语法、IETF RFC2396.T.Berners-Lee,R.Fielding,L.Masinter。1998年8月http://www.ietf.org/rfc/rfc2396.txt.
XBase(XBase)
XML基础编辑:乔纳森·马什。2000年6月7日。http://www.w3.org/TR/xmlbase/.
XML格式
可扩展标记语言(XML)1.0(第二版), W3C建议。编辑:Tim Bray,Jean Paoli,C.M.Sperberg-McQueen和伊芙·马勒。2000年10月6日。http://www.w3.org/TR/REC-xml.
XML DSig
XML签名语法和处理IETF草案/W3C候选人推荐。D.Eastlake、J.Reagle、D.Solo、M.Bartel、,J.Boyer、B.Fox和E.Simon。2000年10月31日。http://www.w3.org/TR/xmldsig-core/.
XML全体决策
W3C XML关于命名空间声明中相对URI引用的全体决策, W3C文档。2000年9月11日。http://lists.w3.org/Archives/Public/xml-uri/2000年9月/0083.html.
XPath(XPath)
XML路径语言(XPath)1.0版,W3C推荐标准。编辑詹姆斯·克拉克和史蒂文·德罗斯。1999年11月16日。http://www.w3.org/TR/1999/REC-xpath-19991116.

6确认(信息性)

以下人员提供了宝贵的反馈,提高了质量本规范中: