Javascript MSXML4与MSXML6 XSLT解析命名空间错误

Javascript MSXML4与MSXML6 XSLT解析命名空间错误,javascript,xslt,internet-explorer-9,msxml6,msxml4,Javascript,Xslt,Internet Explorer 9,Msxml6,Msxml4,我在网上看到很多关于MSXML4到6或XSLT1.0与2.0等的帖子,但他们无法回答我的问题 我有一个XSLT转换代码,它通过Javascript与IE7上的MSXML4API(XSLTransform和FreeThreadedDomDocument)一起工作 同样的代码不能通过Javascript在IE9上使用MSXML6 API(XSLTransform和DomDocument)。它抛出了这个错误 “名称空间”urn:mynamespace:mytable:transactions“不包含任

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

我有一个XSLT转换代码,它通过Javascript与IE7上的MSXML4API(XSLTransform和FreeThreadedDomDocument)一起工作

同样的代码不能通过Javascript在IE9上使用MSXML6 API(XSLTransform和DomDocument)。它抛出了这个错误

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

<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>
我已确保在IE9上为MSXML4和MSXML6启用了ActiveX。下面是主转换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>

var-openBalance=0;
函数setOpenBalance(openBal)
{
openBalance=openBal;
}
函数getOpenBalance()
{
openBalance=openBal;
返回openBalance;
}
]]>
Main 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=newactivexobject(“Msxml2.freethreadedomdocument.4.0”);
/*
//如果是IE9。。。。
var domXsl=newActiveXObject(“Msxml2.FreeThreadedDOMDocument.6.0”);
*/
var domHTML=newActiveXObject(“Msxml2.XSLTemplate.4.0”);
/*
//如果是IE9。。。。
var domHTML=newActiveXObject(“Msxml2.XSLTemplate.6.0”);
*/
domXsl.async=false;
load(“MyTransformer.xsl”);
domHTML.stylesheet=domXsl;
var domData=newactivexobject(“Msxml2.freethreadedomdocument.4.0”);
var input=“”
loadXML(输入);
var result=tranform(domHTML,domData)//适用于MSXML 4.0,但不适用于MSXML 6.0
函数转换(模板,输入){
var输出=”;
if(input.=null&&input..xml!=“”){
var proc=template_u2;.createProcessor();
过程输入=输入;
proc.transform();
输出=过程输出;
删除proc;
}   
返回输出;
}
有人能告诉我,我在哪里出了问题吗?w.r.t.MSXML6或IE9


Thx.

对于MSXML 6,出于安全原因,默认情况下禁用在XSLT中使用脚本,因此需要通过调用

var domXsl  = new ActiveXObject("Msxml2.FreeThreadedDOMDocument.6.0");
domXsl.setProperty("AllowXsltScript", true);
此外,要允许使用
xsl:import
xsl:include
,还需要设置

domXsl.setProperty("ResolveExternals", true);

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


e、 g.新的ActiveXObject(“Msxml2.freethreadedomdocument”)等。

嗨,马丁,我试过这个技巧,但没用。仍然是相同的JS错误。我认为您还需要允许使用
xsl:include/import
。我将编辑答案。向您投票,感谢您给予我的帮助。:-)