Шрифт:
</xsl:if>
Можно проверять любое выражение XPath. Для преобразования его в значения
true/false
в элементе <xsl:if>
применяйте следующие правила: • если выражение вычисляется в набор узлов, оно трактуется как
true
, когда набор узлов содержит хотя бы один узел; • выражение-строка считается
true
, если строка не пуста; • фрагмент результирующего дерева трактуется как
true
, если содержит узлы; • если результат выражения — число, он считается
true
, когда отличен от нуля. Элемент
<xsl:if>
во многом похож на оператор if-then
в языках программирования. Однако не существует оператора <xsl:else>
для формирования конструкций if-then-else
— для этого служит элемент <xsl:choose>
. В листинге 5.1 я перечисляю планеты в
planets.xml
одну за другой и добавляю горизонтальное правило HTML, элемент <HR> (horizontal rule), после последнего элемента — но только после последнего. При помощи <xsl:if>
это можно сделать так. Листинг 5.1. Применение <xsl:if>
<?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>
Planets
</TITLE>
</HEAD>
<BODY>
<xsl:apply-templates select="PLANET"/>
</BODY>
</HTML>
</xsl:template>
<xsl:template match="PLANET">
<xsl:value-of select="NAME"/>
is planet number <xsl:value-of select="position"/> from the sun.
<xsl:if test="position = last"><HR/><xsl:if>
</xsl:template>
</xsl:stylesheet>
Вот результат — как видите, элемент <HR> появляется только после последней перечисленной планеты:
<HTML>
<HEAD>
<TITLE>
Planets
</TITLE>
</HEAD>
<BODY>
Mercury is planet number 1 from the sun.
Venus is planet number 2 from the sun.
Earth is planet number 3 from the sun.
<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
и проверяя позицию при помощи <xsl:if>
(листинг 5.2). Листинг 5.2. Второй пример применения <xsl:if>
<?xml version="1.0"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml"/>
<xsl:template match="PLANETS">
<DOCUMENT>
<TITLE>
The Planets
</TITLE>
<PLANETS>
The first three planets are: <xsl:apply-templates select="PLANET"/>
</PLANETS>
</DOCUMENT>
</xsl:template>
<xsl:template match="PLANET">
<xsl:value-of select="NAME"/>
<xsl:if test="position!=last">, </xsl:if>
<xsl:if test="position=last-1">and </xsl:if>