MSXML4 по сравнению с MSXML6 XSLT Ошибка синтаксического анализа пространства имен

Я видел много сообщений в Интернете о MSXML4-6 или XSLT 1.0 по сравнению с 2.0 и т. д. Но они не смогли ответить на мой вопрос.

У меня есть код преобразования XSLT, который работает с API-интерфейсами MSXML4 (XSLTransform и FreeThreadedDomDocument) в IE7 через Javascript.

Тот же код не работает с API-интерфейсами MSXML6 (XSLTransform и DomDocument) в IE9 через Javascript. Выдает эту ошибку

"Пространство имен 'urn:mynamespace:mytable:transactions' не содержит никаких функций"

Я убедился, что мой ActiveX включен для MSXML4 и 6 как в IE9. Ниже приведен код основного преобразователя 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?

Спасибо.


person WPF-it    schedule 29.05.2013    source источник


Ответы (2)


В MSXML 6 использование сценария внутри XSLT по умолчанию отключено по соображениям безопасности, поэтому вам необходимо явно включить его, вызвав

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

Кроме того, чтобы разрешить использование xsl:import или xsl:include, вам также необходимо установить

domXsl.setProperty("ResolveExternals", true);
person Martin Honnen    schedule 30.05.2013
comment
Привет, Мартин, я попробовал этот совет, но он не сработал. Все та же ошибка JS. - person WPF-it; 31.05.2013
comment
Я думаю, вам также нужно разрешить использование xsl:include/import. Я отредактирую ответ. - person Martin Honnen; 31.05.2013
comment
голосование за помощь, которую вы мне оказали. :-) - person WPF-it; 03.06.2013

Я исправил это, удалив версии (4 и 6) из идентификатора класса ActiveX.

например новый ActiveXObject("Msxml2.FreeThreadedDomDocument") и т.д.

person WPF-it    schedule 03.06.2013