Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xml xsl:sort-inside for-each-group()_Xml_Xslt_Saxon_Xslt 3.0 - Fatal编程技术网

Xml xsl:sort-inside for-each-group()

Xml xsl:sort-inside for-each-group(),xml,xslt,saxon,xslt-3.0,Xml,Xslt,Saxon,Xslt 3.0,出于某种原因,自升级到Saxon 9.7.0.1以来,For each组内的xsl:sort引发了一个异常 XML- <table class="vv"> <tr><td>woot1</td><td>woot2</td></tr> <tr><td>woot1</td><td>woot2</td></tr>

出于某种原因,自升级到Saxon 9.7.0.1以来,For each组内的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: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>

woot1woot2
woot1woot2
woot1woot2
woot1woot2
XSL-

<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: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>

测试
错误-

<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: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中的一个bug,或者它在XSLT 3.0中的工作方式发生了变化。一个
不兼容的ClassChangeError
通常意味着JVM在运行时加载了一个类,这与编译时的方式不同。也就是说,代码是用一个类路径编译的,该类路径包含某个库类的一个不同版本,该版本与运行时加载的版本不同

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

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

(b) 另一方面,我可以在屏幕截图的右下方看到一行半截图,这表明您正在使用启用字节码生成的Saxon EE,这可能表明字节码生成中存在错误。尝试禁用字节码生成以查看问题是否消失。例如,通过调用
Processor.setConfigurationProperty(FeatureKeys.GENERATE\u BYTECODE,false)


如果它确实是一个字节码生成错误,请将其记录在上,以便我们能够正确地跟踪它。我们几乎肯定需要访问演示问题的样式表。

我不认为这是一个真正的解决方案,但奇怪的是,您可以在for each group body中添加一个
语句,例外情况就会消失。它可以在评论中

<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>

试验

我可以用9.7 EE重现问题,但不能用PE或HE重现问题。您也在使用EE吗?谢谢您的回复。刚刚验证了项目中只使用了一个Saxon jar。我们正在检查是否启用了字节码生成。结果表明我们启用了字节码生成。如果我们禁用它,它就会消失。这就是问题所在——其实一点也不神秘。对样式表的微小更改可能会使优化器走上完全不同的道路,从而导致不同的执行计划。这就是为什么我们通常需要一个实际演示问题的repro,而不仅仅是一个代码片段。(感谢supplyone)。虽然本例中的原因很有趣,并在Saxon bug条目中进行了讨论。