Чтение онлайн

ЖАНРЫ

Технология XSLT

Валиков Алексей Н.

Шрифт:

number position

Функция

last
возвращает текущий размер контекста — число, которое показывает, сколько узлов находится в обрабатываемом в данный момент множестве.

Функция

position
возвращает позицию контекста — число, показывающее порядковый номер контекстного узла в обрабатываемом множестве.

Пример

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

<element name="..." position="...">

 ...

</element>

где

атрибут
name
будет содержать имя, a
position
— через дробь позицию элемента в контексте и размер контекста.

Листинг 6.7. Входящий документ

<а>

 <b/>

 <c/>

 <d>

<e/>

<f/>

 </d>

</a>

Листинг 6.8. Преобразование

<xsl:stylesheet

 version="1.0"

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

 <xsl:output indent="yes"/>

 <xsl:strip-space elements="*"/>

 <xsl:template match="*">

<element name="{name}" pos="{position}/{last}">

<xsl:apply-templates/>

</element>

 </xsl:template>

</xsl:stylesheet>

Листинг 6.9. Выходящий документ

<element name="a" pos="1/1">

 <element name="b" pos="1/3"/>

 <element name="c" pos="2/3"/>

 <element name="d" pos="3/3">

<element name="e" pos="1/2"/>

<element name="f" pos="2/2"/>

 </element>

</element>

Отметим, что если бы мы не удаляли лишние пробельные символы во входящем документе при помощи элемента

xsl:strip-space
, в контексте преобразования учитывались бы также и текстовые узлы, которые им соответствуют. Выходящий документ без этого элемента имел бы следующий вид:

<element name="a" pos="1/1">

 <element name="b" pos="2/7"/>

 <element name="c" pos="4/7"/>

 <element name="d" pos="6/7">

<element name="e" pos="2/5"/>

<element name="f" pos="4/5"/>

 </element>

</element>

Функция count

number count(node-set)

Функция

count
возвращает число узлов, которое входит во множество, переданное ей в качестве аргумента.

Пример

Для того чтобы подсчитать количество всех элементов второго уровня, можно воспользоваться выражением

count(/*/*)
. Например, для входящего документа из примера к функциям
last
и
position
(листинг 6.7) это выражение примет значение
3
.

Приведем несколько других примеров, используя тот же документ.

Покажем, что дерево документа на листинге 6.7 имеет ровно один корневой узел:

count(/)
1

и ровно один элемент, находящийся в корне:

count(/*)
1

Подсчитаем количество текстовых узлов, принадлежащих элементу

a
(это те самые пробельные текстовые узлы, которые были удалены элементом
xsl:strip-space
):

count(/a/text)
4

Подсчитаем общее количество элементов в документе:

count(//*)
6

Функции local-name, namespace-uri и name

string local-name(node-set?)

string namespace-uri(node-set?)

string name(node-set?)

Функция

local-name
возвращает локальную часть имени первого в порядке просмотра документа узла множества, переданного ей в качестве аргумента. Эта функция выполняется следующим образом.

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

□ Если аргументом является пустое множество, функция возвращает пустую строку.

□ Если первый в порядке просмотра документа узел переданного множества не имеет расширенного имени, функция возвращает пустую строку.

□ В противном случае функция возвращает локальную часть расширенного имени первого в порядке просмотра документа узла переданного множества.

Функция

namespace-uri
работает совершенно аналогично функции
local-name
за тем исключением, что возвращает не локальную часть расширенного имени, a URI пространства имен этого узла. Эта функция выполняется следующим образом.

□ Если аргумент опущен, его значением по умолчанию является множество, содержащее единственный контекстный узел.

□ Если аргументом является пустое множество, функция возвращает пустую строку.

□ Если первый в порядке просмотра документа узел переданного множества не имеет расширенного имени, функция возвращает пустую строку.

Поделиться с друзьями: