处理 DITA 时在 Saxon-HE 9.9.1 中出现错误:I/O DTD 错误

Getting errors in Saxon-HE 9.9.1 when processing DITA: I/O error on DTD

使用 Saxon 9.9.1.3J,我每次尝试转换具有 DTD 的 DITA 文件时都会收到 I/O 错误:

I/O error reported by XML parser processing file:/test.dita: /learningAssessment.dtd (No such file or directory)

即使我在命令行上强制执行 -dtd:off 也会发生这种情况。注释掉 DITA 文件中的 DTD 确实允许它处理。

有趣的是,当我在 oXygen 中使用 Saxon-HE 9.8.0.12 运行 相同的 DITA 文件时,它确实可以正确处理。知道什么可能导致这种行为不同吗?

示例 DITA 文件:

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE learningAssessment PUBLIC "-//OASIS//DTD DITA Learning Assessment//EN" "learningAssessment.dtd">
<learningAssessment id="id">
    <title>Title</title>
    <learningAssessmentbody>
        <lcInteraction>
            <lcSingleSelect id="lcSingleSelect_agy_fxz_ljb">
                <lcQuestion>Question</lcQuestion>
                <lcAnswerOptionGroup id="lcAnswerOptionGroup_bgy_fxz_ljb">
                    <lcAnswerOption>
                        <lcAnswerContent>A</lcAnswerContent>
                    </lcAnswerOption>
                    <lcAnswerOption>
                        <lcAnswerContent>B</lcAnswerContent>
                        <lcCorrectResponse/>
                    </lcAnswerOption>
                </lcAnswerOptionGroup>
            </lcSingleSelect>
        </lcInteraction>
    </learningAssessmentbody>
</learningAssessment>

这里有一个 shell 的 XSL 演示错误:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="3.0">
    <xsl:output />
    <xsl:template match="/">
        <xsl:apply-templates/>
    </xsl:template>
</xsl:stylesheet>

我的猜测是您以某种方式设法为文档提供 "file:/test.dita: " 的基本 URI,包括最后的 space。你还没有展示你是如何运行转换的,所以我们无法判断这个基本 URI 来自哪里。

选项 -dtd:off 有点误导。它不会关闭 DTD 处理,只会关闭基于 DTD 的验证,这只是 DTD 处理的一个方面。 XSLT 处理器总是需要请求 XML 解析器读取 DTD 以扩展任何实体引用。

(嗯,理论上它可以延迟读取任何外部 DTD,直到它找到第一个实体引用;但遗憾的是,我不知道有任何 XML 解析器会这样做。)

我误解了 DTD 的工作原理。我假设 public 是从 HTTP URL 加载的,但它们需要是本地文件。加载 DITA OT 的目录解决了这个问题。

transform -s:test.dita -xsl:test.xsl -o:test.html -catalog:/org.oasis-open.dita.v1_2/plugins/org.oasis-open.dita.v1_2/catalog.xml

目录选项指向我本地文件系统上的这个文件,它来自 DITA OT

您可以通过以下步骤解决问题:

  1. 下载 DITA-OT 并将其展开到您喜欢的任何文件夹。在我的例子中,它位于 D:\DITA-OT\dita-ot-3.3.4.
  2. 设置 CLASSPATH 环境变量以在 DITA-OT/lib.
  3. 中包含 saxon9he.jarxml-resolver-1.2.jar
  4. 通过指定 class 名称 net.sf.saxon.Transform 和指定 [DITA-OT]/catalog-dita.xml.
  5. catalog: 参数调用 Saxon

这里是执行示例命令window:

希望对您有所帮助!