действительно нужна. Пусть, например, по какой-то причине вы поместили в каждый элемент <PLANET>
в planets.xml
по три элемента <NAME>
и хотите использовать в качестве фактического названия планеты только первый элемент <NAME>
:
<?xml version='1.0'?>
<?xml-stylesheet type='text/xml' href='planets.xsl'?>
<PLANETS>
<PLANET>
<NAME>Mercury</NAME>
<NAME>Venus</NAME>
<NAME>Earth</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>Venus</NAME>
<NAME>Earth</NAME>
<NAME>Mercury</NAME>
<NAME>Planet of Love.</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><!--В перигелии-- >
</PLANET>
<PLANET>
<NAME>Earth</NAME>
<NAME>Mercury</NAME>
<NAME>Venus</NAME>
<NAME>The planet you're standing on.</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><!--В перигелии-- >
</PLANET>
</PLANETS>
Предположим теперь, что вам нужно выбрать определенную планету, например, Венеру (Venus). Такая проверка не пройдет, потому что NAME
вернет набор узлов из всех дочерних элементов <NAME>
контекстного узла, а так как у каждой планеты есть элемент <NAME>
со значением «Venus», такое условие всегда будет истиной:
<xsl:template match='PLANET'>
<xsl:if test='NAME='Venus''>
<TR>
<TD><xsl:value-of select='NAME'/></TD>
<TD><xsl:apply-templates select='MASS'/></TD>
<TD><xsl:apply-templates select='RADIUS'/></TD>
<TD><xsl:apply-templates select='DAY'/></TD>
</TR>
</xsl:if>
</xsl:template>
Для того чтобы проверить первый элемент <NAME>
в каждом элементе <PLANET>
, можно воспользоваться функцией string
, поскольку она возвращает не набор узлов, а строку:
<?xml version='1.0'?>
<xsl:stylesheet version='1.0'
xmlns:xsl='http://www w3.org/1999/XSL/Transform'>
<xsl:template match='/PLANETS'>
<HTML>
.
.
.
</HTML>
</xsl:template>
<xsl:template match='PLANET'>
<xsl:if test='string(NAME)='Venus''>
<TR>
<TD><xsl:value-of select='NAME'/></TD>
<TD><xsl:apply-templates select='MASS'/></TD>
<TD><xsl:apply-templates select='RADIUS'/></TD>
<TD><xsl:apply-templates select='DAY'/></TD>
</TR>
</xsl:if>
</xsl:template>
<xsl:template match='MASS'>
<xsl:value-of select='.'/>
<xsl:text> </xsl:text>
<xsl:value-of select='@UNITS'/>
</xsl:template>
.
.
.
<xsl:template match='DAY'>
<xsl:value-of select='.'/>
<xsl:text> </xsl:text>
<xsl:value-of select='@UNITS'/>
</xsl:template>
Конечно, если нужно только выбрать первый дочерний элемент <NAME>
контекстного узла, проще воспользоваться NAME[1]
.