Тело шаблона
Тело шаблона
Фактически, элемент xsl:template, определяющий шаблонное правило, задает не более чем условия, при которых это правило должно выполняться. Конкретные же действия и инструкции, которые должны быть исполнены, определяются содержимым элемента xsl:template и составляют тело шаблона.
Пример
Тело следующего шаблона (выделенное полужирным шрифтом):
<xsl:template match="page">
<body>
<xsl:value-of select="."/>
</body>
Комментарии
<xsl:copy-of select="comment()"/>
</xsl:template>
состоит из литерального элемента body, текстового узла и элемента xsl:copy-of. При выполнении этого шаблона элемент body будет выведен как есть (при этом содержимое его будет вычислено); текстовый узел будет скопирован в выходящее дерево; элемент xsl:copy-of будет заменен множеством дочерних комментариев текущего узла.
Следует заметить, что текстовый узел в данном случае состоит не только из строки "Комментарии". Он включает также все пробельные символы и символы переноса строки.
Тело шаблона может быть также и пустым. В этом случае результат обработки узлов, соответствующих этому шаблону будет пустым. Например, если в преобразовании содержится шаблон вида
<xsl:template match="comment()"/>
то каждый раз, встретив узел комментария и обрабатывая его этим правилом, процессор будет получать пустой результат. Таким образом, используя пустые шаблоны совместно с идентичным преобразованием можно добиться эффекта удаления определенных узлов из шаблона, как это было показано ранее в этой главе.
Тело шаблона может содержать любые текстовые узлы, комментарии, инструкции по обработке и литеральные элементы результата при условии, что не будет нарушен синтаксис XML-документа. Тело шаблона может также содержать следующие элементы XSLT, называемые также инструкциями (не путать с инструкциями по обработке):
? xsl:apply-imports;
? xsl:apply-templates;
? xsl:attribute;
? xsl:call-template;
? xsl:choose;
? xsl:comment;
? xsl:copy;
? xsl:copy-of;
? xsl:element;
? xsl:fallback;
? xsl:for-each;
? xsl:if;
? xsl:message;
? xsl:number;
? xsl:param;
? xsl:processing-instruction;
? xsl:text;
? xsl:value-of;
? xsl:variable.
Элементы xsl:param и xsl:variable, которые входят в этот список в преобразовании, могут быть как элементами верхнего уровня, так и инструкциями. В первом случае они определяют глобальные параметры и переменные, во втором — локальные.
Если элементы xsl:param используются для определения локальных переменных, они должны быть первыми дочерними элементами xsl:template, то есть, строго говоря, определение
<xsl:template name="page">
<xsl:text>Text</xsl:text>
<xsl:param name="foo"/>
</xsl:template>
будет некорректным. На самом деле многие процессоры игнорируют эту ошибку, вполне разумно считая, что ничего смертельного в ней нет. Но, конечно, лучше использовать стандартный вариант:
<xsl:template name="page">
<xsl:param name="foo"/>
<xsl:text>Text</xsl:text>
</xsl:template>