Задать строковый параметр с помощью Saxon HE 9.9 не удалось - PullRequest
0 голосов
/ 11 февраля 2019

У меня есть следующий код:

public static String converterXml(String json, XsltTransformer transformer) throws SaxonApiException {
    DocumentBuilder builder = processor.newDocumentBuilder();
    builder.setLineNumbering(true);
    builder.setDTDValidation(false);
    StringWriter writer = new StringWriter();
    Serializer out = processor.newSerializer(writer);
    out.setOutputProperty(Serializer.Property.INDENT, "yes");

    QName qname = new QName("json-input");
    XdmValue value = new XdmAtomicValue(json);
    transformer.setParameter(qname, value);

    transformer.setDestination(out);
    transformer.transform();

    return writer.toString();
}

При использовании Saxon HE v9.9 не получается получить java.lang.NullPointerException:

Exception in thread "main" java.lang.NullPointerException
at java.util.Objects.requireNonNull(Objects.java:203)
at net.sf.saxon.s9api.AbstractXsltTransformer.applyTemplatesToSource(AbstractXsltTransformer.java:336)
at net.sf.saxon.s9api.XsltTransformer.transform(XsltTransformer.java:338)

Вместо класса XdmAtomicValue Я должен использовать другой класс, но я не знаю какой.

ОБНОВЛЕНО:

Полный код:

Processor processor = new Processor(false);
XsltCompiler comp = processor.newXsltCompiler();
XsltTransformer transformer = comp.compile(new StreamSource(new File("/path/json-to-xml.xsl")));
String json = new String(Files.readAllBytes(Paths.get("path-json/invoice.json")));
String xml = converterXml(json, transformer);

Мне просто нужно настроить json в качестве параметра, никакой другой файл XML не нужен в качестве записи.

Я использую это решение для преобразования файла JSON (Martin'sответ).При использовании Saxon HE 9.8 он работает нормально, но при использовании Saxon HE 9.9 он не работает.

1 Ответ

0 голосов
/ 12 февраля 2019

НАЧАЛЬНЫЙ ОТВЕТ

Вам необходимо вызвать transformer.setSource () для предоставления входного документа.(Диагностика могла бы быть лучше ....) -

ПЕРЕСМОТРЕННЫЙ ОТВЕТ НА СЛЕДУЮЩИЙ ОБСУЖДЕНИЕ В КОММЕНТАРИЯХ

Кажется, что таблица стилей использует <xsl:template name="xsl:initial-template"/> в качестве точки входадля выполнения;хотя и не задокументировано в Javadoc, похоже, что в Saxon 9.8 XsltTransformer.transform() без предыдущего вызова на setSource() или setInitialTemplate() успешно выполнит преобразование, начинающееся с xsl:initial-template, тогда как Saxon 9.9 этого не сделает.

Я поднял вопрос по этому вопросу на https://saxonica.plan.io/issues/4137

...