【问题标题】:MSXML4 versus MSXML6 XSLT Parsing Namespace ErrorMSXML4 与 MSXML6 XSLT 解析命名空间错误
【发布时间】:2013-05-24 22:58:40
【问题描述】:

我在网上看到很多关于 MSXML4 到 6 或 XSLT 1.0 与 2.0 等的帖子。但他们无法回答我的问题。

我有一个 XSLT 转换代码,它通过 Javascript 在 IE7 上与 MSXML4 API(XSLTransform 和 FreeThreadedDomDocument)一起使用。

相同的代码不适用于通过 Javascript 在 IE9 上的 MSXML6 API(XSLTransform 和 DomDocument)。它抛出这个错误

“命名空间 'urn:mynamespace:mytable:transactions' 不包含任何函数”

我已确保我的 ActiveX 在 IE9 上都启用了 MSXML4 和 6。下面是主变压器XSLT的代码,参考XSLT & JS代码...

核心 XSLT:functions.xsl

<xsl:stylesheet version="1.0" 
               xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
               xmlns:msxsl="urn:schemas-microsoft-com:xslt" 
               xmlns:myfuncs="urn:mynamespace:mytable:transactions" >

<msxsl:script language="javascript" implements-prefix="myfuncs">

<![CDATA[
// convert system GMT time into local time
// usage: <xsl:value-of select="myfuncs:localDateTime(datetime)"/>

var openBalance = 0;

function setOpenBalance(openBal)
{
    openBalance = openBal;
}

function getOpenBalance()
{
    openBalance = openBal;
    return openBalance ;
}
]]>
</msxsl:script>

</xsl:stylesheet>

主要 XSLT:MyTransformer.xsl ... 引用 functions.xsl

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet 
        version="1.0" 
        xmlns:xsl="http://www.w3.org/1999/XSL/Transform" 
        xmlns:msxsl="urn:schemas-microsoft-com:xslt" 
        xmlns:myfuncs="urn:mynamespace:mytable:transactions">

<xsl:output method="xml"/>    
<xsl:include href="functions.xsl" />  
<!--<xsl:variable name="trade_cur_bal" select="myfuncs:getOpenBalance(100)"/>-->
<xsl:template match="/">
    <Response>
            <!-- Some working code here -->
     </Response>
</xsl:template>

</xsl:stylesheet>

JS 代码

var domXsl  = new ActiveXObject("Msxml2.FreeThreadedDOMDocument.4.0");

/*
 // In case of IE9 .... 
 var domXsl  = new ActiveXObject("Msxml2.FreeThreadedDOMDocument.6.0");
*/

var domHTML = new ActiveXObject("Msxml2.XSLTemplate.4.0");
/*
 // In case of IE9 .... 
var domHTML = new ActiveXObject("Msxml2.XSLTemplate.6.0");
*/

domXsl.async=false;
domXsl.load("MyTransformer.xsl");
domHTML.stylesheet = domXsl;

var domData = new ActiveXObject("Msxml2.FreeThreadedDOMDocument.4.0");
var input = "<MyInputData></MyInputData>"
domData.loadXML(input);

var result = tranform(domHTML, domData); //Works for MSXML 4.0 and fails for MSXML 6.0

function transform(template_, input_) { 
    var output = "";
    if (input_ != null  && input_.xml != "") {
        var proc = template_.createProcessor();
        proc.input = input_;
        proc.transform();
        output = proc.output;
        delete proc;
    }   
    return output;
}

有人可以指导我哪里出错了w.r.t。 MSXML6 还是 IE9?

谢谢。

【问题讨论】:

    标签: javascript xslt internet-explorer-9 msxml6 msxml4


    【解决方案1】:

    在 MSXML 6 中,出于安全原因默认禁用 XSLT 中的脚本,因此您需要通过调用显式启用它

    var domXsl  = new ActiveXObject("Msxml2.FreeThreadedDOMDocument.6.0");
    domXsl.setProperty("AllowXsltScript", true);
    

    此外,为了允许使用xsl:importxsl:include,您还需要设置

    domXsl.setProperty("ResolveExternals", true);
    

    【讨论】:

    • 嗨马丁,我试过这个技巧,但没有奏效。还是同样的 JS 错误。
    • 我认为您还需要允许使用xsl:include/import。我将编辑答案。
    • 为你给我的帮助点赞。 :-)
    【解决方案2】:

    我通过从 activeX 类 ID 中删除版本(4 和 6)解决了这个问题

    例如new ActiveXObject("Msxml2.FreeThreadedDomDocument") 等

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-07-20
      • 1970-01-01
      • 1970-01-01
      • 2019-08-29
      • 2011-11-08
      • 1970-01-01
      • 2010-11-08
      相关资源
      最近更新 更多