一直以来,OOXML 规范不断受到一些人的指责和抵制,以至于很多人都想知道它究竟有什么缺点。本文将解释反对将 OOXML 作为标准的技术原因(而非政治原因)。
我在标准化领域工作了很长时间(包括近十年来在 ISO C 标准委员会的志愿者工作)。大多数对标准化感兴趣的人对于 Microsoft? 提出的基于 XML 的文档格式 Office Open XML (OOXML) 的标准化过程都有自己的看法。通常,我并不会撰文谈论自己的观点,但就最近 IBM 努力摆脱 OOXML 这一说法,我想表明自己的观点,但首先我要明确声明:我并不是 IBM 的员工,本文所述均是我本人的观点,并且这些想法与 IBM 在这一问题上的立场无关。
从很多方面讲,OOXML 标准确实是一种重要的规范。实际上,不论是否指责 OOXML 标准化过程中的政治因素,围绕它的标准化过程始终充斥着政治纠葛(参见 参考资料)。然而,抛开所有这些政治因素,还存在严重的技术问题,范围涉及 XML 是否是标准的最佳选择以及标准化的目的。所有这些内容都为我提供了很好的切入点,我还将谈论影响 OOXML 成为标准的因素。
标准存在的目的就是实现互操作。如果我的文字处理程序和您的文字处理程序可以打开相同的文件,那么我就可以轻松地与您共享文件。如果不能的话,就会产生麻烦。这意味着,在缺乏标准的情况下,我们将花费大量的时间和精力解决缺少共享文档格式的问题。文字处理程序供应商要花费令人难以置信的时间和精力研究彼此的文档格式,以便能够互相导入和导出文件,这样,用户才能在保存文档后打开它并加以查看。
很明显,几乎所有人都可以从标准中获益。而对于文档格式,惟一的例外是既定行业内占有主导地位的公司;实际上,缺乏标准对这些公司最为有利,因为它们可以将自己的格式推广为事实 标准。这样将使它们具备双重竞争优势;所有人都必须花费额外的时间和金钱支持这种格式,并且任何人的支持都不会是最好的。
需要注意的一点是,按照定义,一个良好的交换标准不会指定每一个供应商执行的所有事情。每个供应商必须支持标准中的所有特性,这也就意味着添加到标准中的每一种特性都要被大量供应商重复处理。最好能够支持不能以标准格式在文档中编码的扩展或额外的特性。作为一名用户,我宁愿拥有一个能够在任何位置可用的标准文档,而不是一个结构非常复杂的规范,使两个供应商不能彼此配合对方的行为。
对办公文档格式进行标准化的要求非常强烈。从公司到政府等众多组织都制定了诸多规则,要求软件支持面向文档存储的开放标准。人们都不希望受制于单个供应商;标准提供了方法摆脱这种限制。从这些方面考虑,我们来审视一下 Microsoft 提出的 OOXML 标准存在的技术问题。
OOXML 标准源于 ECMA,是一组以 PDF 形式发布的文档,共 6000 页左右。它包含了大量规范,内容涵盖了很多方面。该标准之所以如此庞大,是因为 OOXML 几乎完全复制了 Microsoft Office 应用程序在文件中可能保存的所有数据块。
一直以来,对 OOXML 技术方面的抱怨不绝于耳。所有指责最后都可以归结到最基本的一点:OOXML 并没有指定恰当的通用交换格式,相反,它指定了 Microsoft Office 的整个特性集,内容具体到 bug 兼容性。这为其他实现者制造了难于实现(事实上也不可能实现)的负担,而另一方面,OOXML 标准的内容却是 Microsoft 已经附带的特性。这引起了众多问题。
请不要将此误解为仅仅是对 Microsoft 依仗自身已有特性获得竞争先机的指责;如果 Microsoft 实现的是一个小型的经过良好设计的标准,并且所有人都可以适当实现,那么我们完全可以接受该标准。这些受到指责的问题可归结为三大类:一些特性的实现非常困难,而另一些特性则没有进行充分的说明,还有一部分特性完全属于 Microsoft Office 独有。这三类问题存在一定程度的重叠,但是每一类都代表一种不同类型的障碍。
一般来讲,在标准中,实现者期望解决的问题已经得到了适当定义并确定了范围。您可能需要调整一些段落,但是所有内容都进行了指定,并且适当限制了范围。相比之下,OOXML 提出的要求缺乏明确性。例如,当描述页面标题时,提议的 OOXML 规范规定 “字体名 和字体类型 可以是本地化的值”。这个句子看似简单,却增加了问题的复杂性(由 Stéphane Rodriguez 指出。参见 参考资料)。
您可以使用哪些地区语言?您是否具有一个完整的地区列表,其中包含了其他供应商实现该规范使用的所有地区?您是否了解对字体名或字体类型实现本地化所采用的所有方式?如果一个热心的实现者选择一种您在实现时闻所未闻的语言编写字体名和字体类型,该如何是好?
这大致反映了一种基于历史经验的决策,根据它存储提供给用户或由用户挑选的本地化值。遗憾的是,如果没有详细的说明(至少要提供允许的完整地区列表以及告知正在使用哪个本地化),则不可能实现这一点。这反映了给定实现的特殊行为;对于要在多个实现之间共享的标准化格式,这并不是一种合适的选择。