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: транзакции "не содержит никаких функций"
Я удостоверился, что мой ActiveX включен для MSXML4 и 6 на IE9. Ниже приведен код основного трансформера XSLT, справочный код XSLT и код JS...
Core 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;
}
Кто-нибудь может подсказать мне, где я ошибаюсь в MSXML6 или IE9?
Спасибо.
2 ответа
Я исправил это, удалив версии (4 и 6) из идентификатора класса ActiveX
например, новый ActiveXObject("Msxml2.FreeThreadedDomDocument") и т. д.
В MSXML 6 использование скрипта внутри XSLT по умолчанию отключено по соображениям безопасности, поэтому необходимо явно включить его, вызвав
var domXsl = new ActiveXObject("Msxml2.FreeThreadedDOMDocument.6.0");
domXsl.setProperty("AllowXsltScript", true);
И дополнительно разрешить использование xsl:import
или же xsl:include
вам также нужно установить
domXsl.setProperty("ResolveExternals", true);