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

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

  <TR>

   <TD><xsclass="underline" value-of select="NAME"/></TD>

   <TD><xsclass="underline" apply-templates select="MASS"/></TD>

   <TD><xsclass="underline" apply-templates select="RADIUS"/></TD>

   <TD><xsclass="underline" applу-templates select="DAY"/></TD>

  </TR>

 </xsclass="underline" template>

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

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

 </xsclass="underline" template>

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

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

 </xsclass="underline" template>

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

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

 </xsclass="underline" template>

</xsclass="underline" stylesheet>

Результат применения этой функции приведён на рис. 5.3.

Рис. 5.3. Применение функции расширения 

Вот работоспособная схема и заодно веский повод включить Java в XSLT. Тем не менее, в XSLT 1.1 был представлен элемент <xsclass="underline" script>, который, по всей видимости, будет включен и в XSLT 2.0.

Элемент <xsclass="underline" script>

Элемент <xsclass="underline" script> был определен в рабочем проекте XSLT 1.1, он предоставляет хорошо определенный способ связи функций расширения с таблицами стилей XSLT. Это элемент верхнего уровня, обладающий следующими атрибутами:

• implements-prefix (необязательный). Задает имя пространства имен функции расширения, которую реализует этот элемент. Принимает значение NCNAME;

• language (необязательный). Задает язык, используемый функцией расширения. Устанавливается в «ecmascript» (стандарт JavaScript), «javascript», «java» или QNAME, не являющееся NCNAME;

• src (необязательный). Предоставляет URI, в котором реализована функция расширения. Например, это может быть класс Java;

• archive (необязательный). Задает архивы, которые необходимо загрузить перед запуском функции расширения, если они есть. Принимает значения списка URI, разделенного символами-разделителями.

Элемент содержит символьные данные (Microsoft использует раздел CDATA), реализующие функцию или функции расширения.

Как теперь связать функцию, определенную в элементе <xsclass="underline" script>, с вашей таблицей стилей XSLT? Сначала создайте в своей таблице стилей элемент <xsclass="underline" script> как элемент верхнего уровня, затем поместите в него функции, которые вы хотите определить. В приведенном ниже примере я определяю две функции JavaScript, makeMoney (сделать деньги) и makeMoreMoney (сделать еще больше денег), в элементе <xsclass="underline" script>, реализующем пространство имен расширений «starpowder»:

<xsclass="underline" script implements prefix="starpowder" language="javascript">

function makeMoney(e) {

 .

 .

 .

}

function makeMoreMoney(e) {

 .

 .

 .

}

</xsclass="underline" script>

В зависимости от вашего процессора XSLT, может оказаться хорошим решением заключить такого рода сценарии в раздел CDATA:

<xsclass="underline" script implements-prefix="starpowder" language="javascript">

 <![CDATA[

  function makeMoney(e) {

   .

   .

   .

  }

  function makeMoreMoney(e) {

   .

   .

   .

  }

 ]]>

</xsclass="underline" script>

Теперь при помощи пространства имен «starpowder» можно указать, что вызывается функция расширения:

<CASH>

 <xsclass="underline" value-of select="starpowder:makeMoney(1000000)"/>

</CASH>

Вот и все (если ваш процессор XSLT это поддерживает). Если вместо сценария вы хотите указать класс Java, воспользуйтесь атрибутом src:

<xsclass="underline" script implements-prefix="starpowder" src="java:com.MakeMoney" language="java">

</xsclass="underline" script> 

РАБОТА С ВНЕШНИМИ РЕСУРСАМИ

Атрибут src также используется, если есть архив подпрограмм JavaScript, как, например, src="archives.js".

Из всех известных мне процессоров XSLT элемент <xsclass="underline" script> реализует только процессор Microsoft MSXML3. Информация о работе со сценариями для написания функций расширения для Internet Explorer приведена на web-узле Microsoft (в данный момент это страница по адресу http://msdn.microsoft.com/xml/xslguide/script-overview.asp, но, кажется, Microsoft меняет структуру web-узла каждые два дня или около того).

Следующий пример демонстрирует работу <xsclass="underline" 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).

Листинг 5.15. Установка использования kilometers.xsl для planets.xml в Internet Explorer

<?xml version="1.0"?>

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

<PLANETS>

 <PLANET>