Невозможно преобразовать из 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 и наоборот.