解释与编译的XSLT 1.0产生不同的JSON输出

时间:2013-09-09 20:22:11

标签: java xml json xslt

给出以下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个处理器产生不同的结果?

1 个答案:

答案 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]