xsl:sort 内部 for-each-group()
xsl:sort inside for-each-group()
由于某种原因 xsl:sort 自从升级到 Saxon 9.7.0.1 后,for-each-group 内部抛出异常
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 中的工作方式发生了变化
一个 IncompatibleClassChangeError
通常意味着 JVM 在 run-time 加载了一个 class,这与编译时的方式不同。也就是说,代码是使用 class 路径编译的,该路径包含某个库 class 的不同版本,与运行时加载的版本不同。
两种可能的研究理论:
(a) 在这种情况下,从表面上看,涉及的所有 classes 似乎都是 Saxon classes,因此这可能表明您有多个版本的Saxon 在 class 路径上,并且出于某种原因正在从两者加载代码。
(b) 另一方面,我可以在您的屏幕截图底部看到 half-cropped,这表明您使用的是 Saxon-EE 和 byte-code 代已启用,这可能表示 byte-code 代中存在错误。尝试禁用 byte-code 生成以查看问题是否消失。例如通过调用 Processor.setConfigurationProperty(FeatureKeys.GENERATE_BYTECODE, false)
.
如果确实是字节码生成错误,请在 http://saxonica.plan.io 记录它,以便我们可以正确跟踪它。我们几乎肯定需要访问演示问题的样式表。
我认为这不是真正的修复,但是,很奇怪,您可以在 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>
由于某种原因 xsl:sort 自从升级到 Saxon 9.7.0.1 后,for-each-group 内部抛出异常
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 中的工作方式发生了变化
一个 IncompatibleClassChangeError
通常意味着 JVM 在 run-time 加载了一个 class,这与编译时的方式不同。也就是说,代码是使用 class 路径编译的,该路径包含某个库 class 的不同版本,与运行时加载的版本不同。
两种可能的研究理论:
(a) 在这种情况下,从表面上看,涉及的所有 classes 似乎都是 Saxon classes,因此这可能表明您有多个版本的Saxon 在 class 路径上,并且出于某种原因正在从两者加载代码。
(b) 另一方面,我可以在您的屏幕截图底部看到 half-cropped,这表明您使用的是 Saxon-EE 和 byte-code 代已启用,这可能表示 byte-code 代中存在错误。尝试禁用 byte-code 生成以查看问题是否消失。例如通过调用 Processor.setConfigurationProperty(FeatureKeys.GENERATE_BYTECODE, false)
.
如果确实是字节码生成错误,请在 http://saxonica.plan.io 记录它,以便我们可以正确跟踪它。我们几乎肯定需要访问演示问题的样式表。
我认为这不是真正的修复,但是,很奇怪,您可以在 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>