KnigaRead.com/

Стивен Холзнер - XSLT

На нашем сайте KnigaRead.com Вы можете абсолютно бесплатно читать книгу онлайн Стивен Холзнер, "XSLT" бесплатно, без регистрации.
Перейти на страницу:

  </TR>

 </xsl:template>


 <xsl:template match="MASS">

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

  <xsl:text> </xsl:text>

  <xsl:value-of select="@UNITS"/>

 </xsl:template>


 <xsl:template match="RADIUS">

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

  <xsl:text> </xsl:text>

  <xsl:value-of select="@UNITS"/>

 </xsl:template>


 <xsl:template match="DAY">

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

  <xsl:text> </xsl:text>

  <xsl:value-of select="@UNITS"/>

 </xsl:template>

</xsl:stylesheet>

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

<HTML>

 <HEAD>

  <TITLE>

   The Formatted Planets Table

  </TITLE>

 </HEAD>

 <BODY>

  <H1>

   The Formatted 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>0.055 (Earth = 1)</TD>

    <TD>1.516 miles</TD>

    <TD>58.65 days</TD>

   </TR>

   <TR>

    <TD>Venus</TD>

    <TD>0.815 (Earth = 1)</TD>

    <TD>3.716 miles</TD>

    <TD>116.75 days</TD>

   </TR>

   <TR>

    <TD>Earth</TD>

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

    <TD>2.107 miles</TD>

    <TD>1 days</TD>

   </TR>

  </TABLE>

 </BODY>

</HTML>

Этот результирующий документ показан на рис. 8.1. (MSXML3 и Saxon отбрасывают лидирующие нули, поэтому 0.055 выводится как .055 и т.д.)

Рис. 8.1. Форматирование чисел при помощи XSLT 


Следующие примеры демонстрируют способы применения форматирующих строк. Заметьте, что при помощи точки с запятой (;) можно отделять образцы для положительных и отрицательных чисел.

Число Форматирующая строка Результат 4567 #,### 4,567 4567.8 ####.# 4567.8 4567.8 #,##0.00 4,567.80 456.789 #,##0.00 456.79 4567890 #,##0.00 4,567,890.00 4567 ###0.0### 4567.0 .00045 ##0.0### 0.0005 .45 #00% 45% -4.56 #.00;(#.00) (4.56) -45 #,##0.00 -45

function-available()

При помощи функции XSLT 1.0 function-available можно проверить наличие функции расширения:

boolean function-available(function-name)

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

Следующий пример мы уже рассматривали в главе 5. В этом случае я хочу выполнить ряд математических операций при помощи функции расширения starpowder:calculate, и если она отсутствует, вывести в результирующий документ текст «Sorry, can't do math today.» (Извините, сегодня математические вычисления не работают.). Можно, конечно, также прекратить обработку и вывести сообщение об ошибке при помощи элемента <xsl:message>:

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

 <xsl:when test="function-available('starpowder:calculate')">

  <xsl:value-of select="starpowder:calculate('2+2')"/>

 </xsl:when>

 <xsl:otherwise>

  <xsl:text>Sorry, can't do math today.</xsl:text>

 </xsl:otherwise>

</xsl:choose>

generate-id()

Функция generate-id дает указание процессору XSLT присвоить узлу идентификатор (который возвращается как строка). Функция применяется следующим образом:

string generate-id(node)

Функции следует передать набор узлов, содержащий только узел, которому нужен идентификатор (все узлы после первого игнорируются); функция возвращает уникальный идентификатор для этого узла. Если передать функции снова этот же узел, она вернет тот же идентификатор. Заметьте, что идентификаторы различаются в зависимости от процессора XSLT.

Следующий пример взят из главы 6, но сейчас я собираюсь добавить в planets.html оглавление, составленное из гиперссылок. Для создания оглавления я прохожу в цикле по всем планетам при помощи элемента <xsl:for-each>. На каждом шаге цикла для текущей планеты я создаю гиперссылку и создаю атрибут HREF со значением, равным уникальному идентификатору, при помощи шаблона значений атрибута:

<?xml version="1.0"?>

<xsl:stylesheet version="1.0"

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

 <xsl:template match="/PLANETS">

  <HTML>

   <HEAD>

    <TITLE>

     The Planets Table

    </TITLE>

   </HEAD>

   <BODY>

    <H1>

     The Planets Table

    </H1>

    <xsl:for-each select="PLANET">

     <H2><A HREF="#{generate-id()}">

      <xsl:value-of select="NAME"/>

     </A></H2>

     <P/>

    </xsl:for-each>

    .

    .

    .

Этот код добавляет каждой планете идентификатор и создает нужные гиперссылки. Я могу создать закладки гиперссылки в HTML-таблице данных планет, установив по очереди атрибут <NAME> закладки в идентификатор для каждого элемента <PLANET> так, чтобы он стал гиперссылкой-назначением:

<?xml version="1.0"?>

<xsl:stylesheet version="1.0"

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

 <xsl:template match="/PLANETS">

  <HTML>

   .

   .

   .

  </HTML>

 </xsl:template>


 <xsl:template match="PLANET">

  <TR>

   <TD><A NAME="{generate-id(.)}">

     <xsl:value-of select="NAME"/>

   </A></TD>

   <TD><xsl:apply-templates select="MASS"/></TD>

   <TD><xsl:apply-templates select="RADIUS"/></TD>

   <TD><xsl:apply-templates select="DAY"/></TD>

  </TR>

 </xsl:template>


 <xsl:template match="MASS">

  <xsl:value-of select="."/>

  <xsl:text> </xsl:text>

  <xsl:value-of select="@UNITS"/>

 </xsl:template>

 .

 .

 .

 <xsl:template match="DAY">

  <xsl:value-of select="."/>

  <xsl:text> </xsl:text>

  <xsl:value-of select="@UNITS"/>

 </xsl:template>

</xsl:stylesheet>

Вот и все; сейчас я создал гиперссылки с атрибутом HREF, значение которого равно идентификатору элемента <PLANET>; при помощи же этого идентификатора я сделал каждый элемент <PLANET> назначением гиперссылки.

Когда пользователь щелкает на гиперссылку в оглавлении, браузер прокручивает данные до соответствующей записи планеты в HTML-таблице. Вот как выглядит результирующий документ при использовании процессора Xalan: 

<HTML>

 <HEAD>

  <TITLE>

   The Planets Table

  </TITLE>

 </HEAD>

 <BODY>

  <H1>

   The Planets Table

  </H1>

  <H2>

   <A href="#N5">Mercury</A>

  </H2>

  <P></P>

  <H2>

   <A href="#N20">Venus</A>

  </H2>

  <P></P>

  <H2>

   <A href="#N3B">Earth</A>

  </H2>

  <P></P>

  <TABLE BORDER="2">

   <TR>

    <TD>Name</TD>

    <TD>Mass</TD>

    <TD>Radius</TD>

    <TD>Day</TD>

   </TR>

   <TR>

    <TD><A NAME="N5">Mercury</A></TD>

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

    <TD>1516 miles</TD>

    <TD>58.65 days</TD>

   </TR>

   <TR>

    <TD><A NAME="N20">Venus</A></TD>

Перейти на страницу:
Прокомментировать
Подтвердите что вы не робот:*