首页 > 解决方案 > 未定义:调用 XSLTProcessor.prototype.importStylesheet 时出现未定义错误

问题描述

我想美化一些 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;
};

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

在此处输入图像描述

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

在此处输入图像描述

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

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

标签: javascriptfirefoxxsltdomparser

解决方案


就 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树没有想要的缩进。


推荐阅读