Выбрать главу

□ при попытке выполнить корректные преобразования, определенные в пространстве имен с URI "http://www.w3.org/1999/XSL/Transform", не происходит ничего или выдается ошибка;

□ при попытке выполнить те же преобразования, исправив URI на "http://www.w3.org/TR/WD-xsl", процессор пытается выполнить преобразование, но выдает ошибку о некорректности преобразования (в то время как оно работает на других процессорах);

□ в преобразованиях не работают переменные, именованные шаблоны, шаблоны значений атрибутов, ключи и импортирование.

В случае обнаружения подобных признаков единственным советом является обновление версии MSXML в режиме замены.

Предупреждение

Перед установкой MSXML3 рекомендуется внимательно ознакомиться с документацией на предмет возможности установки в режиме замены. Некоторые программные продукты (такие, как SQL Server и Biztalk Server) используют старую версию XSLT-процессора, и обновление в режиме замены приведет к нестабильности их работы.

Использование

Так как MSXML уже давно превратился в стандартный компонент Windows, использовать его можно разными способами - например, в собственных приложениях или как ISAPI-расширение. При разработке XSLT-преобразований MSXML, как правило, применяется либо совместно с браузером Internet Explorer, либо как самостоятельная утилита командной строки.

Первый способ заключается в том, что с XML-документом посредством инструкции xml-stylesheet ассоциируется преобразование и Internet Explorer отображает результат преобразования.

Пример
Листинг П1.1. Входящий документ source.xml

<?xml-stylesheet type="text/xsl" href="stylesheet.xsl"?>

<date>18.10.2001</date>

Листинг П1.2. Преобразование stylesheet.xsl

<?xml version="1.0" encoding="windows-1251"?>

<xsclass="underline" stylesheet

 version="1.0"

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

 <xsclass="underline" template match="/">

  <html>

   <head>

    <title>Today is page</title>

   </head>

   <body>

    <xsclass="underline" apply-templates select="date"/>

   </body>

  </html>

 </xsclass="underline" template>

 <xsclass="underline" template match="date">

  <H1>

   <xsclass="underline" text>Сегодня </xsclass="underline" text>

   <xsclass="underline" value-of select="."/>

  </H1>

 </xsclass="underline" template>

</xsclass="underline" stylesheet>

Документ source.xml будет отображен в браузере Internet Explorer следующим образом (рис. П1.4).

Рис. П1.4. Документ source.xml, отображенный браузером Internet Explorer

Другим, вариантом является использование утилиты командной строки msxsl.exe, которая также доступна на Web-сайте MSDN. Эта утилита есть не более чем оболочка для MSXML, позволяющая вызывать основной компонент из командной строки.

Использование msxsl.exe совершенно стандартно: для применения преобразования stylesheet.xsl к документу source.xml и вывода результата в файле result.xml нужно выполнить следующую команду:

msxsl.exe source.xml stylesheet.xsl -о result.xml

Расширения

MSXML поддерживает пользовательские функции расширения, которые могут быть написаны на скриптовых языках VBScript и JScript и включены непосредственно в сами преобразования.

Пример
Листинг П1.3. Входящий документ

<?xml version="1.0" encoding="windows-1251"?>

<page>Сегодня <date/>.</page>

Листинг П1.4. Преобразование

<xsclass="underline" stylesheet version="1.0"

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

 xmlns:msxsl="urn:schemas-microsoft-com:xslt"

 xmlns:ext="urn:extension-functions"

 exclude-result-prefixes="msxsl ext">

 <xsclass="underline" output encoding="windows-1251"/>

 <msxsclass="underline" script

  language="JavaScript"

  implements-prefix="ext">

  function date() {

   now = new Date;

   return now.getDate() + '.' +

    (now.getMonth() + 1) + '.' +

    now.getYear();

  }

 </msxsclass="underline" script>

 <xsclass="underline" template match="/">

  <html>

   <head>

    <title>Today is page</title>

   </head>

   <body>

    <xsclass="underline" apply-templates/>

   </body>

  </html>

 </xsclass="underline" template>

 <xsclass="underline" template match="date">

  <xsclass="underline" value-of select="ext:date()"/>

 </xsclass="underline" template>

</xsclass="underline" stylesheet>

Листинг П1.5. Выходящий документ

<html>

 <head>

  <META

   http-equiv="Content-Type"

   content="text/html;

   charset=windows-1251">

  <title>Today is page</title>

 </head>

 <body>Сегодня 18.10.2001.</body>

</html>

Как и во многих других процессорах, в MSXML предусмотрена функция расширения node-set, которая преобразует результирующий фрагмент дерева во множество узлов. Функция node-set принадлежит пространству имен с URI "urn:schemas-microsoft-com:xslt", и стандартным сценарием ее использования будет примерно следующий:

<xsclass="underline" stylesheet

 version="1.0"

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

 xmlns:msxsl="urn:schemas-microsoft-com:xslt"

 exclude-result-prefixes="msxsl ">

 <!-- ... -->

 <xsclass="underline" variable name="tree">

  <!-- Переменная, содержащая результирующий фрагмент дерева -->

  <item>A</item>

  <item>B</item>

 </xsclass="underline" variable>

 <!-- ... -->

 <xsclass="underline" template ... >

  <!-- Обращение к $tree, как ко множеству узлов -->

  <xsclass="underline" value-of select="msxsclass="underline" node-set($tree)/item[1]"/>