</xsl:script>
Теперь при помощи пространства имен «starpowder
» можно указать, что вызывается функция расширения:
<CASH>
<xsl:value-of select='starpowder:makeMoney(1000000)'/>
</CASH>
Вот и все (если ваш процессор XSLT это поддерживает). Если вместо сценария вы хотите указать класс Java, воспользуйтесь атрибутом src
:
<xsl:script implements-prefix='starpowder' src='java:com.MakeMoney' language='java'>
</xsl:script>
РАБОТА С ВНЕШНИМИ РЕСУРСАМИ
Атрибут src также используется, если есть архив подпрограмм JavaScript, как, например, src='archives.js'.
Из всех известных мне процессоров XSLT элемент <xsl:script>
реализует только процессор Microsoft MSXML3. Информация о работе со сценариями для написания функций расширения для Internet Explorer приведена на web-узле Microsoft (в данный момент это страница по адресу http://msdn.microsoft.com/xml/xslguide/script-overview.asp, но, кажется, Microsoft меняет структуру web-узла каждые два дня или около того).
Следующий пример демонстрирует работу <xsl:script>
с Internet Explorer. Я создал функцию JavaScript для преобразования данных о радиусе планет из planets.xml
, приведенных в милях, в километры и последующем выводе этих данных в километрах.
Как обсуждалось в главе 2 в разделе «Преобразование документов XML при помощи Internet. Explorer», для просмотра XML-документа, использующего таблицу стилей XSL, в Internet Explorer, версии 5.5 и младше в документ необходимо внести некоторые изменения (если только вы не установили последний разборщик MSXML или не используете недавно появившуюся версию браузера 6.0, хотя и в этом случае нужно применять «text/xsl
»). Для начала в таблице стилей XSL используйте тип MIME «text/xsl
», а не «text/xml
». Я также задал URI для таблицы стилей «kilometers.хsl
» следующим образом (листинг 5.15).
<?xml version='1.0'?>
<?xml-stylesheet type='text/xsl' href='kilometers.xsl'?>
<PLANETS>
<PLANET>
<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><!--В перигелии-- >
</PLANET>
<PLANET>
<NAME>Venus</NAME>
<MASS UNITS='(Earth = 1)'>.815</MASS>
<DAY UNITS='days'>116.75</DAY>
<RADIUS UNITS='miles'>3716</RADIUS>
<DENSITY UNITS='(Earth = 1)'>.943</DENSITY>
<DISTANCE UNITS='million miles'>66.8</DISTANCE><!--B перигелии-- >
</PLANET>
.
.
.
Для преобразования таблицы стилей kilometers.xsl
для работы в IE 5.5 или младше я воспользовался пространством имен XSL, которое использует IE, и добавил элемент <xsl:script>
, показав, что я собираюсь писать сценарии на JavaScript. Заметьте, однако, что элемент <xsl:script>
в Internet Explorer не поддерживает атрибут префикса реализации, поэтому я не могу связать функции, определенные в пространстве имен:
<xsl:stylesheet xmlns:xsl='http://www.w3.org/TR/WD-xsl'>
<xsl:script language='javascript'>
.
.
.
</xsl:script>
.
.
.
В соответствии с требованиями Internet Explorer, код должен быть заключен в раздел CDATA. Здесь я определил функцию milesToKilometers
, которая принимает узел, читает текст узла в свойстве text
и преобразует текст в число миль при помощи функции JavaScript parseInt
. Далее я умножаю число миль на 1,6, чтобы получить километры, и возвращаю результат:
<xsl:stylesheet xmlns:xsl='http://www.w3.org/TR/WD-xsl'>
<xsl:script language='javascript'>
<![CDATA[
function milesToKilometers(e) {
miles = parseInt(e.text);
return miles * 1.6;
}
]]>
</xsl:script>
.
.
.
Поскольку пока в Internet Explorer нельзя связать пространство имен с функцией расширения, для их вызова используется специальный элемент Microsoft <xsl:eval>
. Ниже показано, как это выглядит в таблице стилей kilometers.xsl
, где я передаю в функцию milesToKilometers
текущий узел <RADIUS>
для преобразования миль в километры. Поскольку IE 5.5 и младше не поддерживают правила по умолчанию (хотя версия 6.0, вышедшая одновременно с подписанием этой книги в печать, поддерживает их, и вам не нужно ничего менять), для этих браузеров я предоставил правило для корневого узла (листинг 5.16).
<xsl:stylesheet xmlns:xsl='http://www.w3.org/TR/WD-xsl'>
<xsl:script language='javascript'>
<![CDATA[