首页 > 解决方案 > 从变量加载 XML 和 XSL 并在浏览器中转换

问题描述

下面的代码片段是我遇到的问题的最小重现。目的是通过 XSL 转换 XML 并将结果转换为变量。

注释行发生错误。我究竟做错了什么?

更大的图景是,我希望能够在浏览器中拥有 XML 文件的 URL 和 XSL 文件的 URL,并使用 XSL 转换 XML。我已经从服务器管道中加载了所有文件,但是我收到了这个错误,并且在 Google 中找不到可以理解的答案。自 2014 年左右以来,客户端的 XML 转换似乎很少受到关注,所以我想知道是否有更现代的技术或插件。

我很乐意接受一个普通的 JS 或 jquery 答案,或一个插件。

我知道这个最小的例子不是跨浏览器(没有针对 IE 风格的解决方案),但我应该说我确实需要一个跨浏览器解决方案作为最终答案。

最后,我知道您可以在服务器上进行转换,这不在规范中。

这是来自控制台的错误和问题。

err=TypeError:无法在“XSLTProcessor”上执行“importStylesheet”:参数 1 不是“节点”类型。

错误:{“消息”:“未捕获的TypeError:无法在'XSLTProcessor'上执行'transformToFragment':参数1不是'Node'类型。”,“文件名”:“ https://stacksnippets.net/js ”, “lineno”:26,“colno”:32}

这是导致错误的代码。

var xsltProcessor, resultDocument, xml, xsl;

var xml = '<?xml version="1.0" encoding="UTF-8"?><catalog><cd><title>Empire Burlesque</title></cd></catalog>';
var xsl = '<?xml version="1.0" encoding="UTF-8"?><xsl:stylesheet version="1.0"xmlns:xsl="http://www.w3.org/1999/XSL/Transform"><xsl:template match="/">  <h2>My CD Collection</h2>  <table border="1">    <tr bgcolor="#9acd32">      <th style="text-align:left">Title</th>      <th style="text-align:left">Artist</th>    </tr>    <xsl:for-each select="catalog/cd">    <tr>      <td><xsl:value-of select="title" /></td>    </tr>    </xsl:for-each>  </table></xsl:template></xsl:stylesheet>'


xsltProcessor = new XSLTProcessor();
try {
  xsltProcessor.importStylesheet(xsl);  // < error here !
} catch (error) {
  console.log('err=' + error);
}
resultDocument = xsltProcessor.transformToFragment(xml, document);

console.log(resultDocument);

标签: xmlxsltclient

解决方案


要回答您问题的这一部分:

自 2014 年左右以来,客户端的 XML 转换似乎很少受到关注,所以我想知道是否有更现代的技术或插件。

我想说自 2004 年左右以来,浏览器供应商几乎没有关注它。

但是,如果您想要更现代的东西,可以使用 Saxon-JS,它是 XSLT 3.0 的纯 Javascript 实现。它不仅支持 3.0 标准,而且还具有使其具有交互性的扩展,因此您可以直接在 XSLT 代码中处理用户输入事件。详情见http://www.saxonica.com/saxon-js/index.xml

免责声明:Saxon-JS 由我的公司 Saxonica 生产。


推荐阅读