</part>
<part>
<value>D</value>
<value>E</value>
<value>F</value>
</part>
</data>
<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>
Модель преобразования
Во вводной главе мы говорили, что преобразования в XSLT являются наборами шаблонных правил, каждое из которых обрабатывает определенный фрагмент входящего документа с тем, чтобы сгенерировать фрагмент выходящего документа.
Контекст преобразования
При выполнении преобразования каждая из его инструкций, каждый из элементов обрабатывается в некотором
Контекст преобразования тесно связан с контекстом вычисления выражений:
□ текущий узел контекста преобразования соответствует контекстному узлу вычисления выражений;
□ позиция текущего узла в текущем обрабатываемом множестве соответствует позиции контекста вычисления выражений;
□ размер текущего множества узлов соответствует размеру контекста вычисления выражений.
Контекст преобразования может изменяться только двумя элементами — xsl:apply- templates
и xsl:for-each
. Каждый из этих элементов вычисляет множество узлов, которое становится текущим и затем обрабатывается. После этого контекст преобразования восстанавливается до того состояния, каким он был перед обработкой.
Изменения контекста могут быть продемонстрированы на следующем примере.
<summer>
<month>June</month>
<month>July</month>
<month>August</month>
</summer>
Этому документу соответствует следующее дерево (рис. 3.19):
Рис. 3.19. Дерево входящего документа
<xsl:stylesheet
version='1.0'
xmlns:xsl='http://www.w3.org/1999/XSL/Transform'>
<xsl:template match='/'>
<html>
<head>
<title>Summer</title>
</head>
<body>
<xsl:apply-templates select='summer'/>
</body>
</html>
</xsl:template>
<xsl:template match='summer'>
<table>
<tr>
<xsl:apply-templates select='month'/>
</tr>
</table>
</xsl:template>
<xsl:template match='month'>
<td>
<xsl:value-of select='.'/>
</td>