Получение ошибок в Saxon-HE 9.9.1 при обработке DITA: ошибка ввода-вывода на DTD - PullRequest
0 голосов
/ 25 октября 2019

Используя Saxon 9.9.1.3J, я получаю ошибку ввода-вывода каждый раз, когда пытаюсь преобразовать файл DITA с DTD:

Ошибка ввода-вывода, полученная при обработке синтаксического анализатора XMLfile: /test.dita: /learningAssessment.dtd (нет такого файла или каталога)

Это происходит, даже если я принудительно -dtd: off в командной строке. Комментирование DTD в файле DITA действительно позволяет его обрабатывать.

Интересно, что когда я запускаю тот же файл DITA в oXygen, используя Saxon-HE 9.8.0.12, он работает правильно. Любая идея, что может быть причиной того, что это ведет себя по-другому?

Пример файла 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>

Ответы [ 3 ]

2 голосов
/ 28 октября 2019

Вы можете решить проблему, выполнив следующие действия:

  1. Загрузите DITA-OT и разверните его в любой папке, которая вам нравится. В моем случае он находится по адресу D: \ DITA-OT \ dita-ot-3.3.4.
  2. Установите переменную среды CLASSPATH, чтобы она содержала saxon9he.jar и xml-resolver-1.2.jar в DITA-OT/lib.
  3. Вызов Saxon, указав имя класса net.sf.saxon.Transform и параметр catalog:, который задает [DITA-OT]/catalog-dita.xml.

Вот пример окна выполнения команды:

enter image description here

Надеюсь, это поможет!

1 голос
/ 25 октября 2019

Я предполагаю, что вы каким-то образом умудрились дать документу базовый URI-адрес «file: /test.dita:», включая последний пробел. Вы не показали, как вы выполняете преобразование, поэтому мы не можем сказать, откуда взялся этот базовый URI.

Опция -dtd: off немного вводит в заблуждение. Он не отключает обработку DTD, только проверку на основе DTD, которая является лишь одним аспектом обработки DTD. XSLT-процессор всегда должен попросить синтаксический анализатор XML прочитать DTD для расширения любых ссылок на сущности.

(Ну, теоретически он может задержать чтение любого внешнего DTD, пока не найдет первую ссылку на сущность; но, к сожалению,Я не знаю ни одного парсера XML, который бы это делал.)

0 голосов
/ 28 октября 2019

Я неправильно понял, как работают 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

...