You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

IE中XSL文件无法读取浏览器缓存,始终请求服务器问题求助

解决Microsoft.XMLDOM加载XSL时跳过浏览器缓存的问题

这个问题我之前帮维护遗留系统的团队排查过,核心原因是Microsoft.XMLDOM对象默认会绕过浏览器缓存,强制发起全新请求——哪怕你已经在HTTP响应头里设置了正确的cache-control和expires,它也不遵循浏览器的缓存规则。下面是几个实测有效的解决方案,按稳妥程度排序:

方案1:内嵌XSL到页面(最适合静态XSL)

如果你的XSL内容不经常变动,直接把XSL代码内嵌到HTML页面里,彻底避免HTTP请求:

<!-- 内嵌XSL代码,用type="text/xsl"标识 -->
<script type="text/xsl" id="embeddedXSL">
  <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <!-- 这里放你的XSL模板内容 -->
    <xsl:template match="/">
      <!-- 你的转换逻辑 -->
    </xsl:template>
  </xsl:stylesheet>
</script>

<script>
  var xslDoc = new ActiveXObject("Microsoft.XMLDOM");
  xslDoc.async = false;
  // 直接加载页面内的XSL字符串
  xslDoc.loadXML(document.getElementById('embeddedXSL').text);
  
  // 执行转换
  document.write(myXML.transformNode(xslDoc));
</script>

这种方式完全不需要依赖浏览器缓存,从根源上解决了重复请求的问题。

方案2:用XHR预加载XSL,复用浏览器缓存

XMLHttpRequest会遵循浏览器的缓存规则,所以我们可以先用XHR把XSL加载到浏览器缓存,再把拿到的字符串传给XMLDOM:

<script>
  // 先用XHR加载XSL,触发浏览器缓存
  var xhr = new XMLHttpRequest();
  xhr.open('GET', '/Some Path/myXSL.xsl', false);
  xhr.send();
  
  var xslText = xhr.responseText;
  
  // 把字符串加载到XMLDOM
  var xslDoc = new ActiveXObject("Microsoft.XMLDOM");
  xslDoc.async = false;
  xslDoc.loadXML(xslText);
  
  document.write(myXML.transformNode(xslDoc));
</script>

第一次请求会返回200并缓存XSL,后续请求XHR会直接读取缓存(返回304),XMLDOM只需要处理本地字符串,不会再发起新的HTTP请求。

方案3:修改XMLDOM的缓存属性(仅部分IE版本有效)

部分IE版本(比如IE8+)支持通过setProperty开启XMLDOM的缓存支持,让它遵循浏览器缓存规则:

<script>
  var xslDoc = new ActiveXObject("Microsoft.XMLDOM");
  xslDoc.async = false;
  // 开启ServerHTTPRequest属性,让XMLDOM复用浏览器的HTTP客户端
  xslDoc.setProperty("ServerHTTPRequest", false);
  
  xslDoc.load("/Some Path/myXSL.xsl");
  document.write(myXML.transformNode(xslDoc));
</script>

注意:这个属性在IE6/7上无效,需要结合你的目标浏览器版本测试。

额外说明

为什么你设置了缓存头还是没用?因为Microsoft.XMLDOM的load方法默认使用独立的HTTP请求逻辑,它不会读取浏览器缓存,甚至会在请求头里带上Cache-Control: no-cache(可以抓包验证),所以服务器返回的缓存规则对它不起作用。

内容的提问来源于stack exchange,提问作者Suvi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 07:11:26