xsl:在for-each-group()里面排序

时间:2016-01-06 00:24:52

标签: xml xslt saxon xslt-3.0

由于某种原因xsl:在for-each-group内部排序因为升级到Saxon 9.7.0.1而引发异常

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>

错误 -

enter image description here

只是想验证这是否是Saxon中的一个错误,或者是因为它曾经在XSLT 3.0中工作的方式而改变的东西

2 个答案:

答案 0 :(得分:3)

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

要研究的两种可能的理论:

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

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

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

答案 1 :(得分:1)

我不认为这是一个真正的修复,但是,神秘的是,你可以在for-each-group体中添加<xsl:value-of select="current-grouping-key()"/>语句,异常消失了。它可以在评论中。

<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>
相关问题