Контекст вычисления выражений

Контекст вычисления выражений

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

Контекст преобразования состоит из узла, называемого контекстным узлом, двух целых чисел — размера контекста и позиции в контексте, объявлений переменных, объявлений пространств имен и библиотеки функций.

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

Пример

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

<element

 name="имя элемента"

 context-position="позиция в контексте"

 context-size="размер контекста"

 string-value="строковое значение">

 ...

</element>

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

<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()}"

   context-position="{position()}"

   context-size="size()"

   string-value="{.}">

   <xsl:apply-templates select="*"/>

  </element>

 </xsl:template>

</xsl:stylesheet>

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

<data>

 <part>

  <item>A</item>

  <item>B</item>

  <item>C</item>

 </part>

 <part>

  <value>D</value>

  <value>E</value>

  <value>F</value>

 </part>

</data>

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

<element name="data"

 context-position="1" context-size="1" string-value="ABCDEF">

 <element name="part"

  context-position="1" context-size="2" string-value="ABC">

 <element name="item"

  context-position="1" context-size="3" string-value="A"/>

 <element name="item"

  context-position="2" context-size="3" string-value="B"/>

 <element name="item"

  context-position="3" context-size="3" string-value="C"/> </element>

 <element name="part"

  context-position="2" context-size="2" string-value="DEF">

 <element name="value"

  context-position="1" context-size="3" string-value="D"/>

 <element name="value"

  context-position="2" context-size="3" string-value="E"/>

 <element name="value"

  context-position="3" context-size="3" string-value="F"/>

 </element>

</element>