我们如何将 Microsoft Word DOCX 文件转换为 XSLT 中的 HTML?

How do we convert a Microsoft Word DOCX file to HTML in XSLT?

我有一个关于将 Word DOCX XML (OOXML) 文件转换为 HTML 格式的项目。

我使用 XML Spy 和 XSLT、XPath,XML 进行此转换。

想象一下我用 XSLT 编写程序并转换它的单个 Word 文件。但是我的主管说,如果我更改文件中的值,该方法将不起作用。

我同意这一点,因为我只为该文档指定了代码,因为我知道其中包含的内容。

但是,我们如何在 XSLT 中编写通用代码来将所有 Word 文件转换为格式良好的 HTML 文档(因为 Word 文档之间可能有很大差异)?

问题是我正在尝试使用 XSLT 来完成它?这里有什么不对吗?或者我只是对此太混乱了。

您使用 XSLT 将 DOCX 文件转换为 HTML 的计划基本上是合理的。 XSLT 非常适合此用途,因为它非常适合从 XML 映射到 XML(或 (X)HTML)。

您面临的挑战是 XML 基础 DOCX 很复杂。仅 Ecma Office Open XML Part 1 - Fundamentals And Markup Language Reference 就超过 5K 页。如果您对 XML、XML 名称空间、XSLT、HTML 和 CSS 了如指掌,那么您“只需”学习一些面向对象的基础知识XML开始。

如果您稳健地执行此操作并且从根本上理解 OOXML,那么关于更改值的担忧将无关紧要。从段落中文本运行的概念开始:w:tw:rw:p.

Eric White has written extensively on OOXML in general and even transforming it to HTML specifically. See Transforming Open XML WordprocessingML to XHtml 优秀文章和示例。

我用较旧的 Word XML 输出完成了此操作。我做了一些研究,比较旧的 Word XML 和新的 docx 格式。他们非常非常相似。 docx 是一个 multi-file 存档这一事实对我来说不是问题,因为我在 java 中使用 Saxon XSLT 运行 并且我可以使用 jar 文件 URL 打开 word/document .xml 文件,然后使用 document() XPath 函数从那里访问所有其他文件。

我发现了切入正题的诀窍,通过提取您需要的内容,基本上是段落,表格也可以将漂亮的 straight-forwardly 转换为 HTML 表格。使用样式名称并将它们变成 CSS。我要求我的源文档是用样式构建的,当它只是格式化粗体、斜体、字体大小等类似的东西时,我不会尝试完全保留所有这些。我关心内容,HTML 格式可能会有很大不同。

因此,使用 XSLT 完全可以做到这一点,尤其是旧的 Word XML。

但是,对于 docx,有一个主要损失 一个非常有用的功能:wx 命名空间。特别是:

  • w:listPr/wx:t/@wv:val——它为您提供编号部分的部分标题编号字符串
  • wx:sub-section -- 您可以将其转换为 <div> 元素以具有嵌套部分而不是标题和段落的平面列表。

如果我想正确地完成它,我发现特别是部分编号的重建是一项非常艰巨的任务。 Wordprocessing Numbering, Levels & Lists中描述了原理,原理不难理解。但是实现起来相当困难,因为你必须追逐层级的样式和 w:basedOn parent 样式,具体的数字格式,抽象的数字格式,直到你真正收集到数字格式, 然后 您还必须跟踪所有级别的计数,以便您拥有每个级别的数字,然后您格式化。

我已经在 XSLT 中完成了这种继承方案,它甚至很有趣,但是它很难并且会花费我几天时间,而我没有时间。

嵌套级别 (wx:sub-section) 的恢复也是 non-trivial,您必须突破正常的 XSLT 工作流程才能实现。我也做过这样的事情,不过我得再投资几天

当人们说“哦,那个 wx 命名空间已经被删除,因为开发人员知道它是多余的”时,我经常想知道,是的,但我怀疑大多数这么轻描淡写的人是否做过这些转换.

我认为 docx 设计得比较迟钝,所以我们大多数人 foot-soldiers 都被吓到了,微软和 Aspex Words 等软件公司在体积庞大的市场占有份额 Windows-only 依赖许可软件包。

您也可以使用 pandoc - https://pandoc.org - 它将 docx 转换为其他格式。