<SCRIPT LANGUAGE="JavaScript">
function xslt() {
var XMLDocument = new ActiveXObject('MSXML2.DOMDocument.3.0');
var XSLDocument = new ActiveXObject('MSXML2.DOMDocument.3.0');
var HTMLtarget = document.all['targetDIV'];
.
.
.
И planets.xml, и planets.xsl являются документами XML; и процессор MSXML может работать и как проверяющий на допустимость разборщик XML, если установить свойство validateOnParse в true. Для загрузки planets.xml и planets.xsl в объекты XMLDocument и XSLDocument служит метод load. Я также проверяю наличие ошибок, просматривая код ошибок разбора следующим образом:
<HTML>
<HEAD>
<TITLE>XSLT Using JavaScript</TITLE>
<SCRIPT LANGUAGE="JavaScript">
function xslt() {
var XMLDocument = new ActiveXObject('MSXML2.DOMDocument.3.0');
var XSLDocument = new ActiveXObject('MSXML2.DOMDocument.3.0');
var HTMLtarget = document.all['targetDIV'];
XMLDocument.validateOnParse = true;
XMLDocument.load('planets.xml');
if (XMLDocument.parseError.errorCode != 0) {
HTMLtarget.innerHTML = "Error!";
return false;
}
XSLDocument.validateOnParse = true;
XSLDocument.load('planets.xsl');
if (XSLDocument.parseError.errorCode != 0) {
HTMLtarget.innerHTML = "Error!";
return false;
}
.
.
.
Теперь, после того как оба файла, planets.xml и planets.xsl, были загружены, преобразование можно осуществить методом transformNode. Посмотрите, как я преобразую XMLDocument при помощи XSLDocument и показываю результат в элементе-приемнике <DIV>:
<HTML>
<HEAD>
<TITLE>XSLT Using JavaScript</TITLE>
<SCRIPT LANGUAGE="JavaScript">
function xslt() {
var XMLDocument = new ActiveXObject('MSXML2.DOMDocument.3.0');
var XSLDocument = new ActiveXObject('MSXML2.DOMDocument.3.0');
var HTMLtarget = document.all['targetDIV'];
.
.
.
HTMLtarget.innerHTML = XMLDocument.transformNode(XSLDocument);
return true;
}
</SCRIPT>
</HEAD>
<BODY onload="xslt()">
<DIV ID="targetDIV">
</DIV>
</BODY>
</HTML>
Эти результаты показаны на рис. 10.1.
Рис. 10.1. Использование JavaScript для преобразования документа
Обработка ошибок разбора
При использовании JavaScript для загрузки документов XML и XSL и работы с ними важно знать, как сообщать об ошибках разбора. В предыдущем примере я сообщал об ошибках, выводя сообщение «Error!» в элементе-приемнике <DIV> документа HTML, но это не очень информативно. Как получить дополнительную информацию?
В следующем примере я намерено создаю ошибку разбора, изменив первый тег <PLANET> в planets.xml на тег <PLANETS>:
<?xml version="1.0"?>
<?xml-stylesheet type="text/xml" href="planets.xsl"?>
<PLANETS>
<PLANETS>
<NAME>Mercury</NAME>
<MASS UNITS="(Earth = 1)">.0553</MASS>
<DAY UNITS="days">58.65</DAY>
<RADIUS UNITS="miles">1516</RADIUS>
<DENSITY UNITS="(Earth = 1)">.983</DENSITY>
<DISTANCE UNITS="million miles">43.4</DISTANCE><!--B перигелии-->
</PLANET>
.
.
.
Я установил свойство validateOnParse объекта XMLDocument в true (значение по умолчанию — false, что означает отсутствие проверки), поэтому процессор MSXML отловит эту ошибку разбора. Объект XMLDocument содержит объект parseError, и если его свойство errorCode не равно нулю, это означает наличие ошибки. Сейчас я хочу не просто вывести сообщение «Error!», а расшифровать ошибку при помощи новой функции getError, которая возвращает строку с информацией о месте и причине ошибки.
С целый получения этой дополнительной информации я использую свойства <url, line, linepos и reason объекта parseError для того, чтобы определить вызвавший проблему файл, строку, позицию ошибки и ее описание (листинг 10.1).
Листинг 10.1. Создание преобразования XSLT и отображение ошибок разбора<HTML>
<HEAD>
<TITLE>XSLT Using JavaScript</TITLE>
<SCRIPT LANGUAGE="JavaScript">
function xslt() {
var XMLDocument = new ActiveXObject('MSXML2.DOMDocument.3.0');
var XSLDocument = new ActiveXObject('MSXML2.DOMDocument.3.0');
var HTMLtarget = document.all['targetDIV'];
XMLDocument.validateOnParse = true;
XMLDocument.load('planets.xml');
if (XMLDocument.parseError.errorCode != 0) {
HTMLtarget.innerHTML = getError(XMLDocument);
return false;
}
XSLDocument.validateOnParse = true;
XSLDocument.load('planets.xsl');
if (XSLDocument.parseError.errorCode != 0) {
HTMLtarget.innerHTML = getError(XSLDocument);
return false;
}
HTMLtarget.innerHTML = XMLDocument.transformNode(XSLDocument);
return true;
}
function getError(errorObject) {
var Error = new String;
Error = "Error. " + errorObject.parseError.url + "<BR>" +
"Line: " + errorObject.parseError.line + "<BR>" +
"Character: " + errorObject.parseError.linepos + "<BR>" +
"Description: " + errorObject.parseError.reason;
return Error;
}
</SCRIPT>
</HEAD>
<BODY onload="xslt()">
<DIV ID="targetDIV">
</DIV>
</BODY>
</HTML>
Результат можно увидеть на рис. 10.2, где показаны вызвавший ошибку файл, место ошибки и описание ошибки процессором MSXML. Если вы собираетесь реализовывать преобразования XSLT в Internet Explorer, когда пользователи просматривают ваши документы случайным образом, обработка подобных ошибок разбора исключительно важна.