XSLTProcessor.transformToDocument在Chrome / Webkit中返回null

时间:2019-06-20 18:14:10

标签: javascript xml google-chrome xslt webkit

我想在Chrome或Safari移动浏览器(Webkit)上使用XSLTProcessor处理网页。

我的测试在Firefox上运行良好,但在Chrome / Safari浏览器中却没有。除了非常简单的文档外,transformToDocument函数将返回null。

<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
</head>
<body>
<p>Hello&nbsp;world</p>
<div>transformToDocument:</div>
<script>
  var xmlSerializer = new XMLSerializer ();
  var domParser = new DOMParser ();
  var xsltProcessor = new XSLTProcessor ();
  var xslString = '<xsl:transform version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">' +
      '<xsl:output method="html"/>' +
      '<xsl:template match="//p"><p><i><xsl:value-of select="."/></i></p></xsl:template>' +
      '<xsl:template match="text()"/>' +
      '</xsl:transform>';
  var xsl = domParser.parseFromString (xslString, 'text/xml');
  xsltProcessor.importStylesheet (xsl);
  var result = xsltProcessor.transformToDocument (document);
  console.log (result); // null with Chrome
  console.log (xmlSerializer.serializeToString (result));
  document.writeln (xmlSerializer.serializeToString (result));
</script>
</body>
</html>

奇怪的是,如果我删除了meta标签和nbsp实体,该示例将正常工作。

您能告诉我什么地方出了问题以及如何解决它。

1 个答案:

答案 0 :(得分:0)

回答我自己的问题:

  • 使用XMLSerializer然后使用DOMParser将输入HTML转换为XML。
  • 替换nbsp实体以解决Safari中的错误(?)。

    var结果= xsltProcessor.transformToDocument(domParser.parseFromString(xmlSerializer.serializeToString(document).replace('&nbsp;','&#160;'),'text / xml'));