#xml #xslt-2.0 #java-11 #saxon #dtd
#xml #xslt-2.0 #java-11 #саксонский #dtd
Вопрос:
Я пытаюсь запустить преобразование XSL в XML с типом документа, подобным этому:
<!DOCTYPE article PUBLIC "-//NLM//DTD JATS (Z39.96) Journal Publishing DTD v1.1d3 20150301//EN" "http://jats.nlm.nih.gov/publishing/1.1d3/JATS-journalpublishing1.dtd">
Я использую Java 11 вокруг процессора:
Source s = getXsl(src, bibSources);
System.setProperty("javax.xml.accessExternalDTD", "all");
System.setProperty("javax.xml.accessExternalSchema", "all");
System.setProperty("javax.xml.catalog.files", xmlCatalog);
System.setProperty(CatalogFeatures.Feature.RESOLVE.getPropertyName(), "strict");
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);
Transformer t = factory.newTransformer(s);
Source xml = new StreamSource(zip.getInputStream(entry));
t.transform(xml,streamResult);
Ошибка, которую я получаю при запуске преобразования, выглядит следующим образом:
Error on line 333 column 31 of JATS-journalpublishing1.dtd:
SXXP0003: Error reported by XML parser: JAXP00090001: The CatalogResolver is enabled with
the catalog "catalog.xml", but a CatalogException is returned.: JAXP09040001: No match
found for publicId '-//NLM//DTD JATS (Z39.96) Journal Publishing DTD-Specific Modules
v1.1d3 20150301//EN' and systemId 'JATS-journalpubcustom-modules1.ent'.
Доступ к каталогу осуществляется, но, похоже, он не может разрешать модули, от которых зависит DTD. Это нормально, или я неправильно настраиваю свойства XML в Java?
Редактировать:
В каталоге XML есть запись для dtd:
<public publicId="-//NLM//DTD JATS (Z39.96) Journal Publishing DTD v1.1d3 20150301//EN" uri="http://ecswebqa02:8080/xml-catalog/dtd/jatsDTD/JATS-Publishing-1-1d3-MathML2-DTD/JATS-journalpublishing1.dtd"/>
В каталоге нет записи для модуля, хотя модуль расположен рядом с локальной копией dtd:
http://ecswebqa02:8080/xml-catalog/dtd/jatsDTD/JATS-Publishing-1-1d3-MathML2-DTD/JATS-journalpubcustom-modules1.ent
Комментарии:
1. Итак, как catalog.xml посмотри?
2. В сообщении об ошибке сообщается не о проблеме с поиском DTD, а о проблеме со ссылкой на внешнюю сущность.
3. @MichaelKay Это проблема с каталогом, а не с моими настройками в Java, верно? Я потенциально пропускаю десятки тысяч XML-файлов в день, поэтому я не могу продолжать использовать общедоступные URL-адреса. Если проблема связана с этим каталогом, должен ли каждый объект иметь свою собственную запись в каталоге наряду с DTD, которые ссылаются на них?
4. Я должен упомянуть, что каталог принадлежит другой команде. Я не могу его легко изменить.
5. @MartinHonnen Каталог используется уже несколько лет, но я с ним не знаком. Если для свойства Java для РАЗРЕШЕНИЯ установлено значение «игнорировать» или «продолжить», объекты просто не разрешены или они удалены из Интернета?
Ответ №1:
Я бы ожидал, что распознаватель поступит правильно, если относительные URI объектов верны. Если вы используете распознаватель Apache commons, можно получить более подробные сообщения об обработке, включив параметр «xml.catalog.verbosity», http://xerces.apache.org/xml-commons/components/resolver/resolver-article.html
Вы также можете попробовать https://xmlresolver.org / распознаватель, который является более поздним.
Комментарии:
1. В моем случае я не устанавливаю явный распознаватель xml в своем transformer. Я предполагаю, что установленные мной системные свойства используются любым решателем по умолчанию, который есть у Saxon. Это работает, если я устанавливаю для свойства RESOLVE значение «продолжить» или «игнорировать», но не «строгий». Что именно произойдет, если я не использую «строгий»? Загружены ли отсутствующие файлы из Интернета? Они просто не используются? Я не уверен, как это возможно. Очень запутанный.