Перейти к содержанию

position()

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

Синтаксис

1
number position()

Описание и примеры

Пример

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

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

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

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

1
2
3
4
5
6
7
8
<a>
  <b />
  <c />
  <d>
    <e />
    <f />
  </d>
</a>

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

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
<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. Выходящий документ

1
2
3
4
5
6
7
8
<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, в контексте преобразования учитывались бы также и текстовые узлы, которые им соответствуют. Выходящий документ без этого элемента имел бы следующий вид:

1
2
3
4
5
6
7
8
<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>

Ссылки

Комментарии