Как разрешаются сущности и модули при преобразовании XML в процессоре XSLT, если они не существуют в каталоге XML?

#xml #xslt-2.0 #java-11 #dtd

#xml #xslt-2.0 #java-11 #dtd

Вопрос:

Я выполняю простое преобразование для XML, содержащего DTD. DTD ссылается на файлы .mod и .ent . Я предоставляю каталог XML для процессора преобразования. Когда каталог содержит запись для DTD, DTD разрешается. По-видимому, ни одна из сущностей и модулей, от которых зависит DTD, не является записями в каталоге, поэтому они возвращаются нулевыми. Тем не менее, преобразование завершается. Аналогично, если DTD в XML не соответствует в каталоге, преобразование, тем не менее, завершается.

Мой тест:

 @Test
    void settingExplicitResolver() throws IOException, TransformerException{
        Source xsl = XslTransform.getXsl("aaas",List.of());

        TransformerFactory factory = new net.sf.saxon.TransformerFactoryImpl();
        factory.setFeature("http://saxon.sf.net/feature/suppressXsltNamespaceCheck",true);

        StringWriter writer = new StringWriter();
        StreamResult streamResult = new StreamResult(writer);
        StreamSource xml = new StreamSource(
                getClass().getClassLoader().getResource("xml/plos_test.xml").getFile()
        );

        CatalogFeatures f =
                CatalogFeatures.builder()
                        .with(CatalogFeatures.Feature.FILES, xmlCatalog)
                        .with(CatalogFeatures.Feature.RESOLVE,"ignore")
                        .build();

        Transformer t = factory.newTransformer(xsl);
        t.setURIResolver(CatalogManager.catalogResolver(f, URI.create(xmlCatalog)));
        
        t.transform(xml, streamResult);
  

Что на самом деле происходит, когда для свойства RESOLVE установлено значение «игнорировать»? Загружены ли недостающие ресурсы каким-либо образом из Интернета? Кроме того, в чем разница с «продолжить» и «игнорировать»?

У меня также есть каталог, привязанный к Oxygen 17.0, и я вижу, что подобные вещи запускают один и тот же XML через XSL:

Вывод Oxygen при преобразовании того же XML

Комментарии:

1. Насколько я понимаю, метод setURIResolver предназначен для установки преобразователя URI для разрешения любых document() doc() вызовов функций or в коде XSLT. Я не думаю, что это имеет отношение к разрешению URI в DTD источника ввода для преобразователя.

2. Что касается каталога, документ docs.oracle.com/en/java/javase/11/docs/api/java.xml/javax/xml /… говорит: «Если сопоставление не найдено, возвращает пустой исходный объект, если для свойства javax.xml.catalog.resolve установлено значение игнорировать;». Но, как я уже говорил в предыдущем комментарии, настроенный вами распознаватель предназначен для разрешения document() вызовов в XSLT.

3. @MartinHonnen Я вижу, что если я установлю для свойства RESOLVE значение «strict», оно попытается найти файлы .ent и .mod в каталоге, но выдает исключение CatalogException, поэтому кажется, что распознаватель URI также пытается обрабатывать DTD. Я предполагаю, что основной вопрос заключается в следующем: «Когда РАЗРЕШЕНИЕ «продолжить» или «игнорировать» и файлы не разрешаются через каталог, загружается ли что-нибудь из Интернета?