给出以下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 (PROCESSOR:Apache Software Foundation(Xalan XSLTC),javax.xml.transform.TransformerFactory = org.apache.xalan.xsltc.trax.TransformerFactoryImpl)进行转换时,JSON输出是:
[{"one":"Hello","two":"World"}]
为什么2个处理器产生不同的结果?
答案 0 :(得分:2)
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]