Вот еще один пример фрагмента результирующего дерева. В этом случае я сохраняю элемент буквального результата в переменной
START_HTML
:
<?xml version="1.0"?>
<xsl:stylesheet version="1.1"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html"/>
<xsl:variable name="START_HTML">
<HEAD>
<TITLE>
My page
</TITLE>
</HEAD>
</xsl:variable>
.
.
.
Теперь
я могу использовать этот элемент буквального результата где угодно:
<?xml version="1.0"?>
<xsl:stylesheet version="1.1"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html"/>
<xsl:variable name="START_HTML">
<HEAD>
<TITLE>
My page
</TITLE>
</HEAD>
</xsl:variable>
<xsl:template match="PLANETS">
<HTML>
<xsl:copy-of select="$START HTML"/>
<BODY>
<H1>Welcome to my page</H1>
</BODY>
</HTML>
</xsl:template>
</xsl:stylesheet>
И вот результат:
<HTML>
<HEAD>
<TITLE>
My page
</TITLE>
</HEAD>
<BODY>
<H1>Welcome to my page</H1>
</BODY>
</HTML>
Однако поскольку теперь фрагменты результирующего дерева не допускаются в XSLT 1.1, этот пример работать не будет. Как же тогда сохранить весь элемент буквального результата одновременно с возможностью простого вызова? Вы можете создать именованный шаблон.
Элемент <xsl:call-template>: применение именованных шаблонов
У
элемента
<xsl:template>
есть атрибут
name
, задающий имя шаблона. Предположим, у меня есть элемент буквального результата, состоящий из двух элементов
<BR>
и двух элементов
<HR>
HTML, при помощи которого я создаю в документах HTML вертикальный разделитель:
<BR/>
<HR/>
<BR/>
<HR/>
Тогда я могу создать шаблон с именем «separator» (разделитель), использующий этот элемент буквального результата:
<xsl:template name="separator">
<BR/>
<HR/>
<BR/>
<HR/>
</xsl:template>
Это именованный шаблон — для его создания нужно только присвоить имя атрибуту name элемента
<xsl:template>
.
Заметьте, что этот шаблон не установлен для выбора чего-то конкретного. Для активизации шаблона необходимо вызвать его явно. Для этого служит элемент
<xsl:call-template>
, обладающий только одним атрибутом:
•
name
(обязательный). Имя вызываемого шаблона, устанавливается в
QName
.
Следующий пример демонстрирует применение нашего шаблона «separator», для чего мне нужно было только вызвать его в соответствующих местах: