3

由于某种原因,自升级到 Saxon 9.7.0.1 以来,for-each-group 中的 xsl:sort 引发异常

XML-

<table class="vv">
        <tr><td>woot1</td><td>woot2</td></tr>
        <tr><td>woot1</td><td>woot2</td></tr>
        <tr><td>woot1</td><td>woot2</td></tr>
        <tr><td>woot1</td><td>woot2</td></tr>
</table>

XSL-

<xsl:template match="/">
  <xsl:apply-templates/>
</xsl:template>

<xsl:template match="table[@class='vv']">
    <div class="row">
        <xsl:for-each-group select="tr" group-by="td[1]/text()">
            <xsl:sort/>
            test
        </xsl:for-each-group>
    </div>
</xsl:template>

错误-

在此处输入图像描述

只是想验证这是否是 Saxon 中的错误,或者在 XSLT 3.0 中过去的工作方式有所改变

4

2 回答 2

3

IncompatibleClassChangeError通常意味着JVM在运行时加载了一个与编译时不同的类。也就是说,代码是使用类路径编译的,其中包含与运行时加载的版本不同的某个库类的版本。

两种可能的研究理论:

(a) 在这种情况下,从表面上看,所涉及的所有类似乎都是 Saxon 类,因此这可能表明您在类路径中有多个 Saxon 版本,并且出于某种原因正在从两者加载代码.

(b) 另一方面,我可以在您的屏幕截图底部看到一半被裁剪的行,这表明您正在使用 Saxon-EE 并启用了字节码生成,这可能表明字节中存在错误-代码生成。尝试禁用字节码生成以查看问题是否消失。例如通过调用Processor.setConfigurationProperty(FeatureKeys.GENERATE_BYTECODE, false).

如果它确实是一个字节码生成错误,请将其记录在http://saxonica.plan.io,以便我们可以正确跟踪它。我们几乎可以肯定需要访问演示问题的样式表。

于 2016-01-06T09:28:36.303 回答
1

我不认为这是一个真正的解决方法,但是,奇怪的是,您可以<xsl:value-of select="current-grouping-key()"/>在 for-each-group 正文中添加一个语句,异常就消失了。它可以在评论中。

<xsl:template match="table[@class='vv']" mode="copy">
    <div class="row">
        <xsl:for-each-group select="tr" group-by="td[1]/text()">
            <xsl:sort/>
            <xsl:comment><xsl:value-of select="current-grouping-key()"/></xsl:comment>
           test 
        </xsl:for-each-group>
    </div>
</xsl:template>
于 2016-01-07T01:10:17.223 回答