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

• если выражение вычисляется в набор узлов, оно трактуется как true, когда набор узлов содержит хотя бы один узел;

• выражение-строка считается true, если строка не пуста;

• фрагмент результирующего дерева трактуется как true, если содержит узлы;

• если результат выражения — число, он считается true, когда отличен от нуля.

Элемент <xsclass="underline" if> во многом похож на оператор if-then в языках программирования. Однако не существует оператора <xsclass="underline" else> для формирования конструкций if-then-else — для этого служит элемент <xsclass="underline" choose>.

В листинге 5.1 я перечисляю планеты в planets.xml одну за другой и добавляю горизонтальное правило HTML, элемент <HR> (horizontal rule), после последнего элемента — но только после последнего. При помощи <xsclass="underline" if> это можно сделать так.

Листинг 5.1. Применение <xsclass="underline" if>

<?xml version="1.0"?>

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

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

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

  <HTML>

   <HEAD>

    <TITLE>

     Planets

    </TITLE>

   </HEAD>

   <BODY>

    <xsclass="underline" apply-templates select="PLANET"/>

   </BODY>

  </HTML>

 </xsclass="underline" template>

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

  <P>

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

   is planet number <xsclass="underline" value-of select="position()"/> from the sun.

  </P>

  <xsclass="underline" if test="position() = last()"><HR/><xsclass="underline" if>

 </xsclass="underline" template>

</xsclass="underline" stylesheet>

Вот результат — как видите, элемент <HR> появляется только после последней перечисленной планеты:

<HTML>

 <HEAD>

  <TITLE>

   Planets

  </TITLE>

 </HEAD>

 <BODY>

  <P>

   Mercury is planet number 1 from the sun.

  </P>

  <P>

   Venus is planet number 2 from the sun.

  </P>

  <P>

   Earth is planet number 3 from the sun.

  </P>

  <HR>

 </BODY>

</HTML>

Рассмотрим еще один пример — преобразование XML-XML, в котором перечисляются планеты из planets.xml. Однако я хочу, чтобы выводилось не просто «The first three planets are: Mercury Venus Earth» (первые три планеты: Меркурий Венера Земля), a «The first three planets are: Mercury, Venus, and Earth». Необходимые знаки пунктуации можно добавить, определяя текущий элемент при помощи функции position и проверяя позицию при помощи <xsclass="underline" if> (листинг 5.2).

Листинг 5.2. Второй пример применения <xsclass="underline" if>

<?xml version="1.0"?>

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

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

 <xsclass="underline" output method="xml"/>

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

  <DOCUMENT>

   <TITLE>

    The Planets

   </TITLE>

   <PLANETS>

    The first three planets are: <xsclass="underline" apply-templates select="PLANET"/>

   </PLANETS>

  </DOCUMENT>

 </xsclass="underline" template>

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

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

  <xsclass="underline" if test="position()!=last()">, </xsclass="underline" if>

  <xsclass="underline" if test="position()=last()-1">and </xsclass="underline" if>

  <xsclass="underline" if test=position()=last()">.</xsclass="underline" if>

 </xsclass="underline" template>

</xsclass="underline" stylesheet>

Вот результат:

<?xml version=" 1.0" encoding="UTF-8"?>

<DOCUMENT>

 <TITLE>

  The Planets

 </TITLE>

 <PLANETS>

  The first three planets are: Mercury, Venus, and Earth

 </PLANETS>

</DOCUMENT>

Как видите, я смог добавить правильные знаки пунктуации, определяя место в документе при помощи <xsclass="underline" if>.

При помощи <xsclass="underline" if> можно также обнаруживать ошибки во время преобразования. Например, при помощи <xsclass="underline" if> можно вывести сообщение, есть ли в planets.xml элемент <NAME> (листинг 5.3).

Листинг 5.3. Обнаружение ошибок при помощи <xsclass="underline" if>

<?xml version="1.0"?>

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

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

 <xsclass="underline" output method="xml"/>

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

<DOCUMENT>

   <TITLE>

    The Planets

   </TITLE>

   <PLANETS>

    The first three planets are: <xsclass="underline" apply-templates select="PLANET"/>

   </PLANETS>

  </DOCUMENT>

 </xsclass="underline" template>

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

  <xsclass="underline" if test="NAME[not(text())]">

   <xsclass="underline" message terminate="yes">

    Each planet must have a name!

   </xsclass="underline" message>

  </xsclass="underline" if>

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

  <xsclass="underline" if test="position()!=last()">. </xsclass="underline" if>

  <xsclass="underline" if test="position()=last()-1">and </xsclass="underline" if>

  <xsclass="underline" if test="position()=last()">.</xsclass="underline" if>

 </xsclass="underline" template>

</xsclass="underline" stylesheet>

Чтобы проверить работу этого кода, я задал один из элементов <NAME> пустым:

<?xml version="1.0"?>

<?xml-stylesheet type="text/xml" href="planets.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><!--B перигелии-->

 </PLANET>

 <PLANET>

  <NAME></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>