Невозможно преобразовать из JSON в XML с XSLT в Java

Я пытаюсь преобразовать JSON в XML с помощью XSLT 3.0 в Java. Когда я запускаю программу Java, она отображает ошибку: Content is not allowed in prolog,

{
    color: "red",
    value: "#f00"
}

2 ответа

Решение

Исходя из этой ошибки, похоже, что вы используете JSON в качестве входных данных для таблицы стилей. Как упоминалось в другом ответе, XSLT будет работать только с вводом XML.

Тем не менее, вы можете запустить таблицу стилей без какого-либо ввода, используя исходный шаблон. Затем вы можете передать путь к файлу JSON через xsl:param и читать это с unparsed-text(), Это даст вам строку, которую вы можете конвертировать в XML json-to-xml(), (Вы также можете передать сам JSON как xsl:param и использовать этот параметр непосредственно в json-to-xml() вызов.)

Кроме того, в вашем примере JSON ключи должны быть заключены в кавычки.

Вот пример запуска из командной строки с использованием Saxon-HE 9.8...

JSON (so.json)

{
    "color": "red",
    "value": "#f00"
}

XSLT 3.0 (json2xml.xsl)

<xsl:stylesheet version="3.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output indent="yes"/>
  <xsl:strip-space elements="*"/>

  <xsl:param name="jsonFile"/>

  <xsl:mode on-no-match="shallow-copy"/>

  <xsl:template name="init">
    <xsl:variable name="json" select="unparsed-text($jsonFile)"/>
    <xsl:apply-templates select="json-to-xml($json)"/>
  </xsl:template>

</xsl:stylesheet>

Командная строка / Вывод

C:\temp>java -cp "C:/apps/saxon/saxon9he.jar" net.sf.saxon.Transform -it:"init" -xsl:"json2xml.xsl" jsonFile="so.json"
<?xml version="1.0" encoding="UTF-8"?>
<map xmlns="http://www.w3.org/2005/xpath-functions">
   <string key="color">red</string>
   <string key="value">#f00</string>
</map>

Вот пример Java (с использованием Saxon-HE 9.7), показывающий, как передать JSON в качестве параметра...

Джава

package so.test1;

import java.io.File;
import java.io.OutputStream;
import javax.xml.transform.stream.StreamSource;
import net.sf.saxon.s9api.XsltTransformer;
import net.sf.saxon.s9api.Processor;
import net.sf.saxon.s9api.QName;
import net.sf.saxon.s9api.SaxonApiException;
import net.sf.saxon.s9api.Serializer;
import net.sf.saxon.s9api.XdmAtomicValue;
import net.sf.saxon.s9api.XsltCompiler;
import net.sf.saxon.s9api.XsltExecutable;

/**
 *
 * @author dhaley
 *
 */
public class SOTest1 {

    public static void main(String[] args) throws SaxonApiException {
        final String XSLT_PATH = "src/so/test1/json2xml.xsl";
        final String JSON = "{\n" +
                            "    \"color\": \"red\",\n" +
                            "    \"value\": \"#f00\"\n" +
                            "}";

        OutputStream outputStream = System.out;        
        Processor processor = new Processor(false);        
        Serializer serializer = processor.newSerializer();
        serializer.setOutputStream(outputStream);        
        XsltCompiler compiler = processor.newXsltCompiler();
        XsltExecutable executable = compiler.compile(new StreamSource(new File(XSLT_PATH)));        
        XsltTransformer transformer = executable.load();
        transformer.setInitialTemplate(new QName("init")); //<-- SET INITIAL TEMPLATE
        transformer.setParameter(new QName("jsonText"), new XdmAtomicValue(JSON)); //<-- PASS JSON IN AS PARAM
        transformer.setDestination(serializer);
        transformer.transform();

    }

}

XSLT 3.0 (обновленный json2xml.xsl)

<xsl:stylesheet version="3.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output indent="yes"/>
  <xsl:strip-space elements="*"/>

  <xsl:param name="jsonText"/>

  <xsl:mode on-no-match="shallow-copy"/>

  <xsl:template name="init">
    <xsl:apply-templates select="json-to-xml($jsonText)"/>
  </xsl:template>

</xsl:stylesheet>

Выход (System.out)

<?xml version="1.0" encoding="UTF-8"?>
<map xmlns="http://www.w3.org/2005/xpath-functions">
   <string key="color">red</string>
   <string key="value">#f00</string>
</map>

XSLT работает с XML-вводом, а не с JSON.

Простой поиск в Google нашел этот код на GitHub, который утверждает, что может конвертировать JSON в XML и наоборот.

Другие вопросы по тегам