0

给定以下 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"}]}

使用Compiled XSLT(处理器:Apache Software Foundation (Xalan XSLTC),javax.xml.transform.TransformerFactory=org.apache.xalan.xsltc.trax.TransformerFactoryImpl)进行转换时,JSON 输出为:

[{"one":"Hello","two":"World"}]

为什么 2 个处理器会产生不同的结果?

4

1 回答 1

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]
于 2013-09-10T08:39:40.377 回答