- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个表格,其中有 XML
,在用户填写表单时对其进行操作,并最终转换此操作 XML
通过XSL
。我需要此解决方案在 Chrome、Firefox 和 Internet Explorer 8 至 11 中运行,无需兼容模式。
我用我在 IE 9(或者至少没有用户提示)、Chrome 和 Firefox 上成功运行的代码编写了一个 JSFiddle。但我在 IE 11 上遇到问题。当我的代码尝试执行 transformNode
时来自ActiveXObject
。我尝试了在多个网站(包括此处)中找到的一些建议,但有些建议根本不起作用,或者当我的代码尝试操作 XML
时开始抛出异常。 。因此,我需要帮助才能使此代码正常工作。
这是 JSFiddle:https://jsfiddle.net/mfedatto/6nsc5bf1/
<div id="wrapper"></div>
<div id="console"></div>
try {
function getXmlDom(content) {
var xmlDom;
if (typeof window.DOMParser != "undefined") {
trace.push("Creating DOMParser");
xmlDom = (new window.DOMParser()).parseFromString(content, "text/xml");
trace.push("DOMParser created");
}
else if (typeof window.ActiveXObject != "undefined" && new window.ActiveXObject("Microsoft.XMLDOM")) {
try {
trace.push("Creating MSXML2.DOMDocument.6.0");
xmlDoc = new ActiveXObject("MSXML2.DOMDocument.6.0");
trace.push("MSXML2.DOMDocument.6.0 created");
}
catch (ex) {
trace.push("Creating Microsoft.XMLHTTP");
xmlDoc = new ActiveXObject("Microsoft.XMLHTTP");
trace.push("Microsoft.XMLHTTP created");
}
xmlDom.async = "false";
try { xmlDoc.responseType = "msxml-document"; } catch (ex) { }
trace.push("Loading XML content");
xmlDom.loadXML(content);
trace.push("XML content loaded");
}
else {
throw new Error("No XML parser found");
}
return xmlDom;
}
function xslTransformTo(xsl, xml, wrapper) {
if ((window.ActiveXObject) || "ActiveXObject" in window) {
trace.push("Transforming with ActiveXObject");
wrapper.innerHTML = xml.transformNode(xsl);
trace.push("Transformed with ActiveXObject");
}
else if (document.implementation && document.implementation.createDocument) {
trace.push("Transforming with XSLTProcessor");
xsltProcessor = new XSLTProcessor();
xsltProcessor.importStylesheet(xsl);
wrapper.appendChild(xsltProcessor.transformToFragment(xml, document));
trace.push("Transformed with XSLTProcessor");
}
else {
throw new Error("No XSL parser found");
}
}
function xmlString(xml) {
return (new XMLSerializer()).serializeToString(xml);
}
function showError(ex) {
var console = document.getElementById("console");
showTrace();
console.appendChild(document.createTextNode("ERROR!!! " + ex.message));
}
function showTrace() {
var console = document.getElementById("console");
for (var i = 0; i < trace.length; i++) {
console.appendChild(document.createTextNode(trace[i]));
console.appendChild(document.createElement("br"));
}
}
var trace = [];
var strXml = "<root>\n"
+ " <fc>\n"
+ " <sc>\n"
+ " <i />\n"
+ " <i />\n"
+ " <i />\n"
+ " <i />\n"
+ " </sc>\n"
+ " </fc>\n"
+ "</root>";
trace.push("XML string defined");
var strXsl = "<xsl:stylesheet version=\"1.0\" xmlns:xsl=\"http://www.w3.org/1999/XSL/Transform\">\n"
+ " <xsl:template match=\"/root\">\n"
+ " <ul>\n"
+ " <xsl:for-each select=\"fc/sc/i\">\n"
+ " <li>[<xsl:value-of select=\"position()\" />]</li>\n"
+ " </xsl:for-each>\n"
+ " </ul>\n"
+ " </xsl:template>\n"
+ "</xsl:stylesheet>";
trace.push("XSL string defined");
var strWrapperId = "wrapper";
trace.push("Parsing XML");
var xmlDoc = getXmlDom(strXml);
trace.push("XML parsed");
trace.push("Parsing XSL");
var xslDoc = getXmlDom(strXsl);
trace.push("XML parsed");
var domWrapper = document.getElementById(strWrapperId);
var xmlItemList = xmlDoc.getElementsByTagName("i");
trace.push("All variables loaded");
trace.push("Iterating item positions");
try {
for (var i = 0; i < xmlItemList.length; i++) {
xmlItemList[i].setAttribute("p", i);
}
}
catch (ex) {
showError(ex);
return;
}
trace.push("Itens positions iterared");
trace.push("Transforming XML with XSL to wrapper");
try {
xslTransformTo(xslDoc, xmlDoc, domWrapper);
}
catch (ex) {
showError(ex);
return;
}
showTrace();
}
catch (ex) {
alert(ex.message);
}
P.S.:与我使用的代码的唯一区别是跟踪和 loadXML
基于字符串内容,事实上我使用 load
具有可访问的方法 uri
.
我尝试运行JSFiddle
Martin Honnen 在 IE 11 上发布,显示 ERROR!!! No XSL parser found
。我使用他建议的 MSDN 页面上的说明进行了一些重构。该文章指示尝试,而不是测试,因为某些插件可能会被实例化但未被检测到。这样我的 IE 11 创建并加载我的 XML
和XSL
使用 DOMParser
的对象和内容但无法同时使用 transformNode
进行转换和XSLTProcessor
。如:http://jsfiddle.net/mfedatto/6nsc5bf1/38 中所做的那样
由于某种原因,该解决方案在 JSFiddle 上不起作用,我将对其进行一些挖掘。但有了 Martin Honnen 的回答,我可以加载我的外部 XML
和XSL
文件跨浏览器,包括 IE 11。这是我使用的最终代码:
function loadXmlFile(path) {
var xmlDoc;
if (loadXmlFile.cache === undefined) {
loadXmlFile.cache = { };
}
if (loadXmlFile.cache[path] === undefined) {
try {
xmlDoc = new ActiveXObject("MSXML2.DOMDocument.6.0");
}
catch (e) {
try {
xmlDoc = new ActiveXObject("MSXML2.DOMDocument.3.0");
}
catch (e2) {
xmlDoc = new XMLHttpRequest();
xmlDoc.responseType = "application/xml";
}
}
try {
xmlDoc.open("GET", path, false);
xmlDoc.send();
loadXmlFile.cache[path] = xmlDoc.responseXML;
}
catch (ex) {
xmlDoc.async = false;
xmlDoc.load(path);
loadXmlFile.cache[path] = xmlDoc;
}
}
return loadXmlFile.cache[path];
}
function xslTransformTo(xsl, xml, wrapper) {
if (typeof xml.transformNode != "undefined") {
wrapper.innerHTML = xml.transformNode(xsl);
}
else if (typeof XSLTProcessor != "undefined") {
xsltProcessor = new XSLTProcessor();
xsltProcessor.importStylesheet(xsl);
wrapper.appendChild(xsltProcessor.transformToFragment(xml, document));
}
}
最佳答案
参见https://msdn.microsoft.com/en-us/library/dn423948(v=vs.85).aspx ,在 IE 11 中,您需要在 try/catch 内使用 new ActiveXObject('program.id')
,对 window 属性的检查不起作用。
此外,您在 IE 中使用 DOMParser 创建的 native IE DOM 文档不支持 transformNode
,因此,如果您知道需要在 IE 中使用 XML DOM 文档来进行 XSLT 转换,那么您需要确保您使用 new ActiveXObject
创建了一个 MSXML DOM 文档,并且在尝试实例化 DOMParser 之前,您需要首先在代码中使用 try/catch 尝试执行此操作。
因此,对于从字符串进行 XML 解析,我将使用
function getXmlDom(content) {
var xmlDom;
try {
xmlDom = new ActiveXObject('Msxml2.DOMDocument.6.0');
xmlDom.loadXML(content);
}
catch (e) {
try {
xmlDom = new ActiveXObject('Msxml2.DOMDocument.3.0');
xmlDom.loadXML(content);
}
catch (e2) {
xmlDom = (new DOMParser()).parseFromString(content, 'application/xml');
}
}
return xmlDom;
}
如http://home.arcor.de/martin.honnen/javascript/2016/test2016022301.html中所做的那样.
关于javascript - 使用 XSL 进行跨浏览器 XML 操作和解析(Chrome、Firefox 和 IE 8/11),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35564010/
我已经为桌面和移动 Firefox 开发了一些 Firefox 插件(扩展),但现在我无法将插件/扩展安装到在 Firefox OS 中运行的浏览器中(我正在使用模拟器插件)。请注意,我不想创建一个传
可以将选项卡/网址从移动 Firefox 发送到桌面 Firefox 浏览器,但是否可以以相反的方式执行此操作?从桌面版 Firefox 到移动版 Firefox,并像其他方向一样自动加载。我找不到除
我想等待 Firefox-Browser-Events (sessionstore-windows-restored, user-interaction-inactive,..) 以清除历史记录。我的
我在公司网络中,想为 Firefox 安装一些开发人员工具。不幸的是,政策禁止 Firefox 直接访问互联网,但还有其他浏览器可以访问互联网。现在:如何在没有 Firefox 的情况下直接下载 xp
是否有用于在 firefox 中执行选择性缓存的插件或方法?我可以disable caching entirely ,但我仍然希望能够缓存一些需要几秒钟才能加载的大型 javascript 库 (ex
我目前正在将 Chrome 扩展程序转换为 Firefox 插件,并希望复制 chrome.storage.sync 功能。 但是,我无法使用 simple-storage 找到是否由 Firefox
关闭。这个问题不满足Stack Overflow guidelines .它目前不接受答案。 想改善这个问题吗?更新问题,使其成为 on-topic对于堆栈溢出。 6年前关闭。 Improve thi
所以,我使用这个代码: var options = { enableHighAccuracy: true, timeout: 2000, maximumAge: 100 }; navi
有没有办法打开 Firefox 并强制它在启动时加载临时加载项(webextension)?通常我必须手动去about:debugging并选择我硬盘上的扩展名。我正在寻找一个可以在加载 Firefo
我正在密切关注教程 here当我尝试创建 Firefox 扩展时。我的扩展有以下树: backtosearch +-chrome +-content backtosearch.
如何从代码中正确地重启 firefox(没有任何“恢复 session ”的东西并且使用与以前相同的窗口)? 我知道 bash 脚本进程中“firefox-bin”的 pid,并且我已将自定义插件加载
自从 Firefox 的最后几次更新以来,我们心爱的 Firebug 已集成到 Firefox 开发人员工具中,并且包括我在内的很多人 don't like what happened到 Firebu
当你在某处上传图片时,在使用chrome时,你可以看到状态栏实际上显示了上传的“状态”,即上传完成的百分比。 Firefox 的状态栏有没有办法显示这个上传状态? 最佳答案 用谷歌搜索这个,发现这个:
例如 Chrome 保存在这里:~Library/Application Support/Google/Chrome/Default/Current Tabs和 Safari 在这里 ~/Librar
当火狐开发者版推出时,我很高兴,我可以使用WebIde、响应式设计工具、滴管等……今天我受够了。 里面有很多bug,我就不一一列举我和我的同事发送和批准了多少bug了…… 我在 google 中搜索过
我在 Ubuntu 上使用 Firefox,版本 39.0。我正在尝试调试一个附加组件,并希望在 chrome 权限下运行一些 JavaScript。根据 this page我应该能够在浏览器控制台中
几天前,我更改了我的网站的图标:打开网站后,它可以很好地工作: 我的网站也在我的书签中,但是显示了旧的收藏夹图标: 我已经看过here,但是答案并没有解决我的问题。 解决方法可能非常简单,但是到目前为
我正在使用web API从Firefox开发一个 native 消息传递应用程序。该扩展应该调用一个解析stdin的应用程序,然后基于它解析的一些数据调用我的另一个rust应用程序,但是出于显而易见的
在 Firefox 中有插件和扩展。你能解释一下为什么这些插件有不同的名称和标签吗?它们是否差异如此之大,以至于需要不同的名称?我认为区分这些东西有点不自然,扩展具有越来越多的功能,与插件相比它们缺少
我正在使用附加构建器和附加 SDK 编写 Firefox 扩展。到目前为止,我已经能够解决任何限制,而无需迁移到 XUL。但是,我遇到了障碍。 我的扩展程序有一个长时间运行的进程,可能会阻塞,因此我需
我是一名优秀的程序员,十分优秀!