我已经使用旧的Word XML输出完成了这个任务。我进行了一些研究,比较了旧的Word XML和新的docx格式。它们非常相似。对于我来说,docx是一个多文件存档并不是问题,因为我使用在Java中运行的Saxon XSLT,并且可以使用jar文件URL打开word/document.xml文件,从而使用document() XPath函数访问所有其他文件。
我发现诀窍就是直接提取所需内容,基本上是段落,表格也可以很容易地转换为HTML表格。使用样式名称并将其转换为CSS。我要求我的源文档使用样式构建,当只是格式加粗、斜体、字体大小等时,我不会尝试完全保留所有这些。我关心的是内容,而HTML格式可能会有所不同。
因此,这一切都可以通过XSLT实现,特别是旧的Word XML。
然而,对于docx,有一个非常有用的功能的一个主要损失。特别是:
- w:listPr/wx:t/@wv:val -- 这个可以让你得到已编号章节的标题编号字符串
- wx:sub-section -- 你可以将其转换为
<div>
元素,以获得嵌套部分而不是平面标题和段落列表。
我发现如果想正确地进行重建章节编号,这是一项非常困难的任务。Wordprocessing Numbering, Levels & Lists 中描述了原则,原则并不难理解。但是它很难实现,因为您必须追溯样式级别和 w:basedOn 父样式、具体数字格式、抽象数字格式,直到真正收集数字格式,然后您还必须跟踪所有级别的计数,以便您拥有每个级别的数字,然后再进行格式化。
我曾在 XSLT 中完成过此类继承方案,甚至觉得挺有趣,但它很难,需要花费我几天的时间,而我没有那么多的时间。
嵌套级别(wx:sub-section)的恢复也是非常棘手的,你必须打破正常的XSLT工作流程才能实现。我也做过这样的事情,但需要再投入几天时间。
我经常想知道当人们说“哦,那个wx命名空间已经被删除了,因为开发人员认为它是多余的”时,他们是否真正了解这些转换。是的,但我怀疑大多数轻描淡写地说这种话的人从未做过这些转换。
我认为docx的设计是为了让我们大多数步兵感到难以理解,以便软件公司像Microsoft和Aspex Words等拥有庞大的Windows-only依赖许可软件包的市场份额。