□ при попытке выполнить корректные преобразования, определенные в пространстве имен с 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 отображает результат преобразования.
<?xml-stylesheet type="text/xsl" href="stylesheet.xsl"?>
<date>18.10.2001</date>
<?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 и включены непосредственно в сами преобразования.
<?xml version="1.0" encoding="windows-1251"?>
<page>Сегодня <date/>.</page>
<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>
<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]"/>