Книга: XSLT

Применение оси ancestor-or-self

Применение оси ancestor-or-self

Ось ancestor-or-self содержит всех предков контекстного узла, а также сам контекстный узел. Это означает, помимо прочего, что такая ось всегда содержит корневой узел.

В листинге 7.4 добавлены атрибуты AUTHOR со значением «Steve» в весь документ.

Листинг 7.4. planets.xml с атрибутами AUTHOR

<?xml version=1.0"?>
<?xml-stylesheet type="text/xml" href="planets.xsl"?>
<PLANETS AUTHOR="Steve" >
 <PLANET AUTHOR="Steve" >
  <NAME>Mercury</NAME>
  <MASS AUTHOR="Steve" 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 AUTHOR="Steve">
  <NAME>Venus</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>
  <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>

Предположим теперь, что я хочу перечислить по имени всех предков элементов <MASS>, имеющих атрибут AUTHOR, а также текущий элемент <MASS>, если у него есть атрибут AUTHOR. Это можно сделать при помощи оси ancestor-or-self и функции local-name (листинг 7.5).

Листинг 7.5. Применение оси ancestor-or-self

<?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="MASS">
  <xsl:for-each select="ancestor-or-self::*[@AUTHOR]">
   <xsl:value-of select="local-name(.)"/>
   <xsl:text> </xsl:text>
  </xsl:for-each>
 </xsl:template>
 <xsl:template match="PLANET">
  <xsl:apply-templates select="MASS"/>
 </xsl:template>
</xsl:stylesheet>

Вот результат; показаны выбранные предки всех трех элементов <MASS>, включая сам элемент <MASS>, при условии, что у него имеется атрибут AUTHOR:

<?xml version="1.0" encoding="UTF-8"?>
PLANETS PLANET MASS
PLANETS PLANET
PLANETS

Оглавление книги


Генерация: 1.768. Запросов К БД/Cache: 3 / 0
поделиться
Вверх Вниз