#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:
Комментарии:
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. Я предполагаю, что основной вопрос заключается в следующем: «Когда РАЗРЕШЕНИЕ «продолжить» или «игнорировать» и файлы не разрешаются через каталог, загружается ли что-нибудь из Интернета?