我正在尝试使用 Java 中的 XSLT 3.0 将 JSON 转换为 XML。当我运行 Java 程序时,它显示一个错误:Content is not allowed in prolog
.
{
color: "red",
value: "#f00"
}
基于该错误,听起来您正在使用 JSON 作为样式表的输入。就像另一个答案中提到的那样,XSLT 仅适用于 XML 输入。
但是,您可以使用初始模板在没有任何输入的情况下运行样式表。然后,您可以通过 传递 JSON 文件的路径xsl:param
并使用unparsed-text()
. 这将为您提供一个字符串,您可以使用json-to-xml()
. (您也可以将 JSON 本身作为 an 传递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。
一个简单的谷歌搜索在 GitHub 上找到了这个代码,它声称能够将 JSON 转换为 XML,反之亦然。