Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Ajax_v_deystvii.pdf
Скачиваний:
34
Добавлен:
05.03.2016
Размер:
5.83 Mб
Скачать

494 Часть IV. Ajax в примерах

12.4. Объединение документов XSL и XML

Возвращаясь на сторону клиента, мы сталкиваемся с задачей объединения полученных с сервера документов XSL и XML. При использовании XSLT-преобразования следует помнить, что браузеры по-разному объединяют документы указанных типов. Следовательно, вначале необходимо проверить, какой метод поддерживает браузер, чтобы загрузить и объединить два документа.

Как и ранее, мы используем объект ContentLoader (см. главу 3). Данный объект содержится во внешнем JavaScript-файле net . js . Этот файл определяет, как отправлять информацию на сервер, скрывая все отличия работы браузеров за удобным интерфейсным объектом.

<script type="text/javascript" src="net.js"X/script>

Теперь можно начинать процесс получения файлов с сервера и объединения их на стороне клиента. В листинге 12.7 приведена функция LoadXMLXSLTDoc (), вызываемая из функции GrabNumber(), представленной в листинге 12.2. Функция GrabNumber() передает значения URL, генерирующего XML-данные, XSL-файл и идентификатор элемента, в который должны выводиться данные. Имея три указанных значения, мы можем загрузить два документа и объединить их после завершения загрузки. Как показано в листинге 12.7, для объединения файлов XML и XSL потребуется специальный код. предусматривающий возможность использования различных браузеров.

ЛИСТИНГ 12.7. ФУНКЦИЯ LoadXMLXSLTDoc . Я Н Н Н Н Н Ш Н В Н Н

// О Обьявить глобальные переменные

var xmlDoc; var xslDoc; var objOutput;

// © Обнулить переменные

function LoadXMLXSLTDoc(urlXML,urlXSL,elementID){ xmlDoc=null;

xslDoc=null;

//& Определить выходной элемент objOutput = document.getElementById{ elementld);

//О Загрузить файлы XML и XSL

new net.ContentLoader(urlXML,onXMLLoad); new net.ContentLoader(urlXSL,onXSLLoad);

}

// 0 Обработать XML-докуыеит function onXMLLoad(){

xmlDoc=this.req.responseXML;

doXSLT();

}

// 0 Обработать XSL-документ f u n c t i o n onXSLLoad(){

x s l D o c = t h i s . r e q . r e s p o n s e X M L ; doXSLT();

}

// О Проверить, загрузились ли документы

Глава 12 "Живой" поиск с использованием XSLT 495

function doXSLT{){

if (xmlDoc==null || xslDoc==null){ return; }

//© Преобразовать XML-докуыент if (window.ActiveXObject){

objOutput.innerHTML=xmlDoc.transformNode(xslDoc);

}

else{

var xsltProcessor = new XSLTProcessor(); xsltProcessor.importstylesheet(xslDoc);

var fragment =xsltProcessor.transformToFragment( xmlDoc,document);

objOutput.innerHTML = ""; objOutput.appendChild(fragment);

 

}

_j

_я

Чтобы упростить клиентскую часть сценария, необходимо объявить три глобальные переменные О, которые будут вмещать три различных объекта. Первые две переменные, xmlDoc и xslDoc, предназначены для хранения файлов XML и XSL, возвращаемых с сервера. Третья переменная, objOutput, содержит объектную ссылку на элемент DOM, в который будут выводиться результаты. Определив указанные переменные, можно создать функцию LoadXMLXSLTDoc (), вызываемую из функции GrabNumber ().

Поскольку мы загружаем два документа, нужно определить момент, когда оба они будут доступны. Для этого мы проверим, получили ли уже переменные xmlDoc и xslDoc соотнесенные с ними документы. Прежде чем начать, мы должны присвоить обеим этим переменным значение null @. Это гарантирует, что переменные не содержат никаких данных, даже если функция запускается на странице несколько раз. Чтобы задать объект для вывода результата объединения, из вызова функции берется идентификатор переданного элемента ©. Далее мы дважды вызываем функцию ContentLoader — один раз для документа XML и один раз для документа XSL О. При каждом вызове функция ContentLoader получает URL, а затем вызывает другую функцию для загрузки документов. Функция onXMLLoadO © загружает возвращаемый XML-документ в глобальную переменную xmlDoc, а затем вызывает функцию doXSLT () для последующей обработки. Функция onXSLLoadO © загружает XSL-документ в глобальную переменную xslDoc и также вызывает функцию doXSLT ().

Обработка не может продолжаться, пока не будут загружены оба документа, а мы никак не можем определить, который из них будет загружен первым, поэтому функция doXSLT () вначале проверяет, загружены ли оба документа. Она вызывается дважды — после загрузки документа XML и документа XSL. При первом вызове этой функции одна из глобальных переменных все еще имеет значение null, поэтому мы завершаем выполнение функции 0. При следующем вызове выполнение функции не завершается, поскольку ни одна переменная не имеет значения null. Теперь загружены оба документа, и можно выполнять XSLT-преобразование ©.

496 Часть IV. Ajax в примерах

После загрузки обоих документов необходимо преобразовать XMLдокумент с применением XSLT. Изучая код, приведенный в листинге 12.7. видим, что требуемого можно достичь двумя различными способами в зависимости от браузера. Internet Explorer использует функцию transf ormNode {), тогда как Mozilla — объект XSLTProcessor. В связи с этим ниже мы подробно рассмотрим две различные реализации преобразования.

12.4.1. Совместимость с браузером Microsoft Internet Explorer

Браузер Internet Explorer позволяет преобразовать XML-документ согласно XSLT-доку менту с помощью всего пары строк кода. В нашем проекте используется метод transf ormNode (), принимающий документы XML и XSLT и объединяющий их.

if (window.ActiveXObject){ objOutput.innerHTML=xmlDoc.transformNode(xslDoc); }

Вначале мы определяем, поддерживает ли браузер метод trans- f ormKode (). Для этого необходимо проверить, поддерживает ли браузер объект ActiveX. Если объект поддерживается, к глобальной переменной, содержащей XML-данные, применяется метод transformNode(), передавая этой переменной глобальную переменную, содержащую XSLT-данные. Результат данного преобразования добавляется к свойству innerHTML выходного элемента, который теперь будет содержать отформатированные результаты поиска.

Итак, мы разобрались, как форматировать результаты для Internet Explorer. Теперь сделаем то же для браузеров, совместимых с Mozilla.

12.4.2. Совместимость с браузерами Mozilla

Для браузеров Mozilla необходимо использовать объект XSLTProcessor, позволяющий объединять документы XML и XSL. Обратите внимание на то, что хотя браузеры Opera и Safari поддерживают объект XMLHttpRequest, они не поддерживают объект XSLTProcessor, и в них невозможен запуск рассматриваемого проекта без поддержки с сервера (подробнее данный вопрос рассмотрен в разделе 12.5.2). В листинге 12.8 реализовано преобразование XML-документа с использованием XSLT и отображение отформатированного множества результатов.

Листинг 12.8. Вызов XSLT для браузеров Mozilla

else{

var xsltProcessor = new XSLTProcessor(); xsltProcessor.importstylesheet(xslDoc);

var fragment^xsltProcessor.transformToFragment(xmlDoc,document)I objOutput.innerHTML = "";

objOutput.appendChild(fragment);

_ >

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]