无法使用 java 中的 xslt 从 json 转换为 xml

unable to transform from json to xml with xslt in java

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

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

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

一个简单的 Google 搜索发现 this code on GitHub,它声称能够将 JSON 转换为 XML,反之亦然。

根据该错误,您似乎正在使用 JSON 作为样式表的输入。正如另一个答案中提到的,XSLT 仅适用于 XML 输入。

但是,您可以 运行 通过使用初始模板无需任何输入的样式表。然后,您可以通过 xsl:param 传递 JSON 文件的路径,并使用 unparsed-text() 读取它。这将为您提供一个字符串,您可以使用 json-to-xml() 将其转换为 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>

命令Line/Output

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 作为参数传入...

Java

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>