2013-05-29 1 views
2

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

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

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

«пространство имен„урна: mynamespace: MYTABLE: сделки“не содержит каких-либо функций»

Я убедился, что мой 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?

Thx.

ответ

1

Я получил это решено удаление версии (4 и 6) образует ACTIVEX идентификатора класса

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

4

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

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

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

domXsl.setProperty("ResolveExternals", true); 
+0

Привет, Мартин, я пробовал этот совет, но он не работал. По-прежнему такая же ошибка JS. –

+0

Я думаю, вам нужно разрешить использование 'xsl: include/import'. Я отредактирую ответ. –

+0

помогать вам за помощь, которую вы мне дали. :-) –