<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>
<PLANET COLOR='BLUE'>
<NAME>Earth</NAME>
<MASS UNITS='(Earth = 1)'>1</MASS>
<DAY UNITS='days'>1</DAY>
<RADIUS UNITS='miles'>2107</RADIUS>
<DENSITY UNITS='(Earth = 1)'>1</DENSITY>
<DISTANCE UNITS='million miles'>128.4</DISTANCE><!--B перигелии-- >
</PLANET>
</PLANETS>
Отобразить названия различных планет при помощи элемента <xsl:choose>
, отформатированные по-разному при помощи тегов HTML <В>
, <I>
и <U>
в зависимости от значения атрибута COLOR
, можно следующим образом (листинг 5.6).
<?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:choose>
<xsl:when test='@COLOR = 'RED''>
<В>
<xsl:value-of select='NAME'/>
</B>
</xsl:when>
<xsl:when test='@COLOR = 'WHITE''>
<I>
<xsl:value-of select='NAME'/>
</I>
</xsl:when>
<xsl:when test='@COLOR = 'BLUE''>
<U>
<xsl:value-of select='NAME'/>
</U>
</xsl:when>
<xsl:otherwise>
<PRE>
<xsl:value-of select='.'/>
</PRE>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
</xsl:stylesheet>
Вот результирующий документ:
<HTML>
<HEAD>
<TITLE>
Planets
</TITLE>
</HEAD>
<BODY>
<B>Mercury</B>
<I>Venus</I>
<U>Earth</U>
</BODY>
</HTML>
Как вы видели, при помощи <xsl:if>
можно проверять единственное условие, а при помощи <xsl:choose>
— несколько; аналогичные конструкции присутствуют в большинстве языков программирования. Кроме подобных этим условных операторов, в большей части языков программирования существуют также операторы цикла, и в XSLT содержится нечто похожее — элемент <xsl:for-each>
.
Элемент <xsl:for-each>
Элемент <xsl:for-each>
позволяет применять тело шаблона в цикле снова и снова для всех элементов набора узлов. С технической точки зрения, он работает с набором узлов, который возвращает выражение XPath и выполняет одно и то же действие с каждым узлом в наборе. При каждом шаге цикла тело шаблона применяется к следующему узлу из набора узлов, что дает возможность легко обрабатывать несколько узлов.
<XSL:FOR-EACH> ПРОТИВ <XSL:APPLY-TEMPLATES>
Вы могли заметить, что это описание практически такое же, как и у элемента <xsl:apply- templates>, и я сравню элементы <xsl:for-each> и <xsl:apply-templates> через несколько страниц.
У элемента <xsl:for-each>
один атрибут:
• select
(обязательный). Принимает значение выражения XPath, возвращающее набор узлов, который нужно обработать в цикле.