0

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

XML 解析器处理文件报告的 I/O 错误:/test.dita: /learningAssessment.dtd (No such file or directory)

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

有趣的是,当我使用 Saxon-HE 9.8.0.12 在 oXygen 中运行相同的 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>

这是一个演示错误的 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>
4

3 回答 3

2

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

  1. 下载 DITA-OT 并将其展开为您喜欢的任何文件夹。在我的例子中,它位于 D:\DITA-OT\dita-ot-3.3.4。
  2. 将 CLASSPATH 环境变量设置为包含saxon9he.jarxml-resolver-1.2.jarDITA-OT/lib.
  3. 通过指定类名net.sf.saxon.Transformcatalog:指定[DITA-OT]/catalog-dita.xml.

这是执行示例命令窗口:

在此处输入图像描述

希望这可以帮助!

于 2019-10-28T01:33:17.397 回答
1

我的猜测是,您以某种方式设法为文档提供了“file:/test.dita:”的基本 URI,包括最后的空格。您尚未展示如何运行转换,因此我们无法判断此基本 URI 来自何处。

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

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

于 2019-10-25T12:19:41.840 回答
0

我误解了 DTD 的工作原理。我假设公共文件是从 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

于 2019-10-28T01:31:45.510 回答