• если выражение вычисляется в набор узлов, оно трактуется как 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>