Должен ли каталог XML разрешать модули?

#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 значение «продолжить» или «игнорировать», но не «строгий». Что именно произойдет, если я не использую «строгий»? Загружены ли отсутствующие файлы из Интернета? Они просто не используются? Я не уверен, как это возможно. Очень запутанный.