如何使用 Angular 6 调用 Chrome 的内置 xml 解析器?



我们在云上有一组XML文档,希望使用Angular提供这些文档。我们有一个XSL文件,其中包含所有XML文档所需的转换。(文档都是相同的格式。)理想情况下,我们希望最大限度地增加客户端的工作(云上的CPU周期比客户端的CPU周期花费更多的钱)。每个文档都有一个到XSL文件的嵌入链接,如下所示:

<?xml-stylesheet type="text/xsl" href="CCD.xsl"?>

如果我只是从Mac终端使用Chrome打开XML文档,如下所示:

sudo /Applications/Google Chrome.app/Contents/MacOS/Google Chrome --allow-file-access-from-files [file].xml

Chrome足够聪明,可以看到XSL引用,并使用其原生XSLT处理器生成最终用于显示文档的HTML。我可以使用Angular实现同样的行为吗?还是必须使用Angular的组件来显示数据?

Angular似乎非常倾向于使用Typescript来构建组件,我看到很多解决方案将XML解析为JSON,然后基于JSON构建Angular组件。但是,如果Chrome已经知道如何转换XML文档,并且我有一个包含所有必要内容的XSL文件,那么转换为JSON似乎需要大量额外的处理。我觉得可能有一种方法可以让Chrome自己处理XSLT处理。

我想记录我最终确定的答案,但首先要澄清一下。

我假设我们使用的是Angular Universal,它在服务器和客户端级别都使用Angular。但这是错误的:我们使用的是普通的ol Angular,它旨在吐出.html和.js文件,供全国各地的浏览器使用,除了API请求的一部分之外,几乎所有的事情都是在客户端完成的。因此,我提到的"最大限度地提高客户端的工作"误解了用例:所有的工作都已经在客户端完成了。

我从来没有找到一种方法让Chrome打开一个XML文件,并通过一种棘手的方式将其交给Chrome来应用XSLT转换,但考虑到无论我如何处理它,浏览器都在做所有的工作,我同意Martin Honnen的建议,使用xsltProcessor。

这个链接显示了使用xlstProcessor的基本方法,我没有偏离太远。

// initialize stuff
const xsltProcessor = new XSLTProcessor();
const parser = new DOMParser();
const xmlRequest = new XMLHttpRequest();
// Get XSL stylesheet
xmlRequest.open('GET', 'assets/CCD.xsl', false);
xmlRequest.send(null);
const xsltDocument = xmlRequest.responseXML;
// Parse core string retrieved from the server to formal XML document
const xmlDocument = parser.parseFromString(this.source, 'text/xml');
// Load stylesheet, transform to html
xsltProcessor.importStylesheet(xsltDocument);
const html = xsltProcessor.transformToDocument(xmlDocument);

最新更新