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,我不知道为什么。我也在 Edge Chromium 中尝试过,我只看到 table header 并且显然在尝试分组时执行停止,但我无法让 edge 报告任何错误。
如果您在 xsl:for-each
中注释并在 xsl:for-each-group
中注释掉,则效果非常好。
尝试分组时,我做错了什么?
答案很简单:
ALL 浏览器(不幸的是)仅支持 XSLT-1.0。但是 for-each-group
指令是 XSLT-2.0 的一部分。所以如果你使用它,样式表将不起作用(参见 Grouping With XSLT 2.0)。
解法:
坚持 XSLT-1.0 说明并向浏览器创建者强烈抱怨。
我有以下 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,我不知道为什么。我也在 Edge Chromium 中尝试过,我只看到 table header 并且显然在尝试分组时执行停止,但我无法让 edge 报告任何错误。
如果您在 xsl:for-each
中注释并在 xsl:for-each-group
中注释掉,则效果非常好。
尝试分组时,我做错了什么?
答案很简单:
ALL 浏览器(不幸的是)仅支持 XSLT-1.0。但是 for-each-group
指令是 XSLT-2.0 的一部分。所以如果你使用它,样式表将不起作用(参见 Grouping With XSLT 2.0)。
解法:
坚持 XSLT-1.0 说明并向浏览器创建者强烈抱怨。