Кроссбраузерное XSLT-преобразование в JavaScript
Столкнулся я однажды с необходимостью отобразить XML-данные погодного информера gismeteo посредством XSLT-шаблона. Причем возникла острая необходимость сделать это через JavaScript, так как на предлагаемом бесплатном хостинге не было поддержки PHP, а значит отпарсить XML на сервере не представлялось возможным.
В результате этой острой необходимости родился код на JavaScript, который я и предлагаю на ваше рассмотрение.
function transformXslt(source,style) {
if(window.ActiveXObject)
{
return source.transformNode(style);
}
else if(window.XSLTProcessor)
{
var xsltProcessor=new XSLTProcessor();
xsltProcessor.importStylesheet(style);
var resultDocument = xsltProcessor.transformToDocument(source);
var xmls = new XMLSerializer();
return xmls.serializeToString(resultDocument);
}
else
{
alert("Преобразование XML не поддерживается браузером");
return null;
}
}
Что мы здесь видим?
А видим мы здесь кроссбраузерное решение данной задачи. XSLT-преобразование в IE производится посредством метода transformNode XML-документа. Во всех остальных браузерах(FF, Chrome, Safari, Opera) XSLT-преобразование делается совсем по-другому. И делается оно посредством объекта XSLTProcessor, в который методом importStylesheet загружается файл стилей XSLT, а результирующий документ генерируется методом transformToDocument(xml). И напоследок мы поручим объекту XMLSerializer сгенерить строковое представление результирующего XML-документа.
И напоследок еще одна полезная, и такая же кроссбраузерная, функция, которая преобразует строковое представление XML (и XSLT)-документа собственно в сам документ, готовый для его дальнейшего использования.
function getXMLFromString(s) {
if(window.ActiveXObject)
{
var xml;
xml=new ActiveXObject("Microsoft.XMLDOM");
xml.async=false;
xml.loadXML(s);
return xml;
}
else if(window.DOMParser)
{
var parser = new DOMParser();
return parser.parseFromString(s,'text/xml');
}
else
{
alert("Загрузка XML не поддерживается браузером");
return null;
}
}
Этот код я собираюсь оставить без комментариев, так как в нем и так все понятно.
Скачать файл с этими функциями вы можете здесь
Прочтите еще:
Отзывов: 6 »
RSS-лента комментариев. Адрес для трекбека


Вообще, для красоты неплохо бы уметь передавать параметры в преобразование. Для Mozilla Safari Opera есть метод setParameter. А вот в IE такая вещь не пройдет. Без загрузки ActiveX (Template) установить параметр для xsl у меня не получилось. А у Вас?
Гм… Приведите, пожалуйста, здесь пример кода, чтобы нам было что обсудить. Возможно, ответ на Ваш вопрос есть вот здесь http://javascript.ru/files/JavaScript.pdf
У Вас в счетчика Google Page Rank неправильно отображается
А это бывает. Не страшно. Это, так сказать, по независящим от нас причинам.
>>Этот код я собираюсь оставить без комментариев, так как в нем и так все понятно.
И статья, похоже сама для себя написана. Пример вызова функции, или пример кода исполнения!?
transformXslt(”ex01-1.xml”,”ex01-1.xsl”)
uncaught exception: [Exception... "Could not convert JavaScript argument arg 0 [nsIXSLTProcessor.importStylesheet]” nsresult: “0×80570009 (NS_ERROR_XPC_BAD_CONVERT_JS)” location: “JS frame :: file:///I:/XML/exam2.html :: transformXslt :: line 17″ data: no]
Line 17: xsltProcessor.importStylesheet(style);
Ага-ага. Для себя, наверное. Кстати, признаю свою вину – надо было в статье пример использования функция написать.
А комментировать в том куске кода и правда абсолютно нечего.
А к тому же в Вашем вызове transformXslt(”ex01-1.xml”,”ex01-1.xsl”) есть одна существенная ошибка(из-за меня допущенная) – в качестве параметров в эту функцию надо подавать не пути к файлам, а сами XML-документы (то есть объекты в памяти), уже загруженные в скрипт. Скоро дополню статью примерами использования. А если кратко – используйте функцию getXMLDocument из статьи “Парсинг XML в JavaScript на примере XML-погоды от gismeteo.ru“. То есть должно сработать вот так(проверьте): transformXslt(getXMLDocument(”ex01-1.xml”),getXMLDocument(”ex01-1.xsl”));