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

问题描述 投票:0回答:3

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

由XML解析器处理文件报告的I / O错误:/test.dita:/learningAssessment.dtd(无此类文件或目录)

即使我在命令行上强制-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>
saxon dita
3个回答
0
投票

我的猜测是,您已经设法为文档提供了一个基本的URI“ file:/test.dita:”,包括最后的空格。您尚未显示如何运行转换,因此我们无法确定此基本URI的来源。

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

(嗯,从理论上讲,它可能会延迟读取任何外部DTD,直到找到第一个实体引用;但可悲的是,我不知道执行此操作的任何XML解析器。)


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


0
投票

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

  1. 下载DITA-OT,然后将其展开为所需的任何文件夹。就我而言,它位于D:\ DITA-OT \ dita-ot-3.3.4。
  2. 将CLASSPATH环境变量设置为在saxon9he.jar中包含xml-resolver-1.2.jarDITA-OT/lib
  3. 通过指定类名称net.sf.saxon.Transform和指定catalog:[DITA-OT]/catalog-dita.xml参数调用Saxon。

这里是执行示例命令窗口:

enter image description here

希望这会有所帮助!

© www.soinside.com 2019 - 2024. All rights reserved.