=> Главная База Знаний Xslt Предикаты: наборы узлов


Предикаты: наборы узлов

Предикаты: наборы узлов

Набор узлов (node set), как понятно из названия, представляет собой просто совокупность узлов (и может содержать только один узел). Выражение

child::PLANET
возвращает набор узлов, состоящий из всех элементов
<PLANET>
. Выражение
child::PLANET/child::NAME
возвращает список узлов, состоящий из всех элементов
<NAME>
, дочерних по отношению к элементам
<PLANET>
. Для выбора узла или узлов из набора узлов воспользуйтесь следующими функциями для работы с наборами узлов в предикатах:

• 

last()
. Возвращает количество узлов в наборе узлов;

• 

position()
. Возвращает позицию контекстного узла в контекстном наборе узлов (начиная с 1);

• 

count(node-set)
. Возвращает количество узлов в наборе. Если опустить
node-set
, функция будет применена к контекстному узлу;

• 

id(string ID)
. Возвращает набор узлов, содержащий элемент с ID, удовлетворяющим переданной функции строке, или пустой набор узлов, если такой элемент отсутствует. Можно перечислить несколько идентификаторов, разделенных символами-разделителями, — тогда функция вернет набор узлов, состоящий из элементов с этими идентификаторами;

• 

local-name(node-set)
. Возвращает локальное имя первого узла в наборе узлов. Если опустить
node-set
, функция будет применена к контекстному узлу;

• 

namespace-uri(node-set)
. Возвращает URI пространства имен первого узла в наборе узлов. Если опустить
node-set
, функция будет применена к контекстному узлу;

• 

name(node-set)
. Возвращает полностью определенное имя первого узла в наборе узлов. Если опустить
node-set
, функция будет применена к контекстному узлу.

В листинге 4.6 я перенумеровал элементы в выходном документе при помощи функции

position()
.

Листинг 4.6. Применение функции position

<?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>

     The Planets

    </TITLE>

   </HEAD>

   <BODY>

    <xsl:apply-templates select="PLANET"/>

   </BODY>

  </HTML>

 </xsl:template>


 <xsl:template match="PLANET">

  <P>

   <xsl:value-of select="position()"/>

   <xsl:text> </xsl:text>

   <xsl:value-of select="NAME/>

  </P>

 </xsl:template>

</xsl:stylesheet>

Вот результат. Как видите, планеты перенумерованы:

<HTML>

 <HEAD>

  <TITLE>

   The Planets

  </TITLE>

 </HEAD>

 <BODY>

  <P>

   1. Mercury

  </P>

  <P>

   2. Venus

  </P>

  <P>

   3. Earth

  </P>

 </BODY>

</HTML>

Можно также применять функции для работы с наборами узлов в предикатах, как, например,

PLANET[position()=last()]
, выбирающая последнего ребенка
<PLANET>
контекстного узла