上一篇重点介绍了OpenOffice.org的技术体系结构。它的分层架构、UNO组件模型、基于IDL的API和SDK等等都是使OpenOffice.org获得广泛应用和好评的技术优势所在。
OpenOffice.org中的另一大特点是完全公开并充分记录的、可扩展和标准化的XML文件格式。该文件格式可以持久保存数据,用户不虞担心无法访问年代久远的文件,或者需要为此付出高昂的代价。基于该文件格式的架构和应用,开发者也可以轻松实现支持客户化的外部文件格式,与网络服务等其他应用集成。
随着整个社会信息化程度的提高,办公软件已经成为社会信息基础设施的一部分。不论是个人消费者,还是企业、政府、和其它非盈利机构,都会或多或少地使用文字处理、电子表格、演示文稿、简单绘图和图像处理这样的功能,办公软件已经成为计算机使用中的日常需求。对于办公软件的团体用户来说,除了基本的办公“生产力”应用外,他们还有其他一些需求:
能够支持附加处理和集成功能:比如文件的归档和索引功能,校验文件内容的合法性,支持与数据库和工作流的集成,能够批量处理文件等;
文件具有长期的可读性:这对于那些需要处理历史悠久的文件的大型团体(比如政府、博物馆、大型企业等)分外重要;
文件独立于应用程序,最好是独立于提供者,这样用户就不会被锁定在某个文件格式上而被迫延续使用;
文件格式统一,避免非结构化的、混乱的工作流和多种文件格式混杂。
而现在用户所使用的专有办公软件无法轻易满足以上的这些要求,这是因为:
专有办公软件可以提供对附加功能和集成的支持,可是这需要附加的许可证和高额费用。
专有办公软件的文件通常都是不公开的,甚至是附带专利的,这样早期软件所支持的文件格式完全要期待软件厂商在后续版本中提供支持,这些支持通常是需要付费的,由于软件商的某些目标和企业行为甚至是不可得的。
专有办公软件的文件通常都是依附于特定应用程序,甚至是特定版本的,这样用户就会为了保持对以前文件的访问而被锁定在某个软件上,这种代价通常是高昂的。
专有办公软件的文件通常都是自成体系,经常由于利益问题导致文件交换困难,从而多种格式并存。
用户希望办公软件能够在保持功能的基础上开放文件格式,这样团体用户可以自己完成附加功能和集成工作;文件的长期可读性也可以保证,因为访问文件的应用程序可以由第三方实现;而由此文件也独立于软件商和特定应用程序,用户真正掌握了自己的数据和信息;文件格式也可以通过公开协商的方式实现统一。
随着办公自动化和信息化,政府、企业等团体用户在日常工作中的业务流转已经逐步过渡到需要自动完成的阶段,而办公软件通常会被团体用户用来支持工作流(Workflow)1。工作流中的一个重要内容就是实现工作文件在流程中恰当地运转以完成整个业务,而这里所指的文件很可能是团体用户所在行业规范的文件,或者是用户自定义的文件。实际上,在政府公文2、法律文件3、税务记录4、专利管理5、会议论文6、科技文件7、技术规范8、电子书籍9、盲人书籍10、新闻稿件11、投资研究12、文字研究13、人力资源14、采购销售、财务报表15、医疗16、保险17、零售18、金融19等方面、甚至整个电子商务系统20,国际上有团体或者联盟已经开始、甚至是完成了这些专用文件格式规范的制定。
中国政府也在基于XML着手制定《中文办公软件文件格式规范》21和《基于XML的电子公文格式规范》22;国家知识产权局为实现专利受理自动化而制定的《以电子文件形式提出的专利申请请求类文件类型定义[DTD](试行)》23已经于2004年公布,并开始接受专利电子申请;中国证监会参考XBRL12制定的《上市公司信息披露电子化规范》在2004年通过审批,上海证交所已经推出了相关的服务;税务部门在某些税种内已经开始施行了基于XML的数据表示方式。
这些为特定目的定义的文件规范要求和定制好的结构化工作流紧密配合。对于专有办公软件来说,支持这些文件规范意味着要在保持传统办公软件使用模式的基础上,根据需要提供扩展功能。也就是要即能保证对市场中广泛使用的文件的兼容性,又要提供附加工具支持对文件语义的操作,在通用格式和专用格式间转换。要支持这样的扩展功能,在没有充分了解专有办公软件内封闭的文件格式的条件下是很难实现的。
团体用户通常在采用某种文件格式存储数据和信息后都希望能够保存尽可能长的时间,并且保证文件格式的稳定、或者是受控地演化,这样用户才能保持为此及相关系统的投资收益率并尽可能地降低总持有成本。而封闭的文件格式常常会导致丢失信息,或者是成本居高不下。
这个问题根本的解决之道在于文件格式的开放和标准化。只有文件格式开放了,才能够实现充分竞争,由此降低成本;只有标准化了,文件才能够稳定地演化,数据和信息才能更通畅地流转,也能够被更广泛地支持,出现更多的工具,用户才会有更多的选择。这是一个用户和业界双赢的途径。
为了满足如上用户的需求,OpenOffice.org采用了可扩展标记语言(eXtensible Markup Language,XML)作为本地文件格式规范24的基础。采用XML作为办公软件的文件格式,能够轻松实现各种集成和扩展处理。通过定义办公软件特定的标记,这种文件格式能够支持所有的办公软件的功能,易于生成和处理文件,而且不会被某个软件商或应用程序锁定。为了实现文件格式的标准化,OpenOffice.org还参与发起了OASIS开放办公XML格式技术委员会25,目标就是制定开放办公软件XML文件格式规范。
办公软件文件格式同行业专用文件和页描述文件格式有显著的区别。
绝大多数的行业专用文件只定义了文件中具有特定逻辑的内容,文件的显示样式在外部独立地实现,内容是它们的关注点。而页描述文件(例如Adobe PostScript、PDF和其他小样格式)通常是在特定页中定义了内容的显示方式,对于内容中的逻辑是不作规定的。
办公软件文件的内容通常具有一定的逻辑关系,例如章节和标题层次,而且也需要确定它的显示样式,例如字体字号和缩进等。那么就有两种实现方式:一种是将样式和内容混合起来表示,样式就嵌入在内容流里;另一种是将样式与内容分离开来表示,通过某种映射联系起来。前者的优点在于格式简单,缺点是嵌入在内容中的样式很难管理,而且由于重复样式会产生很多的冗余信息。后者正好与前者相反,格式相对复杂但层次较为清晰,样式单独保存有利于提高数据表达信息的效率,并且方便对样式和内容分别进行处理。
OpenOffice.org的XML文件格式采用的就是后一种实现方式。
采用了样式与内容分别处理的OpenOffice.org XML文件格式,需要处理的一个问题是:如何处理文件内的非文字内容(例如图像、OLE对象和打印机设置信息),如何管理这么多数据部分?
OpenOffice.org针对多部分的文件采用了压缩打包26的方式。也就是说,将样式、内容、设置信息、元数据、和图像等非文字内容等采用通用压缩算法打包,访问时针对特定的部分进行解包和再打包。这样做的好处是统一管理,单独处理,文件尺寸更小,而且压缩算法和打包的ZIP文件格式也是各平台上都可得的,无专利隐患,并有开源软件的支持。
对于某些需要嵌入在文字内容流中的非文字对象,OpenOffice.org XML文件格式采用Base64的编码方式将其嵌入的。
OpenOffice.org XML文件格式从设计之初就非常注重标准化。为了能够更好地同其他信息格式交互,OpenOffice.org XML充分利用了现有的行业标准,不是“重新发明轮子”,而是在这些标准的基础上组建自己的办公软件文件格式。比如它直接采用了MathML27、XLink、Dublin Core28,重复利用了XHTML、SVG29、XSL-FO30、CSS中的内容,在此基础上融合创新而成OpenOffice.org XML文件格式。
在OpenOffice.org的实现架构中实际上还充分支持了XSLT31,下一版的OpenOffice.org 2.0还会支持刚发布不久的XForms32。
OpenOffice.org XML文件格式,不仅仅是把现存的数据结构简单地XML化,也不是进行某种“拥抱-扩展-消灭”(Embrace-Extend-Extinguish,EEE)33的实践。
OpenOffice.org XML文件格式完全遵从于XML及其命名空间规范,所有的信息都通过结构化的XML来保存。没有信息存在于文件的物理表示方式中,没有信息存在于注释中,也没有信息存在于特别的节点名或者值中,更没有在值的“子格式”中保存信息。
为了统一文件格式,OpenOffice.org中所有相同功能的模块都采用同一概念和表示方式。这样在应用中就有很多的通用格式模型可以重复使用,提高了数据表示信息的效率。
如上所述,OpenOffice.org XML文件格式中引用了很多外部标准,比如XML 1.0、SVG 1.0、XML Namespace、XSLT 1.0、XPath 1.0、XLink 1.0、XSL-FO 1.0、HTML 4.01、ISO 860134、ISO 63935、ISO 316636等。而OpenOffice.org XML文件格式为了表示不同性质的内容,又为不同性质的数据内容定义了15个命名空间以便于区别管理。比如表示公共信息的xmlns:office、表示样式信息的xmlns:style、表示脚本的xmlns:script、表示文本的xmlns:text、表示元数据的xmlns:meta等。由于OpenOffice.org XML文件格式公布时W3C XML Schema还没有制定出来,所以它采用了传统的DTD进行数据类型定义。
图
1 OpenOffice.org
XML文件根结点
图1是OpenOffice.org的文件基本结构。办公文件根结点<office:document>下包含的元素是:元数据<office:meta>、全局设置<office:setting>、脚本<office:script>、字体声明<office:font-decls>、普通样式<office:styles>、自动样式<office:automatic-styles>、主样式<office:master-styles>、内容体<office:body>。
子文件名 |
根元素 |
子文件内容 |
---|---|---|
meta.xml |
<office:document-meta> |
文件元信息(例如作者和创建时间):<office:meta> |
styles.xml |
<office:document-styles> |
文件中使用的样式:<office:font-decls>、<office:styles>、<office:automatic-styles>、<office:master-styles> |
content.xml |
<office:document-content> |
文件内容及其使用的自动样式:<office:script>、<office:font-decls>、<office:automatic-styles>、<office:body> |
settings.xml |
<office:document-settings> |
全局设置(例如窗口大小和打印机设置):<office:setting> |
表 1 OpenOffice.org XML文件压缩包结构
实际上在OpenOffice.org的文件压缩包内,以上这几个部分被分别存储在相关的几个子文件内,如表1中所示。
OpenOffice.org XML文件的两个基本属性是类型和版本。文件类型通过<office:document>或<office:document-content>根结点的属性@office:class表示,可能的类型包括文字、主控文档、电子表格、绘图、演示文稿、图表等。
其中的“主控文档”是一类特殊的文字文件。主控文档由若干子文件构成,每个子文件实际上都是完整且独立的文件,链接到主控文档的“区域”中来。在主控文档中可以为这些区域定义主控样式,这些样式会在主控文档中应用到子文件上去。主控文档特别适合多人著述时使用。不同的作者撰写不同的章节,只要在主控文档中应用同样的样式,所有的内容就都被统一排版了。这样OpenOffice.org就能够在著作层次上实现内容和样式的分离管理。
OpenOffice.org XML文件中的校验和向前兼容性处理由文件根结点的属性@office:version控制。这个属性保存文件的当前版本,这样不同版本的OpenOffice.org访问文件时,会调用不同版本的文档模型。利用XML优秀的可扩展性,OpenOffice.org的不同版本能够方便地访问其他版本生成的文件,并最大程度上地保证兼容性。
压缩包内各个文件的相关信息由一个专门的列单文件(META-INF/manifest.xml)存储。它的主要内容包括:包内所有文件的列表、每个文件的媒体类型、包内被加密的文件所需要的解密信息。
OpenOffice.org XML文件格式采用的是样式与内容分离管理的方式。而样式实际上分为三大类:
普通样式:OpenOffice.org用户界面上可以看到的表示格式的样式,有时为了与其他样式区分称为普通样式。普通样式就是对OpenOffice.org XML文件格式不了解的用户眼中的样式。
自动样式:用户直接给对象(例如段落)设置的排版属性包含于自动样式。自动样式由OpenOffice.org在文件输出时自动生成。自动样式只包含设定于特定对象的排版属性。
主样式:包含应用于文件内容并一起显示的排版信息和附加内容的样式。比如OpenOfficr.org Draw主页中的图像背景,又如OpenOffice.org Writer主页中的页眉和页脚。主样式又分为普通主样式和自动主样式。
OpenOffice.org XML文件中的样式间支持继承关系,但被继承者只能是普通样式。在普通样式和自动样式中还根据包含的内容不同划分为不同的家族,例如段落、区域、文字、表格、图表、图形等,继承也只能在同家族的样式间进行。
OpenOffice.org XML文件格式中的样式也支持条件映射,也就是说可以在满足特定逻辑判断条件下映射为另一样式。这些条件映射还可以进行组合。
OpenOffice.org XML文件格式中的页样式(最常见的主样式),实际上由两部分组成:页主样式<style:page-master>和主页样式<style:master-page>。页主样式隶属于自动样式,主要描述页的物理和几何属性,例如页大小、页边距、页眉和页脚高度等。而主页样式是文件中的页模板,位于主样式<office:master-styles>结点内。它包含一个指向页主样式的引用,以及页上显示的静态信息,例如静态的页眉页脚和背景等。
OpenOffice.org XML文件格式中也为数据定义了丰富的样式,时间、日期、货币、数值、科学计数、百分数、分数等数据格式类型定义到了最小元素,完全不存在表达特定含义的编码子元素与字符串。在表示语言的ISO-639标准和表示国家地区的ISO-3166标准的基础上,支持近百种locale组合的数据表示方法。
OpenOffice.org XML文件格式中的文字内容主要由段落、标题、列表、表格、目录、索引、参考书目等构成,其中最基本的元素是段落。
段落用<text:p>表示,章节标题<text:h>可以看作是被标记为标题的特殊段落,它的特性大抵与段落相同。段落又由行内文本元素(Inline Text Element)构成。行内文本元素指的是文字区跨<text:span>和文本、脚注、尾注、书签、引用、链接锚、域和其他文字标记等,而文字区跨<text:span>所包含的也是行内文本元素。所以,从文件格式上讲文字区跨<text:span>是可以嵌套的,但是实际上OpenOffice.org输出的XML文件并不包含嵌套的文字区跨,因为这样的结构会更加复杂。段落内文字间的软回车<text:line-break>、空格符<text:s>和横向制表符<text:tab-stop>都是用元素来表示的,所以直接嵌在文本中的排版控制符号是不被OpenOffice.org识别的。
OpenOffice.org XML文件格式中的列表分为无序列表<text:unordered-list>和有序列表<text:ordered-list>两种。无序列表指的是由标记符号或图片引导的列表,而有序列表通常由各种数字或其本地语言文字表示引导。列表由若干列表头<text:list-header>和列表项<text:list-item>组成,而列表项又可包含段落、章节标题、无序或有序列表。被任意列表项包含的无序或有序列表实际上就是该列表项所在列表的子列表,或者说次级列表。OpenOffice.org就是这样通过列表嵌套来实现多级列表的。
表格<table:table>主要由表列组<table:table-columns>、表头行组<table:table-header-rows>和表行组<table:table-rows>构成,其中各组又分别包含单个表列、表头行和表行。表头行<table:table-header-row>表示在每页重复的表头,而表行<table:table-row>表示普通的表格内容。表头行和表行都由表单元格<table:table-cell>和<table:covered-table-cell>组成,后者表示表单元格合并后被覆盖的单元格。表单元格可以包含子表、段落/章节标题、列表和其他图形对象。表格的内容主要由表行包含的表单元格控制。
OpenOffice.org XML文件格式中的Writer和Calc应用都包含表格,所以它们采用了统一的定义。但是它们之中的表格在实施上还是有一些区别的:
Calc中的表行和表列具有相对丰富的特性,比如隐藏、合并等功能,而在Writer中则没有;
Calc中没有表头行的概念,表列与表行在概念上是平等的,表单元格只是依附于表行表示;而Writer中有可重复出现的表头行,表行是主要内容结点,表列是次要结点,只有横表头行而没有纵表头列,所以只支持纵向表;
Calc中的表单元格是表格的原子单位,不能拆分、只能合并;而Writer中的表单元格既能拆分又能合并,但是纵向合并表示为子表<table:sub-table>,由于以表行为主要内容结点,所以纵向合并实际上存在某些限制;
Calc中有表源<table:table-source>和表方案<table:table-scenario>的概念,还有命名区域、条件格式、公式计算、筛选、排序、合并计算、汇总、大纲等数据处理功能,以及丰富的数据样式;而Writer中的表格功能就非常有限。
因为OpenOffice.org Calc是专用的表格化数据处理应用,而OpenOffice.org Writer中的表格只是实现了部分简单的表格功能,所以两者在OpenOffice.org XML文件格式中的表格部分具有比较明显的区别,Writer中的表格相对简单,但是具有一些文字处理方面的特性。
OpenOffice.org中的图形应用是指绘图(Draw)和演示文稿(Impress),而实际上无论功能还是XML文件格式,绘图都是演示文稿的子集。演示文稿应用中具有一些绘图没有的功能,比如放映设置等。图形内容也可以插入到Writer和Calc中。
OpenOffice.org XML文件格式中的图形应用也具有主样式,通过主页样式、页主样式和传单主样式<style:handout-master>来确定。而图形内容主要通过内容体下的绘图页<draw:page>来表示。绘图页中可以包含众多的绘图元素,例如矩形、直线、折线、多边形、路径、圆、椭圆、连接线、标注、页缩略图、图元组等等。绘图页还可包含命名空间xml:dr3d下的3维图形容器元素:3-D场景<dr3d:scene>。3-D场景可以容纳的元素包括:光线、立方体、球体、多边形拉伸体、多边形旋转体等。
OpenOffice.org Impress特有的设置是通过其他一些元素来定义的。比如内容体中表示演示设置的<presentation:settings>、绘图页中表示演示笔记的<presentation:notes>和表示演示动画的<presentation:animations>等。
OpenOffice.org的其他应用,比如文字处理和电子表格中同样可以包含绘图内容。在这些应用中不需要绘图页这样的专用绘图容器元素,各种绘图元素可以直接放置于段落、文字区跨、表单元格、甚至内容体之内。
OpenOffice.org XML文件格式支持窗体(form)与控件(control),窗体是指包含与用户交互的控件的容器,所有的控件必须要处于某个窗体内部。
窗体集<office:forms>位于内容体之内,并可包含若干窗体<form:form>。每个窗体可包含窗体属性<form:properties>、关联事件<office:events>、若干控件<form:control>、甚至嵌套窗体。控件的种类也很多,包括文字、文字区域、固定文字、文件选择、密码、格式化文字、按钮、图片、检验盒、列表盒、单选盒、组合盒、控件框、图片框、隐藏控件、数据表格、和泛控件等。
控件是数据可感知的,若干控件组合起来可以方便地表示数据源中的数据。控件还可以和各种事件关联起来,通过宏或者其他方式实现数据的自动处理。
OpenOffice.org XML文件格式中的窗体和控件未来会迁移到W3C XForms标准上来。
OpenOffice.org XML文件格式中的图表<chart:chart>总是位于内容体之下。图表支持线条、平面、圆、环、散列、放射、柱、条等类型及其3-D形式,还支持add-in的外部绘图方式。
图表包含若干元素,标题<chart:title>、子标题<chart:subtitle>、图例<chart:legend>、绘图区域<chart:plot-area>等。如果数据源和图表在相同文件内,则通常用绘图区域的属性@table:cell-range-address来表示;如果数据源和图表不在同一文件内,则用绘图区域内的元素<table:table>来表示数据源。绘图区域包含的其他元素有2-D/3-D图表的墙体<chart:wall>、3-D图表的地板<chart:floor>、坐标轴<chart:axis>、数据序列<chart:series>、数据类别标识<chart:categories>和3-D光线<dr3d:light>等。
OpenOffice.org XML文件格式中支持多种索引,并且可以通过模板来修改这些索引的表现形式。
这些索引内容都位于内容体内,包括:内容目录<text:table-of-content>、插图索引<text:illustration-index>、表格索引<text:table-index>、对象索引<text:object-index>、字母顺序索引<text:alphabetical-index>、参考文献目录<text:bibliography>、以及用户自定义索引<text:user-index>等。
OpenOffice.org XML文件格式规范中也定义了用户界面和对话框的XML表示,它们是基于可扩展用户界面语言(Extensible User Interface Language,XUL)制定而成的。
OpenOffice.org的用户界面定义实际上是保存在文件内部,或者是位于全局用户配置包内的。每个OpenOffice.org组件都有其特有的菜单条<menu:menubar>、加速键列表<accel:acceleratorlist>、状态条<statusbar:statusbar>、工具条<toolbar:toolbar>的配置,它们都可以保存在全局配置包的子文件内。用户界面配置还包括与操作相关的事件<event:event>响应设置,以及为了标识工具条按钮和菜单项的图片。这里所有的内部图片<image:entry>和外部图片<image:externalentry>都必须保存在图片容器<image:imagecontaineer>内。
OpenOffice.org XML中的对话框同样也是基于XUL制定的。对话框<dlg:window>包含样式<dlg:style>、作为控件容器的公告板<dlg:bulletinboard>、以及与其关联的事件<script:event>和<script:listener-event>。公告板容器<dlg:bulletinboard>可以包含的控件种类也非常多,例如按钮、检查盒、单选组、组合盒、菜单列表、标题盒、文字域、文字、文件控件、图片、日期域、时间域、数字域、货币域、模式域、格式域、进度条、滚动条、固定线等等。对话框中的控件与文件内容中的控件是属于不同的XML命名空间的。
OpenOffice.org XML文件格式规范也包括对文件安全性的考虑,现在主要体现在文件加密方面。加密是以密码保护方式实施的,具体步骤如下:
由用户键入的密码创建20字节长的SHA137摘要,并传递给打包组件;
打包组件根据当时的机器时间启动随机数发生器,为每个子文件产生一个随机的8字节初始向量和16字节的“盐”;
这个“盐”与用户密码的20字节长的SHA1摘要一起为每个文件产生128位的密钥,产生这个密钥的算法是迭代次数为1024的PBKDF238算法;
这个产生的密钥和初始向量一起用在密码反馈(Cipher Feedback,CFB)模式下的Blowfish39算法中给文件加密。
OpenOffice.org. XML文件格式规范并不满足于这已经很强大的128位密钥保护。在OpenOffice.org的下一版本中,会对W3C XML 签名40和加密41规范提供支持42。如此以来,不但可以对整个文件进行多次签名和加密,还可以对文件中的若干片断进行复合签名和加密;不但可以在OpenOffice.org及其衍生软件内保证文件的安全性,而且还可以在其外保证安全性。
OpenOffice.org XML文件格式的内容实际上非常丰富,这里只是比较概略的介绍。详细内容读者可以参阅《OpenOffice.org XML文件格式1.0技术参考手册》43,和OpenOffice.org XML文件格式DTD44。
OpenOffice.org XML文件的输入、输出是通过与XML相关的组件来实现的。如图2所示,从结构上看OpenOffice.org运行时程序内部依然是二进制文档模型,这有利于提高效率。当文件从磁盘或其他文件系统读入时,基于XML的过滤器会将其转换成OpenOffice.org XML格式的数据流,再由实现ImportFilter服务的组件通过SAX方式导入内部的文档模型。其中基于XML的过滤器和实现ImportFilter服务的组件一起封装成文件输入过滤器,基于XML的过滤器通过调用XDocumentHandler方法来生成XML数据流。
图
2 OpenOffice.org
基于XML的文件输入过滤器
如图3所示,文件输出过程与输入过程基本上相反。实现XML ExportFilter服务的组件将OpenOffice.org XML的数据流传递给基于XML的过滤器,该过滤器处理XML SAX事件,并将数据以合适的格式存储为磁盘或其他文件系统上的文件。实现XML ExportFilter服务的组件和基于XML的过滤器一起封装成文件输出过滤器。
图
3 OpenOffice.org
基于XML的文件输出过滤器
类似的,如果可以把基于XML的输入过滤器与输出过滤器“串联”起来,实际上就能够实现脱离OpenOffice.org二进制文档模型而独立运行的文件转换工具。图4中就演示了这样的一个从其他格式文件转换到OpenOffice.org XML文件的工具。与图2相比,区别就在于原先实现XML ImportFilter服务的模块现在是XML Writer组件。如此以来,仅仅实现一个基于XML的输入过滤器我们就能够实现一个独立的文件转换工具了。
图
4 OpenOffice.org
XML文件独立转换工具
实际上现在OpenOffice.org社区里已经出现了许多与其他文件格式相互转换的独立工具,例如Writer与LaTex的转换46、WordPerfect与Writer间的转换47、OpenOffice.org与OpenSHORE48文件之间的转换等。
OpenOffice.org还有一个XMerge49过滤器项目,这是为了实现与Palm、PocketPC和Nokian等手持设备上的嵌入式办公软件(比如Palm中的AportisDoc和MiniCalc、Pocket Pc中的Pocket Word和Pocket Excel)进行通讯和同步的工具。XMerge采用Java实现,能够导入并将手持设备上相对简单的文件合并进OpenOffice.org XML文件中来,这对于提高移动用户的工作效率是很有帮助的。
XMerge项目具有优秀的可扩展性,它能够利用Java来提供对基于XSLT的文件过滤器50的支持,这就为OpenOffice.org支持第三方和客户化的XML文件格式提供了广阔的空间。
图
5 OpenOffice.org
XML文件流处理
图5是将图2中的OpenOffice.org基于XML的文件输入过滤器进一步分解的流处理过程。该输入过滤器被进一步分解成XML解析器和XSLT处理器两部分。存储于磁盘或其他文件系统上的客户化XML文件,经过实现XDocumentHandler接口的XML解析器解析后,进入XML逻辑转换单元。在此,客户化XML数据流被XSLT处理器转换为OpenOffice.org XML数据流。该XSLT处理器由于也实现了XDocumentHandler接口,所以可以被实现了XML ImportFilter服务的组件通过SAX方式导入OpenOffice.org内部文档模型。基于XSLT的文件输出过滤器的流程与输入基本相反。
在这个文件流处理过程中,基本上只要实现客户化XML文件与OpenOffice.org XML文件间的转换逻辑,也就是XSLT脚本,并设定与文件和过滤器类型相关的配置信息就能增加一种客户化XML文件的支持。
OpenOffice.org软件内已经加入了好几种这样基于XSLT的文件过滤器,比如支持DocBook、XHTML、Microsoft Word/Excel 2003 XML格式的过滤器。OpenOffice.org社区内也出现了一些对独立XML文件格式的支持,例如HTML/WML51和TEI 12XML文件。而实际上在团体用户的工作流中,很多已经制定好的或者正在制定的行业XML文件格式规范都可以通过这种方式使OpenOffice.org提供对它们的支持。比如XBRL、UBL、Open eBook、NewsML、RIXML、中文办公软件文件(UOF)、中国专利电子申请文件(SIPO XML)等等,OpenOffice.org都可以作为它们的优秀的著作工具。对行业XML文件格式规范的支持能力,再辅以功能强大的SDK,可以说OpenOffice.org在这些行业的工作流和内容管理系统环境中具有广阔的应用前景。现在已经有了一些这方面的解决方案和成功案例。
结构化信息标准促进组织(OASIS)是从早期的SGML Open组织发展而来,它是为了推动开发、统一和采用电子商务标准而建立的全球性非盈利联盟。OASIS的技术委员会主要针对的领域包括网络服务、电子出版、水平电子商务架构、安全、公共领域、垂直工业应用等等。为了促进产业共识并联合各方努力,OASIS为技术委员会特别设计了简单、开放的流程。
OASIS开放办公XML格式技术委员会52成立于2002年11月,目标就是为了建立一个开放的、基于XML的办公软件文件格式规范,该规范以OpenOffice.org XML文件格式规范为基础着手制定。现在这个技术委员会的成员包括办公软件提供者Sun、IBM、Corel和KOffice53,企业出版和内容管理提供商Arbortext54、SpeedLegal55、Stellent56、Blast Radius57等,IT咨询公司CSW集团58、Propylon59、ISOGEN60、Toolsmiths61等,以及波音公司和澳大利亚国家档案馆62等企业和用户组织。在经过了一年多的讨论之后,OASIS Open Office XML格式1.0的委员会草案采用RELAX-NG63和W3C XML Schema于2004年3月公布,面向全世界征集意见。这个草案虽然从总体结构上与OpenOffice.org XML文件格式差别不大,但是也进行了一些更改和提高。为了保持规范的独立性,它还采用了全新的XML命名空间定义。
OASIS开放办公XML格式技术委员会从成立之初就受到了世界各地的广泛关注和称赞,不断地获得了更多的支持。KOffice组织于2003年8月宣布会将本地文件格式迁移到OASIS Open Office XML文件格式上来,并于该技术委员会草案公布后的第二个月就提供了对该文件格式的初步支持。未来发布的OpenOffice.org 2.0也将会将OASIS格式做为本地文件格式。GNOME Office暂时还没有参加这个技术委员会,但是他们表示会根据用户的需要来提供对该文件格式的支持。与此同时,有用户通过公开信64的形式呼吁Corel也将OASIS Open Office XML格式作为WordPerfect的本地文件格式。
通过本文,相信读者可以对OpenOffice.org XML文件格式规范本身,及其由来、现状和未来的发展方向有了一个初步的了解。OpenOffice.org XML是迄今为止功能最完善、开放性、标准化程度最高的可扩展的办公软件文件格式,并且还将继续向开放、可扩展和标准化的方向前进。了解了OpenOffice.org技术架构和XML文件格式规范,就具有了一定的进行OpenOffice.org开发和应用的技术基础。
然而对于开放源码社区内的OpenOffice.org来讲,拥有技术基础只是必要条件。为了能够更通畅地同开源社区的成员交流,更快捷方便地获取最准确的技术资料,能够为OpenOffice.org开源社区做出更大的贡献,同时也为开发者自身的技术工作创造更广阔的舞台,了解OpenOffice.org开源社区的组织结构、行为规范、和文化风格,及其与其他若干开源社区的联系与协作方式,也是很有必要的。
总之,优秀的软件只能从优秀的软件开发实践中来,优秀的软件开发者也只能从不断的软件开发实践过程中锻炼而不断提高。希望国内的软件开发者能够积极主动地参与国际开放源码社区的建设,提高自己,贡献社会。
本文依据《创作共用约定》之“署名-禁止派生-非商业用途”方式发布,即你可以免费拷贝、分发、呈现和表演当前作品,但是必须基于以下条款:
署名:你必须明确标明作者的名字。
非商业用途:你不可将当前作品用于商业目的。
禁止派生:你不可更改、转变或者基于此作品重新构造为新作品。
对于任何二次使用或分发,你必须让其他人明确当前作品的授权条款。
在得到作者的明确允许下,这里的某些条款可以放弃。
此约定是法律文本(完整的协议)65的简单易读概要。
1工作流管理联盟,http://www.wfmc.org/
2OASIS电子政务技术委员会,http://www.oasis-open.org/committees/egov/
3OASIS法律XML技术委员会,http://www.legalxml.org/
4OASIS税务XML技术委员会,http://www.oasis-open.org/committees/tax/
5世界专利组织的XML专利文件格式标准,http://www.wipo.int/pct-safe/epct/xml_world_standard.htm
6会议论文XML,http://www.gca.org/
7DocBook,http://www.docbook.org/
8W3C技术规范的文件规范,http://www.w3.org/2002/xmlspec/
9Open eBook论坛,http://www.openebook.org/
10盲人书籍联盟,http://www.daisy.org/
11国际新闻通信理事会,http://www.iptc.org/
12投资与金融研究信息XML,http://www.rixml.org/
13文字编码促进会联盟,http://www.tei-c.org/
14人力资源XML联盟,http://www.hr-xml.org/
15商业报表XML,http://www.xbrl.org/
16Health Level 7,http://www.hl7.org/
17国际保险业合作研发协会,http://www.acord.org/
18零售技术标准协会,http://www.nrf-arts.org/
19SWIFT金融机构交流协会,http://www.swift.com/
20OASIS通用商务语言技术委员会,http://www.oasis-open.org/committees/ubl/
21中文办公软件文件格式XML标准研究,http://www.ec.org.cn/2004-05/09/content_1458956.htm
22基于XML的电子公文格式规范,http://www.egs.org.cn/upload/WG1.pdf
23中国电子申请类专利文件DTD(试行),http://www.sipo.gov.cn/sipo/ztxx/zldzsqxt/t20040408_27707.htm
24OpenOffice.org XML项目,http://xml.openoffice.org/
25OASIS Open Office XML Format TC,http://www.oasis-open.org/committees/office/
26OpenOffice.org XML文件打包,http://xml.openoffice.org/package.html
27W3C MathML规范,http://www.w3.org/Math/
28Dublin Core元数据促进会,http://dublincore.org/
29W3C SVG规范,http://www.w3.org/Graphics/SVG/
30W3C XSL规范,http://www.w3.org/TR/xsl/
31W3C XSLT规范,http://www.w3.org/TR/xslt/
32W3C XForms规范,http://www.w3.org/MarkUp/Forms/
33维基百科对“拥抱-扩展-消灭”的注解,http://en.wikipedia.org/wiki/Embrace,_extend_and_extinguish
34互联网上的日期时间,http://www.hermetic.ch/cal_stud/newman.htm
35语言名称表示国际标准,http://www.oasis-open.org/cover/iso639a.html
36国家地区名称表示国际标准,http://www.oasis-open.org/cover/country3166.html
37SHA1算法,http://www.itl.nist.gov/fipspubs/fip180-1.htm
38RFC2898,http://www.ietf.org/rfc/rfc2898.txt
39Blowfish算法论文,http://www.schneier.com/paper-blowfish-fse.html
40W3C XML签名工作组,http://www.w3.org/Signature/
41W3C XML加密工作组,http://www.w3.org/Encryption/
42OpenOffice.org XML数字签名和加密规范,http://specs.openoffice.org/appwide/security/Electronic_Signatures_and_Security.sxw
43OpenOffice.org XML文件格式1.0技术参考手册,http://xml.openoffice.org/xml_specification.pdf
44OpenOffice.org XML文件格式DTD,http://xml.openoffice.org/source/browse/xml/xmloff/dtd/
45基于OpenOffice.org XML文件格式的过滤器,http://xml.openoffice.org/filter/
46Writer2LaTex项目,http://www.hj-gym.dk/~hj/writer2latex
47libwpd项目,http://libwpd.sourceforge.net/
48OpenSHORE项目,http://sourceforge.net/projects/openshore/
49OpenOffice.org XMerge项目,http://xml.openoffice.org/xmerge/
50OpenOffice.org XSLT文件过滤器规范,http://ui.openoffice.org/proposals/XMLFilterSpec.sxw
51OpenOffice.org sx2ml项目,http://xml.openoffice.org/sx2ml/
52OASIS Open Office XML格式技术委员会,http://www.oasis-open.org/committees/office/
53KOffice,http://www.koffice.org/
54Arbortext,http://www.arbortext.com/
55SpeedLegal,http://www.speedlegal.com/
56Stellent,http://www.stellent.com/
57Blast Radius,http://www.blastradius.com/
58CSW集团,http://www.csw.co.uk/
59Propylon,http://www.propylon.com/
60ISOGEN,http://www.isogen.com/
61Toolsmiths,http://www.toolsmiths.se/
62澳大利亚国家档案馆,http://www.naa.gov.au/
63RELAX-NG规范,http://www.relaxng.org/
64给Corel的一封公开信,http://software.newsforge.com/software/04/06/21/1547230.shtml
65创作共用协议的完整法律文本,http://www.creativecommons.cn/licenses/by-nd-nc/1.0/legalcode