lschult2
lschult2

Reputation: 390

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

Using Saxon 9.9.1.3J, I am getting an I/O error every time I try to transform a DITA file that has a DTD:

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

This happens even if I force -dtd:off on the command line. Commenting out the DTD in the DITA file does allow it to process.

Interestingly, when I run the same DITA file in oXygen using Saxon-HE 9.8.0.12, it does process correctly. Any idea what might be causing this to behave differently?

Sample DITA file:

<?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>

And here's a shell of an XSL that demonstrates the error:

<?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>

Upvotes: 0

Views: 579

Answers (3)

Toshihiko Makita
Toshihiko Makita

Reputation: 1304

You can resolve the problem by the following steps:

  1. Download DITA-OT and expand it any folder you like. In my case it is located at D:\DITA-OT\dita-ot-3.3.4.
  2. Set CLASSPATH environment variable to contain saxon9he.jarand xml-resolver-1.2.jar in DITA-OT/lib.
  3. Invoke Saxon by specifying class name net.sf.saxon.Transform and the catalog: paramter that specifies [DITA-OT]/catalog-dita.xml.

Here is execution example command window:

enter image description here

Hope this helps!

Upvotes: 2

lschult2
lschult2

Reputation: 390

I misunderstood how DTDs work. I assumed the public ones were loaded from an HTTP URL, but they need to be local files. Loading the catalog for DITA OT resolved the issue.

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

Where the catalog option points to this file on my local filesystem, which comes from DITA OT

Upvotes: 0

Michael Kay
Michael Kay

Reputation: 163549

My guess is that you have somehow contrived to give the document a base URI of "file:/test.dita: ", including the final space. You haven't shown how you are running the transformation, so we can't tell where this base URI comes from.

The option -dtd:off is a little misleading. It doesn't switch off DTD processing, only DTD-based validation, which is just one aspect of DTD processing. An XSLT processor always needs to ask the XML parser to read the DTD in order to expand any entity references.

(Well, theoretically it could delay reading any external DTD until it finds the first entity reference; but sadly, I don't know of any XML parser that does that.)

Upvotes: 1

Related Questions