KnigaRead.com/

Стивен Холзнер - XSLT

На нашем сайте KnigaRead.com Вы можете абсолютно бесплатно читать книгу онлайн Стивен Холзнер, "XSLT" бесплатно, без регистрации.
Перейти на страницу:

В этом случае я, пользуясь MSXML и JavaScript, преобразую planets.xml при помощи planets.xsl. Для хранения этих документов я создаю два новых объекта, XMLDocument и XSLDocument, опираясь на классы ActiveXObject и DOMDocument процессора MSXML в функции xslt. (Эта функция запускается сразу при загрузке страницы, поскольку я установил атрибут onload элемента <BODY> в «xslt()»). Я также создам объект, соответствующий элементу <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'];

    .

    .

    .

И 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, когда пользователи просматривают ваши документы случайным образом, обработка подобных ошибок разбора исключительно важна.

Рис. 10.2. Обработка ошибки разбора


Пока что я преобразовывал при помощи процессора MSXML только документ целиком, но здесь у вас существует значительно больше возможностей. Например, в следующем разделе я воспользуюсь XSLT в Internet Explorer для сортировки данных планет в HTML-таблицы по нажатию кнопок. Для этого я буду обращаться к отдельным узлам внутри таблицы стилей.

Internet Explorer и динамические стили

Для того чтобы продемонстрировать все возможности управления преобразованиями XSLT при использовании процессора MSXML, в этом примере я разрешу пользователю динамически сортировать таблицу Planets. Общая идея показана на рис. 10.3. Пользователю достаточно щелкнуть на кнопку, чтобы отсортировать таблицу по названию, массе, радиусу или дню.

Рис. 10.3. Поддержка динамических преобразований XSLT


Для сортировки таблицы я, как легко догадаться, применяю таблицу стилей с элементом <xsl:sort> (листинг 10.2). По умолчанию я сортирую планеты по названию.

Листинг 10.2. Применение динамических XSLT-преобразований

<?xml version="1.0" encoding="iso-8859-1"?>

<xsl:stylesheet

 xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.1">

 <xsl:template match="/">

  <HTML>

   <HEAD>

    <TITLE>

     The Sorted Planets Table

    </TITLE>

   </HEAD>

   <BODY>

    <H1>

     The Sorted Planets Table

    </H1>

    <TABLE BORDER="2">

     <TR>

      <TD>Name</TD>

      <TD>Mass</TD>

      <TD>Radius</TD>

      <TD>Day</TD>

     </TR>

     <xsl:apply-templates select="/PLANETS/PLANET">

      <xsl:sort select="NAME" order="ascending"/>

     </xsl:apply-templates>

    </TABLE>

   </BODY>

  </HTML>

 </xsl:template>


 <xsl:template match="PLANET">

  <TR>

   <TD><xsl:value-of select="NAME"/></TD>

Перейти на страницу:
Прокомментировать
Подтвердите что вы не робот:*