尝试在Microsoft Edge上将XML转换为XSLT时出现常规错误

时间:2016-05-17 20:48:40

标签: xml xslt microsoft-edge

我正在开发一个包含大量XML文档的数字档案项目。为了将它们全部转换,我们使用XSLT。但是,在IE,Chrome,Firefox和Safari中运行的相同XSLT转换在Microsoft Edge中不起作用。它只从XML文档中吐出文本,未使用以下错误消息进行格式化:

HTML1300:导航已发生。 XML5001:应用集成的XSLT处理。 XSLT8690:XSLT处理失败。

我尝试了一个基本XML和XSL文件的测试示例,它通过生成转换后的XML来工作,但仍无法找到数字存档XSLT崩溃的位置。

感谢任何帮助。

以下是测试场景: http://www.gracethom.com/test/test.xml

以下是在Edge中无法成功转换的存档的一个文本页面: http://dcl.slis.indiana.edu/petrarchive/content/c001r.xml#rvf001

1 个答案:

答案 0 :(得分:1)

据我所知,问题是由尝试(在包含的样式表中)使用

引起的
  <msxsl:script language="JScript" implements-prefix="exsl">
    this['node-set'] =  function (x) {
    return x;
    }
  </msxsl:script>

获取IE和Edge使用的XSLT处理器MSXML,以支持exsl:node-set扩展功能。使用msxsl:script的代码在IE中工作但在Edge中似乎不受支持,可能是因为出于安全原因他们禁用了msxsl:script,或者因为Edge中新的,更精简的架构不支持它(我猜关于原因,我从未见过有关Edge / MSXML的任何文档说不支持msxsl:script及其原因)。对于它的价值,我现在尝试在https://developer.microsoft.com/en-us/microsoft-edge/platform/issues/7598626/的Microsoft Edge上提交该问题。

没有简单的方法,样式表就像你拥有它们一样复杂并由其他人撰写我想你需要问作者他们是否知道Edge问题并且正在修复它们是否已通知微软关于使用msxsl:script在XSLT 1.0处理器中强制实现exsl:node-set兼容性的已建立的XSLT黑客的问题,现在已经在Edge中被破坏了。

作为快速修复,您可以尝试取消导入导出的样式表中的msxsl:script块,然后替换

  <xsl:template name="xml-to-string">
    <xsl:param name="node-set" select="."/>
    <xsl:apply-templates select="exsl:node-set($node-set)/*" mode="xml-to-string">
      <xsl:with-param name="depth" select="1"/>
    </xsl:apply-templates>
  </xsl:template>

  <xsl:template name="xml-to-string">
    <xsl:param name="node-set" select="."/>
    <xsl:choose>
        <xsl:when test="function-available('msxsl:node-set')">
           <xsl:apply-templates select="msxsl:node-set($node-set)/*" mode="xml-to-string">
             <xsl:with-param name="depth" select="1"/>
           </xsl:apply-templates>
        </xsl:when>
        <xsl:otherwise>
           <xsl:apply-templates select="exsl:node-set($node-set)/*" mode="xml-to-string">
             <xsl:with-param name="depth" select="1"/>
           </xsl:apply-templates>
         </xsl:otherwise>
     </xsl:choose>
  </xsl:template>

我还没有测试是否能解决特定输入文档的问题,显然不是它是否会破坏其他输入文档的内容。