XSL:templates
Синтаксис
Примерчики
Вызов apply-templates
Почему?
Корректный вызов
Использование именованных…
Примерчик
Рекурсии
Рекурсивный цикл
166.00K
Category: programmingprogramming

XSL:templates

1. XSL:templates

Преобразование XSLT состоит не из последовательности
действий, а из набора правил, каждое из которых вообще
говоря обрабатывает свою часть XML-документа. Почему?
Структуры XML-документов (даже в одной логической схеме)
могут быть настолько разнообразны, что отследить в какой
последовательности выполнять те или иные действия бывает
достаточно сложно, тем более что само преобразование
является разовым. Наличие или отсутствие элементов,
атрибутов итп ведут в этом случае к сильному ветвлению,
усложнению условными операторами, циклами итп.
Однако, не понимая, что нужно сделать, чтобы преобразовать
документ целиком, мы хорошо можем понимать, как
обрабатывать отдельные его части.
Т.о., XSLT создан как декларативный язык, т.е. в нем
декларируются правила преобразования. Каждое из этих
правил может вызывать другие правила, тем самым
обеспечивая обработку сложного документа.

2. Синтаксис

Основой правила является элемент xsl:template
<xsl:template match=“паттерн” name=“имя” >
Тело шаблона
</xsl:template>
Атрибут match – задает паттерн, т.е. образец узлов xml-дерева,
для преобразования которых следует применять этот шаблон.
Шаблоны с атрибутом match вызываются инструкцией
xsl:apply-templates
Атрибут name – задает имя шаблону, создает именованный
шаблон. Именованные шаблоны могут вызываться только по
имени и не связаны с контекстом xml-документа. Вызывается
инструкцией xsl:call-template

3. Примерчики

<xsl:template match=“bold”>
<b><xsl:value-of select=“.”/></b>
</xsl:template>
В этом шаблоне (правиле) атрибут match говорит о том, что оно должно
использоваться для обработки элементов bold – они будут заменяться
на тэги <b>
<xsl:template name=“bold”>
<b><xsl:value-of select=“.”/></b>
</xsl:template>
Этот шаблон не будет обрабатывать какие-либо узлы по команде
xsl:apply-templates, и может быть вызвано только по имени.
Атрибуты match и/или name являются
обязательными

4. Вызов apply-templates

Возьмем исходный xml-код следующего содержания:
<mydata><bold>текст</bold></mydata>
Напишем шаблоны, изменяющие элементы <mydata> и <bold> на
<p> и <b>, в результате получим:
<xsl:stylesheet ...>
<xsl:template match=“bold”>
<b><xsl:value-of select=“.”/></b>
</xsl:template>
<xsl:template match=“mydata”>
<b><xsl:value-of select=“.”/></b>
</xsl:template>
</xsl:stylesheet>
НО! После применения вместо ожидаемого
<p><b>текст</b></p> окажется только <p>текст</p>.

5. Почему?

Логика работы xsl-процессора следующая:
1.
2.
3.
4.
5.
Обработка начинается с корневого узла, выбирается шаблон,
соответствующий этому узлу.
По умолчанию шаблонное правило корневого элемента
обрабатывает все дочерние элементы.
Для элемента mydata у нас имеется шаблон, который и будет
применен.
В соответствии с этим шаблоном процессор создаст элемент <p>
и включит в него строковое значение выражения “.”.
Строковое значение является конкатенацией (объединением)
всех текстовых потомков. Единственным текстовым потомком
здесь является узел <bold> со значением “текст”. Он то и
выводится в <p>.
На самом деле, мы просто забыли вызвать обработку
шаблонов с помощью xsl:apply-templates

6. Корректный вызов

<xsl:stylesheet ...>
<xsl:template match=“bold”>
<b><xsl:value-of select=“.”/></b>
</xsl:template>
<xsl:template match=“mydata”>
<b><xsl:apply_templates/></b>
</xsl:template>
</xsl:stylesheet>
Теперь, обрабатывая корневой элемент mydata, для всех
дочерних элементов будет происходить поиск наиболее
подходящего шаблона, и результат получится верным:
<p><b>текст</b></p>

7. Использование именованных…

Именованные шаблоны не изменяют контекста
преобразования, они, как правило, предназначены для
дополнения результата теми или иными элементами.
Типичным примером удачного использования именованных
шаблонов является дополнение результирующего html-кода
«шапочными» элементами.
<html>
<head>
<title>
...
«шапочные» элементы
</title>
<link…/>
</head>
<body>
...
</body>
</html>

8. Примерчик

<content>Текст</content>
<html>
<head><title>Примерчик</title></head>
<body>Текст</body>
</html>
<xsl:stylesheet ...>
<xsl:template match=“/”>
<html>
<xsl:call-template name=“header”>
<body><xsl:copy-of
select=“content/node()”/></body>
</html>
</xsl:template>
<xsl:template name=“header”>
<head><title>Примерчик</title></head>
</xsl:template>
</xsl:stylesheet>

9. Рекурсии

В программировании рекурсия — вызов функции из неё
же самой, непосредственно (простая рекурсия) или
через другие функции (сложная рекурсия). Количество
вложенных вызовов функции или процедуры называется
глубиной рекурсии.
Преимущество рекурсивного определения объекта
заключается в том, что такое конечное определение
теоретически способно описывать бесконечно большое
число объектов. С помощью рекурсивной программы же
возможно описать бесконечное вычисление, причём без
явных повторений частей программы.
Рекурсии в XSL служат для организации циклов, для
глобальной замены символов итд

10. Рекурсивный цикл

XSL:
<?xml version="1.0"?>
<xsl:stylesheet...>
<xsl:template match="root">
<html><body>
<xsl:call-template name="for">
XML:
<xsl:with-param name="i" select="1"/>
<?xml version="1.0"?>
<xsl:with-param
name="n"
select="5"/>
<?xml-stylesheet type="text/xsl"
href=“a.xsl”
?>
</xsl:call-template>
<root/>
</body></html>
</xsl:template>
<xsl:template name="for">
<xsl:param name="i"/><xsl:param name="n"/>
<xsl:value-of select="$i"/>
<xsl:if test="$i &lt; $n">
<xsl:text>, </xsl:text>
Результат:
<xsl:call-template name="for">
<xsl:with-param name="i" select="$i+1"/>
1, 2, 3, 4, 5
<xsl:with-param name="n" select="$n"/>
</xsl:call-template>
</xsl:if>
</xsl:template>
</xsl:stylesheet>
Рекурсивный цикл
English     Русский Rules