处理 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
您可以通过以下步骤解决问题:
- 下载 DITA-OT 并将其展开到您喜欢的任何文件夹。在我的例子中,它位于 D:\DITA-OT\dita-ot-3.3.4.
- 设置 CLASSPATH 环境变量以在
DITA-OT/lib
. 中包含 saxon9he.jar
和 xml-resolver-1.2.jar
- 通过指定 class 名称
net.sf.saxon.Transform
和指定 [DITA-OT]/catalog-dita.xml
. 的 catalog:
参数调用 Saxon
这里是执行示例命令window:
希望对您有所帮助!
使用 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
您可以通过以下步骤解决问题:
- 下载 DITA-OT 并将其展开到您喜欢的任何文件夹。在我的例子中,它位于 D:\DITA-OT\dita-ot-3.3.4.
- 设置 CLASSPATH 环境变量以在
DITA-OT/lib
. 中包含 - 通过指定 class 名称
net.sf.saxon.Transform
和指定[DITA-OT]/catalog-dita.xml
. 的
saxon9he.jar
和 xml-resolver-1.2.jar
catalog:
参数调用 Saxon
这里是执行示例命令window:
希望对您有所帮助!