Содержимое не допускается в прологе ошибка при синтаксическом анализе json с использованием xslt 3.0

Я пытаюсь сделать один POC для преобразования json в формат xml. Теперь я делаю это через java, используя Saxon-HE версии 9.8.0-5.

Предположим, что простой json выглядит так:

{
  "Assets": [
    { "Asset": {
      "Open": "25.15",
      "High": "25.15",
      "Low": "25.11",
      "Close": "25.87"
    }},
    { "Asset": {
      "Open": "25.15",
      "High": "25.15",
      "Low": "25.11",
      "Close": "25.87"
    }}
  ]
}

Теперь код Java выглядит следующим образом:

public void transform(File xsl, File inputjson, File outputXml) throws TransformerException, IOException {
        TransformerFactory factory = new net.sf.saxon.TransformerFactoryImpl();
        Source xslt = new StreamSource(xsl);
        Transformer transformer = factory.newTransformer(xslt);
        System.out.println("transformer object created");
        Source text = new StreamSource(inputjson);
        transformer.transform(text, new StreamResult(outputXml));
    }

Но я получаю ошибку ниже:

Ошибка в строке 1 столбца 1 файла sample_test1.json: SXXP0003: синтаксический анализатор XML сообщил об ошибке: содержимое не разрешено в прологе.

Когда я попытался поместить содержимое json в любой элемент xml и обработать его, это было успешно. ПОЧЕМУ?? Можем ли мы напрямую обработать json как есть, не помещая его содержимое в какую-либо структуру xml?


person Tapan    schedule 30.01.2018    source источник
comment
Вы используете API, определенный для XSLT 1, который принимает ввод XML, а не JSON. Если вы переключитесь на Saxon s9api, вы можете начать с именованного шаблона и JSON в качестве текстового параметра или параметра карты XPath или даже использовать XdmValue для сопоставления с шаблоном, saxon / html / документация / javadoc / net / sf / saxon / s9api /   -  person Martin Honnen    schedule 30.01.2018
comment
Спасибо @MartinHonnen за ваш ответ. Я тоже пробовал использовать s9api. Но, похоже, он работает только для xml в качестве ввода, и когда я использую для ввода json, он дает ту же ошибку. Я следил за тестовыми примерами, написанными saxon. Я предполагаю, что делаю ошибку при использовании s9api для разбора json. Не могли бы вы поделиться каким-нибудь примером или фрагментом кода для прямого синтаксического анализа json с использованием saxon. Заранее спасибо.   -  person Tapan    schedule 31.01.2018
comment
Возможно, вы захотите поделиться кодом XSLT, который у вас есть, соответственно, как вы хотите сначала обработать JSON. Что именно вы хотите делать с JSON?   -  person Martin Honnen    schedule 31.01.2018


Ответы (1)


Сообщение об ошибке указывает на то, что вы, вероятно, используете синтаксический анализатор XML для анализа входных данных JSON. Неясно, содержит ли переменная inputjson фактический текст JSON или URI файла, содержащего фактический текст JSON, но в любом случае это не сработает.

Поскольку правила шаблонов не очень подходят для чего-либо, кроме узлов XML (несмотря на то, что XSLT 3.0 действительно позволяет им), я бы предпочел написать это преобразование следующим образом:

<xsl:param name="json-uri"/>
<xsl:initial-template name="main">
  <xsl:variable name="parsed-json" select="json-doc($json-uri)"/>
  ....
</xsl:initial-template>

(Предполагается, что вы начинаете с URI файла, содержащего JSON)

а затем вызовите его, используя код s9api в строках

Xslt30Transformer trans = ...;
Map<QName, XdmValue> params = new HashMap<>();
params.add(new QName("", "json-uri"), new XdmAtomicValue(jsonInputUri));
trans.setStylesheetParameters(params);
trans.callTemplate(new QName("", "main"), serializer);
person Michael Kay    schedule 31.01.2018