действительно нужна. Пусть, например, по какой-то причине вы поместили в каждый элемент <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].

Вы читаете XSLT
Добавить отзыв
ВСЕ ОТЗЫВЫ О КНИГЕ В ИЗБРАННОЕ

0

Вы можете отметить интересные вам фрагменты текста, которые будут доступны по уникальной ссылке в адресной строке браузера.

Отметить Добавить цитату