В IE существует два способа преобразования документов XML, и оба «ни требуют наличия MSXML. Начиная с версии 3.0 MSXML обеспечи¬вает полную поддержку XSLT 1.0. Для тех, кто еще не установил Windows ХР или IE 6.0, сейчас самое время обновить имеющееся у них анюграммное обеспечение. Последнюю версию MSXML можно найти не адресу http://msdn.microsoft.com/XML/XMLDownloads/.Первый и самый простой способ заключается в том, чтобы загр> документы XML и XSLT в отдельные объекты:
var oXmlDom = zXmlDom.createDocumentO; var oXslDom = zXmlDom.createDocumentO;
oXmlDom.async = false; oXslDom.async = false;
oXmlDom.loadC'books.xml"); . oXslDom.load("books.xsl");
Загрузив оба документа, можно запустить преобразование поср вом метода transformNode():
var sResults = oXmlDom.transformNode(oXslDom);
Метод transformNodeO принимает в качестве аргумента объект DOM (в данном случае это документ XSL, подлежащий преобра нию) и возвращает результаты преобразования в виде строки. Вь вать transformNode() на уровне документа не надо, он может выз* ся из любого элемента документа XML:
var sResults = oXmlDom.documentElement.firstChild.transformNode(oXslDoii]$
Метод transformNodeO выполняет преобразование только того эле! та, для которого он был вызван, и всех его дочерних элементов. В j ном примере результат преобразования первого элемента i казан на рис. 4.3. Такой результат получился по той причине, что ci мощью transf ormNode() был преобразован всего один узел.
Второй метод преобразования немного сложнее, но зато он предостав-больше возможностей. Этот процесс осложняется необходимо-> создания нескольких объектов библиотеки MSXML. Первый шаг iSTOM длительном процессе - создание безопасного в потоковой среде •ъекта XML DOM, в который загружается таблица стилей XSL:
var oXmlDom = zXmlDom.createDocumentO; oXielDom.async = false; oXulDom.load("books.xml");
Г var oXslDom? new ActiveX0bject("Msxml2.FreeThreadedD0MDocument.3.0");
§
oXslDoro.async = false; oXslDom.load("books.xsl");
Класс FreeThreadedDOMDocument - это еще один класс ActiveX, входящий • состав библиотеки MSXML. Он применяется для создания объекта, чю мы и делаем в данном примере (создание объекта XSLTemplate демон¬стрируется в следующем фрагменте кода). В ранних версиях MSXML иаждый вызов transformNode() приводил к перекомпиляции таблицы ней XSL, существенно замедляя преобразование. В случае приме¬ни FreeThreadedDOMDocument скомпилированная таблица стилей по-иияцается в кэш и пребывает в состоянии готовности, пока не будет увалена из памяти.
Создав объект XML DOM, надо создать еще один объект ActiveX, шаб-[XSL:
•var oXslTemplate = new ActiveX0bject("Msxml2.XSLTemplate.3.0"); oXslTemplate.stylesheet = oXslDom;
Класс XSLTemplate служит для кэширования таблицы стилей XSL и соз¬нания процессора XSLProcessor. Затем, после того как будет создан шаб¬лон, ссылка на документ XSL записывается в свойство stylesheet клас¬са XSLTemplate, который загружает и кэширует таблицу стилей XSL.
На следующем шаге для создания процессора XSLProcessor вызывается истод createProcessor() класса XSLTemplate:
k
var oXslProcessor = oXslTemplate.createProcessor(); oXslProcessor.input = oXmlDom;
В свойство input созданного процессора записывается ссылка на oXml-9о* - объект XML DOM, содержащий исходный документ XML. После агого процессор готов к выполнению преобразования, поэтому выпол-ввш его и выведем результат:
^oXslProcessor. transform();
Щdocument.body.innerHTML = oXslProcessor.output;
В отличие от transformNode(), метод transform() не возвращает резуль¬тат преобразования в виде строки. Чтобы получить его, необходимо об-иатиться к свойству output объекта XSLProcessor. В целом процесс преобразования требует большего объема программного кода, чем : transformNodeO, но результат получается тот же самый. Какие жеaj имущества дает второй способ?
Библиотека MSXML предоставляет ряд дополнительных методов^ торые могут использоваться в процессе выполнения преобразовав вторым способом. Первый из них addObjectO- Этот метод добаввв в таблицу стилей объект JavaScript, методы которого можно вызьвя в процессе преобразования, а значения его свойств выводить в выв] ной документ. Рассмотрим следующий объект:
var oBook = {
propertyOne : "Список моих книг", methodOne : function () {
alert("Добро пожаловать в список моих книг"); return "";

Что если вы захотите воспользоваться им в процессе преобразоЕ Метод addObjectO позволяет передать объект в таблицу стилей ХЯ] при этом в первом аргументе передается объект oBook, а во вторя универсальный идентификатор ресурса пространства имен, котов идентифицирует его. Ниже приводится пример добавления этогоа| екта с идентификатором пространства имен http://my-object:
var oXmlDom = zXmlDom.createDocumentO; oXmlDom.async = false; oXmlDom.load("books.xml");
var oXslDom = new ActiveX0bject("Msxml2.FreeThreadedD0MDocument.3.0" oXslDom.async = false; oXslDom.load("books.xsl");
var oXslTemplate = new ActiveX0bject("Msxml2.XSLTemplate.3.0"); oXslTemplate.stylesheet = oXslDom;
var oXslProcessor = oXslTemplate.createProcessorO; oXslProcessor.input = oXmlDom;
oXslProcessor.addObject(oBook, "http://my-object");
oXslProcessor.transform(); document.body.innerHTML = oXslProcessor.output;
Теперь объект oBook передан процессору XSLProcessor, т. е. он моя пользоваться в таблице стилей XSLT, но надо еще внести изме в документ XSL. В первую очередь необходимо добавить еще одно] странство имен в корневой элемент . Оно доля падать с тем, что было передано методу addObjectO:

доступа к объекту будет использоваться префикс bookObj. Теперь, пространство имен и префикс готовы, необходимо добавить в до-несколько элементов , посредством которых бу-т производиться обращения к членам объекта:

Citnl>

type="text/css" href="books.css" />

fc
V"ntml>

уже говорилось, директива XSL извлекает значе-e элемента или в данном случае объекта. Первая директива извлекает (или вызывает) метод methodOne(), выводящий текст кпнаетствия. Вторая директива похожа на первую, за ииючением того, что она извлекает значение свойства propertyOne titiLTa oBook. Когда броузер отобразит результат преобразования, анерху страницы пользователь увидит фразу «Список моих книг».свойства и методы объектов, используемых в преобразованиях, долж¬ны возвращать значения, которые будут понятны процессору XSLProces¬sor. Это строки, числа и логические величины. Любые другие значения бу-•Уш приводить к появлению ошибки в процессе преобразования.
№Следующая интересная особенность XSLProcessor - это метод addParame-г(). В отличие от объектов JavaScript, которые можно использовать ,*процессе преобразования, параметры представляют собой стандарт-элементы XSLT. Параметры передаются в таблицу стилей XSL tjH*eryT выступать в качестве переменных. Чтобы определить пара-, необходимо передать методу его имя и значение:
oXslProcessor = oXslTemplate.createProcessor(); aXslProcessor.input = oXmlDom; Jjf cXslProcessor.addParameter("message", "Список моих книг");
nw фрагмент кода добавит параметр с именем message в XSLProcessor. «ходе преобразования процессор возьмет в качестве значения параметра шпаку «Список моих книг» и разместит ее там, где это будет необходи-нн. Для определения параметра в XSL служит директива :
JFbel.-param name="message" />
Обратите внимание, что значение атрибута name совпадает с имен раметра, переданного методу addParameter(). Этот параметр приоб ет значение «Список моих книг», которое можно прочитать, об" шись к параметру как к переменной:

В этом примере директива извлекает значение па¬ра. Измененный вариант таблицы стилей XSL мог бы выглядеть

В эту таблицу стилей добавлены две строки кода. Первая содер рективу , а вторая - директиву , извл-щую значение параметра. Объявление параметра может распола в любом месте документа XSL. В данном фрагменте объявление метра находится в начале документа, но это совершенно не обязаг
Еще одна, последняя, особенность процессора XSLProcessor - это кая скорость работы. Он выполняет предварительную комш таблицы стилей XSL, что значительно повышает скорость поел щих преобразований, выполняемых с помощью той же самой та' (в сравнении с методом transformNodeO). Перед выполнением п ных преобразований следует вызывать метод reset () объекта Xе cessor. Этот метод очищает свойства input и output, не затрагивая ство stylesheet, и подготавливает процессор к выполнению еле го преобразования с той же самой таблицей стилей.

Высокая мебель для ванной комнаты. Мебель для Ванных Комнат от Компании X-Wood. . Подготовка дипифр в Академии Международного Учета. Подготовка к экзамену дипифр. . мойки высокого давления для автомобилей