gpt4 book ai didi

javascript - 当 XSL 使用 xsl :include? 时,如何将 XSL 与 Javascript 一起应用

转载 作者:行者123 更新时间:2023-12-03 00:42:18 28 4
gpt4 key购买 nike

我正在 W3Schools 上使用 XSLT 代码示例:https://www.w3schools.com/xml/xsl_client.asp

我有这部分代码在 IE 中使用基本的 xslt 处理...

<!DOCTYPE html>
<html>
<head>
<script>
function loadXMLDoc(filename)
{
if (window.ActiveXObject)
{
xhttp = new ActiveXObject("Msxml2.XMLHTTP");
}
else
{
xhttp = new XMLHttpRequest();
}
xhttp.open("GET", filename, false);
try {xhttp.responseType = "msxml-document"} catch(err) {} // Helping IE11
xhttp.send("");
return xhttp.responseXML;
}

function displayResult()
{
xml = loadXMLDoc("cdcatalog.xml");
xsl = loadXMLDoc("cdcatalog.xsl");
// code for IE
if (window.ActiveXObject || xhttp.responseType == "msxml-document")
{
ex = xml.transformNode(xsl);
document.getElementById("example").innerHTML = ex;
}
}
</script>
</head>
<body onload="displayResult()">
<div id="example" />
</body>
</html>

问题是我要扩展此解决方案的 XSL 具有复杂的结构,因此有多个 xsl:include 语句可以引入其他 xsl 模板 ( https://www.w3schools.com/xml/ref_xsl_el_include.asp )。 Javascript 不处理 xsl:include 导入,并且 XSLT 处理器不断提示缺少模板。

如何让 Javascript 处理 xsl:include?

最佳答案

通过 Javascript 在 IE 和 Edge 中使用 XSLT 有点困难,因为最初您将通过直接使用 Microsoft 特定 的各种 MSXML(基于 Microsoft COM 的 XML、XPath 和 XSLT 1.0 软件包)组件来做到这一点新的 ActiveXObject。然而,为了更好地兼容其他浏览器,至少在表面上,他们转而支持 XMLHttpRequest(在 IE 和 Edge 中)和 XSLTProcessor(在 Edge 中),但是据我了解,其内部仍然使用 MSXML 6,特别是 XSLT。

由于 MSXML 6 默认将属性 resolveExternals 设置为 false,因此使用 xsl:importxsl:include 失败,因此使用MSXML 6 以编程方式(在浏览器中使用 Javascript 执行此操作)首先需要将该属性设置为 true 以使 MSXML 然后解析并加载外部组件,例如导入或包含的样式表模块。当您通过 XMLHttpRequest 加载 XML 时,只有这些属性没有很好地公开。

我尝试在 https://martin-honnen.github.io/xslt/2018/test2018112004.html 中使用 new ActiveXObject 来实现此目的,但没有成功地使用过多的 IE 特定代码。 (代码可见 https://github.com/martin-honnen/martin-honnen.github.io/blob/master/xslt/2018/test2018112004.html ),但是,当我放弃对 IE 使用 XMLHttpRequest(分别在不支持 XSLTProcessor 的情况下)并直接使用带有 new ActiveXObject 的所有 MSXML 6 组件并设置上述命名属性时,我在 Windows 10 上使用 IE 11 来解析并使用 https://martin-honnen.github.io/xslt/2018/test2018112005.html 中通过 Javascript 导入的样式表(代码可见 https://github.com/martin-honnen/martin-honnen.github.io/blob/master/xslt/2018/test2018112005.html )。我没有尝试过早期的 IE 版本,除了尝试使用 IE 11 开发者工具中的模拟模式之外,基于它也适用于 IE 10 和 9。

所以我在做什么

  function loadDocForXslt(url) {
return new Promise(function(resolve) {
if (typeof XSLTProcessor === 'undefined') {
var doc = new ActiveXObject('Msxml2.DOMDocument.6.0');
doc.setProperty('ResolveExternals', true);
doc.onreadystatechange = function() {
if (doc.readyState === 4) {
resolve(doc);
}
};
doc.load(url);
}
else {
var req = new XMLHttpRequest();
req.open("GET", url);
if (typeof XSLTProcessor === 'undefined') {
try {
req.responseType = 'msxml-document';
}
catch (e) {}
}
req.onload = function() {
resolve(this.responseXML)
}
req.send();
}
});
}

直接使用new ActiveXObject('Msxml2.DOMDocument.6.0')创建MSXML 6 XML DOM文档并设置属性doc.setProperty('ResolveExternals', true); 因此启用 xsl:import/xsl:include

当然,与您在浏览器中执行的大多数操作一样,默认情况下同源策略不允许您从除与脚本的 HTML 相同的源之外的任何位置加载 XML。

关于javascript - 当 XSL 使用 xsl :include? 时,如何将 XSL 与 Javascript 一起应用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53398718/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com