XSLT 处理器 returns 0x80600004 (NS_ERROR_XSLT_EXECUTION_FAILURE)

XSLTProcessor returns 0x80600004 (NS_ERROR_XSLT_EXECUTION_FAILURE)

我有以下 HTML 文档试图转换一些 xml:

<!DOCTYPE html>
<html>
    <head>
        <title>Test</title>
        <meta charset="utf-8"/>
        <script>
            var rawXml = `<?xml version="1.0" encoding="UTF-8"?>
            <songs>
                <song name="She loves you" artist="Beatles"/>
                <song name="Yesterday" artist="Beatles "/>
                <song name="Satisfaction" artist="Rolling Stones"/>
                <song name="My Generation" artist="Who"/>
                <song name="Under My Thumb" artist="Rolling Stones"/>
            </songs>`;
            
            var rawXsl = `<?xml version="1.0" encoding="UTF-8"?>
            <xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
                <xsl:template match="/">
                    <table>
                        <tr>
                            <th>Artist</th>
                            <th>Song list</th>
                        </tr>
                        <!-- <xsl:for-each select="songs/song"> -->
                            <!-- <tr> -->
                                <!-- <td><xsl:value-of select="@artist"/></td> -->
                                <!-- <td><xsl:value-of select="@name"/></td> -->
                            <!-- </tr> -->
                        <!-- </xsl:for-each> -->
                        <xsl:for-each-group select="songs/song" group-by="@artist">
                            <tr>
                                <td><xsl:value-of select="current-grouping-key()"/></td>
                                <td><xsl:value-of select="current-group()/@name" separator=","/></td>
                            </tr>
                        </xsl:for-each-group>
                    </table>
                </xsl:template>
            </xsl:stylesheet>`;
            
            function parseXml(text)
            {
                var parser = new DOMParser();
                var xml = parser.parseFromString(text, "application/xml");
                return xml;
            }

            function displayContent()
            {
                var xml = parseXml(rawXml);
                var xsl = parseXml(rawXsl);
                
                var xsltProcessor = new XSLTProcessor();
                xsltProcessor.importStylesheet(xsl);
                var resultDocument = xsltProcessor.transformToFragment(xml, document);
                var target = document.getElementById("contentTarget");
                target.appendChild(resultDocument);
            }
        </script>
    </head>
    <body onload="displayContent()">
        <div id="contentTarget"></div>
    </body>
</html>

所以在 firefox 中我说错误 0x80600004 (NS_ERROR_XSLT_EXECUTION_FAILURE) 和 TBH,我不知道为什么。我也在 E​​dge Chromium 中尝试过,我只看到 table header 并且显然在尝试分组时执行停止,但我无法让 edge 报告任何错误。

如果您在 xsl:for-each 中注释并在 xsl:for-each-group 中注释掉,则效果非常好。 尝试分组时,我做错了什么?

答案很简单:
A​​LL 浏览器(不幸的是)仅支持 XSLT-1.0。但是 for-each-group 指令是 XSLT-2.0 的一部分。所以如果你使用它,样式表将不起作用(参见 Grouping With XSLT 2.0)。

解法:
坚持 XSLT-1.0 说明并向浏览器创建者强烈抱怨。