Книга: 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> контекстного узла

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


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