undefined:调用XSLTProcessor.prototype.importStylesheet时发生未定义的错误

时间:2018-08-23 15:57:55

标签: javascript firefox xslt domparser

我想美化一些XML,发现以下代码(in this answerJSFiddle)。我是这样修改的:

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控制台中看起来像这样:

enter image description here

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

enter image description here

原始答案中的小提琴中也确实发生了错误。我想知道这是什么错误以及如何解决。

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

1 个答案:

答案 0 :(得分:0)

对于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处理器可以进行树到树的转换,因此在使用transformToDocument和Mozilla的情况下,您将不会应用xsl:output的任何序列化选项,这意味着尝试通过XSLT推送DOM树只是为您提供了另一棵DOM树而没有所需的缩进。