1

我正在尝试做一个 POC 将 json 转换为 xml 格式。现在我通过 java 使用 Saxon-HE 版本 9.8.0-5

让我们假设一个简单的 json 为:

{
  "Assets": [
    { "Asset": {
      "Open": "25.15",
      "High": "25.15",
      "Low": "25.11",
      "Close": "25.87"
    }},
    { "Asset": {
      "Open": "25.15",
      "High": "25.15",
      "Low": "25.11",
      "Close": "25.87"
    }}
  ]
}

现在java代码如下:

public void transform(File xsl, File inputjson, File outputXml) throws TransformerException, IOException {
        TransformerFactory factory = new net.sf.saxon.TransformerFactoryImpl();
        Source xslt = new StreamSource(xsl);
        Transformer transformer = factory.newTransformer(xslt);
        System.out.println("transformer object created");
        Source text = new StreamSource(inputjson);
        transformer.transform(text, new StreamResult(outputXml));
    }

但我得到以下错误:

sample_test1.json 的第 1 行第 1 列出错:SXXP0003:XML 解析器报告的错误:prolog 中不允许内容。

当我尝试将 json 内容放在任何 xml 元素中并对其进行处理时,它是成功的。为什么??我们不能直接处理 json 而不将其内容放入任何 xml 结构中吗?

4

1 回答 1

1

该错误消息表明您可能正在使用 XML 解析器来解析 JSON 输入。尚不清楚变量“inputjson”是保存实际的 JSON 文本,还是包含实际 JSON 文本的文件的 URI,但无论哪种方式,它都不起作用。

因为模板规则在除了 XML 节点之外的任何东西上都不是很有用(尽管 XSLT 3.0 实际上允许它们),所以我倾向于这样编写这个转换:

<xsl:param name="json-uri"/>
<xsl:initial-template name="main">
  <xsl:variable name="parsed-json" select="json-doc($json-uri)"/>
  ....
</xsl:initial-template>

(假设您从保存 JSON 的文件的 URI 开始)

然后使用 s9api 代码沿线调用它

Xslt30Transformer trans = ...;
Map<QName, XdmValue> params = new HashMap<>();
params.add(new QName("", "json-uri"), new XdmAtomicValue(jsonInputUri));
trans.setStylesheetParameters(params);
trans.callTemplate(new QName("", "main"), serializer);
于 2018-01-31T15:21:08.917 回答