XSLT — страница 69 из 124

Следующие функции XPath работают с наборами узлов:

• 

count(node-set)
. Возвращает число узлов в наборе узлов;

• 

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

• 

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

• 

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

• 

name(node-set)
. Возвращает полное имя первого узла в наборе узлов;

• 

namespace-uri(node-set)
. Возвращает URI пространства имен первого узла в наборе узлов;

• 

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

count()

Функция

count
подсчитывает число узлов в наборе узлов

number count(node-set)

Функция принимает набор узлов и возвращает количество узлов в этом наборе. Следующий пример применения функции

count
мы уже рассматривали в главе 6. В этом случае набор узлов образован из всех элементов
в
planets.xml
; я получил его при помощи пути расположения «
//PLANET
»:

 xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">



Заметьте, что в приведенном ниже результате каждый элемент

обладает и атрибутом
number
, и атрибутом
total
, а атрибут
total
хранит общее количество элементов
, которое было найдено при помощи
count
:

Mercury

.0553

58.65

1516

.983

43.4

Venus

.815

116.75

3716

.943

66.8

Earth

1

1

2107

1

128.4

id()

Функция id возвращает набор узлов, в котором все узлы имеют такой же ID, как и переданный в эту функцию. Функция применяется следующим образом:

node-set id(id-value)

В функцию передается значение ID, и она возвращает набор узлов с узлами, имеющими этот ID. Заметьте, что вы можете задать несколько ID, разделенных символами-разделителями, и функция вернет набор узлов с элементами, обладающими этими ID.

Следующее правило-пример выбирает текст всех элементов с ID «favorite»:

Отметьте также, что вы должны объявлять значения ID как в DTD или схеме. Объявление DTD для

planets.xml
, объявляющее ID с именем
id
и присваивающее ему значение «favorite», может выглядеть так:

 id ID #REQUIRED>

]>

Mercury

.0553

58.65

1516

.983

43.4

 .

 .

 .

Заметьте, что некоторые процессоры XSLT не могут осуществлять выборку по ID, потому что они не читают объявления DTD и схему XML. Это одна из задач, которые призван решить XSLT 2.0 — сделать доступной информацию об идентификаторах.

last() 

Функция

last
возвращает число узлов в наборе узлов, поэтому ее значение равно позиции последнего узла. Она применяется следующим образом:

number last()

Следующий пример из главы 5 последовательно выводит в результирующий документ имена планет. Однако я хочу, чтобы выводилось не просто «The first three planets are: Mercury Venus Earth» (первые три планеты: Меркурий Венера Земля), a «The first three planets are: Mercury, Venus, and Earth.» Необходимые знаки пунктуации можно добавить, определяя элемент, с которым мы работаем, при помощи функции position и проверяя позицию при помощи

:

 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

</code></pre></p><p><pre><code>    The Planets</code></pre></p><p><pre><code>

    The first three planets are:


, 

and 

.

Вот результат:

</code></pre></p><p><pre><code>  The Planets</code></pre></p><p><pre><code>

  The first three planets are: Mercury, Venus, and Earth.

local-name()

Функция

local-name
возвращает локальное (неполное) имя узла. Функция применяется следующим образом:

string local-name(node-set?)

В функцию передается набор узлов с единственным узлом, и функция возвращает локальное имя этого узла. (Если в наборе узлов больше, чем один узел, берется только первый.) Если не передать никаких узлов, функция вернет локальное имя контекстного узла.

В следующем примере я создаю новые элементы при помощи

и определяю имена контекстных узлов при помощи
local-name
:

 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

name() 

Функция

name
аналогична
local-name
, за тем исключением, что она возвращает полностью определенное имя узла. Вот как следует применять эту функцию:

string name(node-set?)

namespace-uri()

Функция

namespace-uri
возвращает строку, содержащую URI пространства имен в расширенном имени узла. Как правило, это URI в объявлении пространства имен, установленное при помощи атрибутов
xmlns
или
xmlns:prefix
. Функция применяется следующим образом (заметьте, что эту функцию можно применять только к элементам или атрибутам, результатом обработки остальных узлов будет пустая строка):

string namespace-uri(node-set?)

Например, в

planets.xml
я могу добавить пространство имен «star» (звезда):

 href="planets.xsl"?>

Mercury

.0553

58.65

1516

.983

43.4

Venus

.815

116.75

3716

.943

66.8

  .

  .

  .

И я могу найти URI этого пространства имен в таблице стилей при помощи

namespace-uri
:

 xmlns:xsl="http://www.w3.org/1999/XSL/Transform"

 xmlns:star="http://www.starpowder.com">

 .

 .

 .

Вот результат:

http://starpowder.com

position()

Функция

position
возвращает позицию контекстного узла:

number position()

С этой функцией мы встречались на протяжении всей книги. Такой пример вы уже видели раньше в этой главе, в нем для создания предложения «The first three planets are: Mercury, Venus, and Earth.» используются функции

last
и
position
:

 xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

</code></pre></p><p><pre><code>    The Planets</code></pre></p><p><pre><code>

    The first three planets are:


, 

and 

.

Полученный результат:

</code></pre></p><p><pre><code>  The Planets</code></pre></p><p><pre><code>

  The first three planets are: Mercury, Venus, and Earth.

Функции XPath для работы со строками