1

我正在尝试使用 Java 中的 XSLT 3.0 将 JSON 转换为 XML。当我运行 Java 程序时,它显示一个错误:Content is not allowed in prolog.

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

2 回答 2

6

基于该错误,听起来您正在使用 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>
于 2017-05-17T20:32:13.383 回答
1

XSLT 适用于 XML 输入,而不是 JSON。

一个简单的谷歌搜索在 GitHub 上找到了这个代码,它声称能够将 JSON 转换为 XML,反之亦然。

于 2017-05-16T22:28:51.003 回答