Кроссбраузерное XSLT-преобразование в JavaScript

Автор: Вячеслав Гринин | веб-программирование | 25 Окт 2009 3:00 пп

Столкнулся я однажды с необходимостью отобразить 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 »

  1. Отзыв ivanko — Октябрь 29, 2009 в 6:18 пп

    Вообще, для красоты неплохо бы уметь передавать параметры в преобразование. Для Mozilla Safari Opera есть метод setParameter. А вот в IE такая вещь не пройдет. Без загрузки ActiveX (Template) установить параметр для xsl у меня не получилось. А у Вас?

  2. Отзыв Вячеслав Гринин — Октябрь 29, 2009 в 7:20 пп

    Гм… Приведите, пожалуйста, здесь пример кода, чтобы нам было что обсудить. Возможно, ответ на Ваш вопрос есть вот здесь http://javascript.ru/files/JavaScript.pdf

  3. Отзыв Данила — Февраль 18, 2010 в 3:50 пп

    У Вас в счетчика Google Page Rank неправильно отображается

  4. Отзыв admin — Февраль 19, 2010 в 9:15 дп

    А это бывает. Не страшно. Это, так сказать, по независящим от нас причинам.

  5. Отзыв Evgeny — Февраль 27, 2010 в 2:04 пп

    >>Этот код я собираюсь оставить без комментариев, так как в нем и так все понятно.
    И статья, похоже сама для себя написана. Пример вызова функции, или пример кода исполнения!?

    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);

  6. Отзыв admin — Февраль 27, 2010 в 3:23 пп

    Ага-ага. Для себя, наверное. Кстати, признаю свою вину – надо было в статье пример использования функция написать.
    А комментировать в том куске кода и правда абсолютно нечего.
    А к тому же в Вашем вызове transformXslt(”ex01-1.xml”,”ex01-1.xsl”) есть одна существенная ошибка(из-за меня допущенная) – в качестве параметров в эту функцию надо подавать не пути к файлам, а сами XML-документы (то есть объекты в памяти), уже загруженные в скрипт. Скоро дополню статью примерами использования. А если кратко – используйте функцию getXMLDocument из статьи “Парсинг XML в JavaScript на примере XML-погоды от gismeteo.ru“. То есть должно сработать вот так(проверьте): transformXslt(getXMLDocument(”ex01-1.xml”),getXMLDocument(”ex01-1.xsl”));

RSS-лента комментариев. Адрес для трекбека

Ваш отзыв