Кроме того, в этой главе мы также рассмотрим, как перенумеровать элементы в документе, что делать в случае, когда ваш процессор XSLT не поддерживает определенное расширение, и многое другое. Я начну с наиболее часто используемого элемента из рассматриваемых в данной главе:
<xsl:if>
.
Элемент <xsl:if>
При помощи элемента
<xsl:if>
осуществляются проверки условия и принимаются действия на основе результата проверки. Он во многом похож на оператор
if
в языках программирования. У элемента
<xsl:if>
один атрибут:
•
test
(обязательный).
Устанавливается в значение логического (
Boolean
,
true/false
) условия, которое вы хотите проверить.
Элемент заключает в себе тело шаблона.
Вот как это работает: вы включаете тело шаблона внутрь элемента
<xsl:if>
, проверяющего какое-то выражение. Если это выражение истинно, тело шаблона используется, если ложно — игнорируется:
<xsl:if test="expression">
<!--template body-->
</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>
<xsl:if test=position=last">.</xsl:if>
</xsl:template>
</xsl:stylesheet>
Вот результат:
<?xml version=" 1.0" encoding="UTF-8"?>
<DOCUMENT>
<TITLE>
The Planets
</TITLE>
<PLANETS>
The first three planets are: Mercury, Venus, and Earth