给定以下 XML:
<abc>
<def>
<one>Hello</one>
<two>World</two>
</def>
</abc>
此处提供了用于将 XML 转换为 JSON 的 XSL 文件:http://dropbox.ashlock.us/open311/json-xml/xml-tools/xml2json_spark.xsl
使用解释型 XSLT 进行转换时(处理器:Apache Software Foundation,javax.xml.transform.TransformerFactory=org.apache.xalan.processor.TransformerFactoryImpl),JSON 输出为:
{"abc":[{"one":"Hello","two":"World"}]}
使用编译的 XSLT 进行转换时(处理器:Apache Software Foundation (Xalan XSLTC)、javax.xml.transform.TransformerFactory=org.apache.xalan.xsltc.trax.TransformerFactoryImpl),JSON 输出是:
[{"one":"Hello","two":"World"}]
为什么两个处理器产生不同的结果?
最佳答案
Saxon 的输出与 XSLTC 相同:
[{"one":"Hello","two":"World"}]
我还没有尝试详细调试样式表。它不包含任何明显的实现定义的内容,因此对我来说它看起来像是 Xalan 解释中的错误。
这种模式是有问题的,尽管不是非法的:
*[count(../*[name(../*)=name(.)])=count(../*) and count(../*)>1]
这是有问题的,因为 name(../*) 正在向 name 函数提供一系列元素。在 XSLT 2.0 中这将是一个错误,但在 1.0 模式中它给出了第一个选定元素的名称。我怀疑作者可能有这样的意图
*[count(../*[name(.)=name(current())])=count(../*) and count(../*)>1]
关于java - 解释型与编译型 XSLT 1.0 产生不同的 JSON 输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18706403/