создаст в выходящем дереве текстовый узел со значением "
дом
".
Функции множеств узлов
Функции last и position
number last
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
Подсчитаем общее количество элементов в документе: