使用 xslt 3.0 解析 json 时序言错误中不允许内容

Content is not allowed in prolog error while parsing json using xslt 3.0

我正在尝试做一个 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));
    }

但我得到以下错误:

Error on line 1 column 1 of sample_test1.json: SXXP0003: Error reported by XML parser: Content is not allowed in prolog.

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

错误消息表明您可能正在使用 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);