javascript - 未定义:调用 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 位)。
解决方案
就 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树没有想要的缩进。
推荐阅读
- jenkins-pipeline - 如何在詹金斯管道中只限制一个参数?
- r - 如果缺少需要 TRUE/FALSE 的值 - 星期几作为数字
- javascript - 显示 JavaScript 警报后重定向到 php URL
- javascript - 为什么你只删除一个项目?是否可以删除所选项目?
- spring-boot - 无论如何我们可以使用 Spring Cloud Functions + AWS Lambda 适配器来处理 http 文件上传吗?
- azure - 如何在 Microsoft azure 云中部署 index.html 文件?
- javascript - JQuery Timepicker 响应问题
- keras - keras 有像 VGG19 这样的预训练 AlexNet 吗?
- vba - 如何修复:ThisDocument.Close 冻结 MS Word
- google-app-engine - AppEngine Standard:如何根据服务名称和版本进行调度?