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

<HTML>

 <HEAD>

  <TITLE>

   The Planets Table

  </TITLE>

 </HEAD>

 <BODY>

  <H1>

   The Planets Table

  </H1>

  <TABLE BORDER="2">

   <TR>

    <TD>Name</TD>

    <TD>Mass</TD>

    <TD>Radius</TD>

    <TD>Day</TD>

   </TR>

   <TR>

    <TD>Mercury</TD>

    <TD>.0553 (Earth = 1)</TD>

    <TD>1516 miles</TD>

    <TD>58.65 days</TD>

   </TR>

  </TABLE>

 </BODY>

</HTML>

Функция document удобна, поскольку позволяет считывать на этапе выполнения такие дополнительные документы, как справка о правах владения или отказе от них, фирменный бланк и т.п.

element-available()

Функция element-available() используются для определения доступности определенного элемента расширения. Ее применяют следующим образом:

boolean element-available(element-name)

Функция принимает имя искомого элемента и, если элемент доступен, возвращает истину, если недоступен — ложь.

Мы уже встречались с этой функцией в главе 5. В примере element-available той главы я проверял наличие элемента <starpowder:calculate> таким образом:

<xsclass="underline" choose xmlns:starpowder="http://www.starpowder.com">

 <xsclass="underline" when test="element-available('starpowder:calculate')">

  <starpowder:calculate xsclass="underline" extension-element-prefixes="starpowder"/>

 </xsclass="underline" when>

 <xsclass="underline" otherwise>

  <xsclass="underline" text>Sorry, can't do math today.</xsclass="underline" text>

 </xsclass="underline" otherwise>

</xsclass="underline" choose>

format-number()

Как можно догадаться по имени, функция format-number() служит для форматирования чисел с преобразованием их в строки. Она применяется так:

string format-number(number, format, name?)

Функция возвращает форматируемое число в виде строки. Функции передаются число number, которое нужно отформатировать, строка форматирования format и необязательный параметр-строка name. Строка name — это имя QName, задающее формат так, как он создается элементом <xsclass="underline" decimal-format> (который будет рассмотрен в конце этой главы).

Форматирующая строка format должна соответствовать соглашениям класса Java DecimalFormat.

КЛАСС JAVA DECIMALFORMAT

На момент написания книги документация для класса Java DecimalFormat находится в Интернете по адресу: http://java.sun.com/products/jdk/1.1/docs/api/java.text.DecimalFormat.html.

Форматирующая строка (format string) состоит из следующих частей:

• format-string:= subpattern (;subpattern)?

• subpattern:= prefix? integer (.fraction)?suffix?

• prefix:= [#x0..#xFFFD] - specialCharacters

• suffix:= [#x0..#xFFFD] - specialCharacters

• integer:= '#'* '0'* '0'

• fraction:= '0'* '#'*

Далее показаны специальные символы (specialCharacters), которые можно использовать в подчиненных образцах, subpattern (эти символы можно изменить при помощи элемента <xsclass="underline" decimal-format>, который будет рассмотрен в конце этой главы):

• 0 — на этом месте всегда должна стоять цифра;

• # — цифра, если только это не избыточный лидирующий или завершающий ноль;

• . — разделитель десятичной части;

• , — разделитель групп разрядов;

• ; — разделяет форматы;

• - — знак минуса;

• % — умножить на 100 и показать как проценты;

• ‰ — умножить на 1000 и показать в тысячных частях;

• Е — разделяет мантиссу и экспоненциальную часть;

• ¤ — символ валюты (#xA4);

• ' — заключает в кавычки специальные символы.

Следующий пример (листинг 8.5) демонстрирует работу функции. Я форматирую значения из planets.xml, отображаемые в таблице HTML.

Листинг 8.5. Форматирование чисел

<?xml version="1.0"?>

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

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

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

  .

  .

  .

 </xsclass="underline" template>

 <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" apply-templates select="DAY"/></TD>

  </TR>

 </xsclass="underline" template>

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

  <xsclass="underline" value-of select="format-number(., '#.###')"/>

  <xsclass="underline" text> </xsclass="underline" text>

  <xsclass="underline" value-of select="@UNITS"/>

 </xsclass="underline" template>

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

  <xsclass="underline" value-of select="format-number(., '#.###')"/>

  <xsclass="underline" text> </xsclass="underline" text>

  <xsclass="underline" value-of select="@UNITS"/>

 </xsclass="underline" template>

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

  <xsclass="underline" value-of select="format-number(., '###.#')"/>

  <xsclass="underline" text> </xsclass="underline" text>

  <xsclass="underline" value-of select="@UNITS"/>

 </xsclass="underline" template>

</xsclass="underline" stylesheet>

Вот результат, в котором выведены отформатированные числа:

<HTML>

 <HEAD>

  <TITLE>

   The Formatted Planets Table

  </TITLE>

 </HEAD>

 <BODY>

  <H1>

   The Formatted Planets Table

  </H1>

  <TABLE BORDER="2">

   <TR>