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

标签 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 进行转换时(处理器: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/

相关文章:

java - Java TableRowSorter 中的 NullPointerException

由 Javascript 加载的 XSL 中的 Javascript

javascript - Angular 的第三级点表示法?

javascript - 访问 JSON 响应中的字段

java - 通过反射更改未装箱的原始类型(例如 long,而不是 Long)

java - 使用 Action 监听器获取 JButton 的文本

java - 多个类(class)的绘画

xml - 如何更改不同树的默认排序顺序 sale.order.line

java - 使用流阅读器的问题

php - 按种类选择总和和分组