未定义:调用 XSLTProcessor.prototype.importStylesheet 时出现未定义错误

Tom*_*ica 4 javascript xslt firefox domparser

我想美化一些 XML,我发现了以下代码(在这个答案中,JSFiddle)。我这样修改:

const xsltDoc = new DOMParser().parseFromString([
    // describes how we want to modify the XML - indent everything
    '<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform">',
    '  <xsl:output omit-xml-declaration="yes" indent="yes"/>',
    '    <xsl:template match="node()|@*">',
    '      <xsl:copy><xsl:apply-templates select="node()|@*"/></xsl:copy>',
    '    </xsl:template>',
    '</xsl:stylesheet>',
].join('\n'), 'application/xml');
function prettifyXml(sourceXml) {
    var xmlDoc = new DOMParser().parseFromString(sourceXml, 'application/xml');
    var xsltProcessor = new XSLTProcessor();
    // Error happens here:
    xsltProcessor.importStylesheet(xsltDoc);
    var resultDoc = xsltProcessor.transformToDocument(xmlDoc);
    var resultXml = new XMLSerializer().serializeToString(resultDoc);
    return resultXml;
};
Run Code Online (Sandbox Code Playgroud)

运行代码时出现错误,但错误没有任何消息。在 Firefox 控制台中看起来像这样:

在此输入图像描述

这是我在调试器中看到的:

在此输入图像描述

该错误也确实发生在原始答案的小提琴中。我想知道这是什么类型的错误以及如何修复它。

我包含 Firefox 标签,因为我认为这不是正常的浏览器行为。我的版本是61.0.2(64位)。

Mar*_*nen 6

就 XSLT 而言,您需要version样式表根元素上的属性,因此请尝试<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">。这似乎修复了调用时的错误importStylesheet,请参阅https://jsfiddle.net/sgeryvyu/361/。

另一方面,Firefox/Mozilla 的 XSLT 处理器会进行树到树的转换,因此使用transformToDocumentMozilla 时您不会获得任何xsl:output已应用的序列化选项,这意味着尝试通过 XSLT 推送 DOM 树只会为您提供另一个 DOM没有想要的缩进的树。