【问题标题】:Interpreted vs. Compiled XSLT 1.0 produces different JSON output解释与编译的 XSLT 1.0 产生不同的 JSON 输出
【发布时间】:2013-09-13 10:11:03
【问题描述】:

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

【问题讨论】:

    标签: java xml json xslt


    【解决方案1】:

    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]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-11-22
      • 1970-01-01
      • 2019-12-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多