Валиков Алексей Н.
Шрифт:
'шщъы',
'ьэюя')"/>
<xsl:template name="lower">
<xsl:param name="str"/>
<xsl:value-of select="translate($str, $uppercase, $lowercase)"/>
</xsl:template>
<xsl:template name="upper">
<xsl:param name="str"/>
<xsl:value-of select="translate($str, $lowercase, $uppercase)"/>
</xsl:template>
</xsl:stylesheet>
Использовать этот модуль можно, включив или импортировав его в основное преобразование элементами
xsl:include
или xsl:import
. После этого в основном преобразовании будут доступны переменные lowercase
и uppercase
, которые можно будет использовать в функции translate
и шаблоны с именами lower
и upper
. Использовать функцию
translate
с переменными lowercase
и uppercase
можно следующим образом: translate('Дом', $uppercase, $lowercase)
→ 'дом'
translate('Дом', $lowercase, $uppercase)
→ 'ДОМ'
Именованные шаблоны можно вызывать элементом
xsl:call-template
, передавая параметр при помощи xsl:with-param
. Например, следующий фрагмент шаблона ...
<xsl:call-template name="lower">
<xsl:with-param name="str" select="'Дом'"/>
</xsl:call-template
> ...
создаст в выходящем дереве текстовый узел со значением "
дом
". Функции множеств узлов
Функции 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"/>