使用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>
我的猜测是,您已经设法为文档提供了一个基本的URI“ file:/test.dita:”,包括最后的空格。您尚未显示如何运行转换,因此我们无法确定此基本URI的来源。
选项-dtd:off有点误导。它不会关闭DTD处理,而只会关闭基于DTD的验证,这只是DTD处理的一个方面。 XSLT处理器始终需要请求XML解析器读取DTD才能扩展任何实体引用。
(嗯,从理论上讲,它可能会延迟读取任何外部DTD,直到找到第一个实体引用;但可悲的是,我不知道执行此操作的任何XML解析器。)
我误解了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