Шрифт:
В листинге 7.4 добавлены атрибуты
AUTHOR
со значением «Steve» в весь документ. Листинг 7.4. planets.xml с атрибутами AUTHOR
<?xml version=1.0"?>
<?xml-stylesheet type="text/xml" href="#"?>
<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
Применение оси descendant
Ось
descendant
(потомок) содержит всех потомков контекстного узла. Заметьте, что сюда не входят атрибуты или узлы пространств имен, поскольку они не считаются дочерними узлами. В следующем примере (листинг 7.6) демонстрируется работа с этой осью. На этот раз я хочу добавить примечание к элементу
<PLANET>
Меркурия: <INFO>Sorry, Mercury has blown up and is no longer available.</INFO>
(Извините, но Меркурий взорвался и больше не доступен.). Чтобы найти Меркурий, мне достаточно только проверить, имеет ли какой-либо потомок элемента <PLANET>
строковое значение «Mercury
», что я сделаю при помощи выражения XPath внутри предиката выбора. Листинг 7.6. Применение оси descendant
<?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="PLANET[descendant::*='Mercury']">
<xsl:copy>
<xsl:apply-templates select="@*|node"/>
<INFO>Sorry. Mercury has blown up and is no longer available.</INFO>