<xsclass="underline" stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsclass="underline" template match="home">
<a href="http://www.xsltdev.ru">www.xsltdev.ru</a>
</xsclass="underline" template>
</xsclass="underline" stylesheet>
Для того чтобы использовать внешний шаблон, основное преобразование должно импортировать его при помощи xsclass="underline" import и применять посредством xsclass="underline" apply-imports.
<xsclass="underline" stylesheet
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
version="1.0">
<xsclass="underline" import href="home.xsl"/>
<xsclass="underline" template match="home">
<xsclass="underline" text>Visit </xsclass="underline" text>
<xsclass="underline" apply-imports/>
</xsclass="underline" template>
</xsclass="underline" stylesheet>
Элемент xsclass="underline" apply-imports нельзя использовать в блоках xsclass="underline" for-each и при вычислении глобальных переменных. Дело в том, что при обработке xsclass="underline" apply-imports процессор применяет импортируемые правила в соответствии с текущим шаблоном. Текущий шаблон — это то самое правило, которое процессор выполняет при обработке элемента xsclass="underline" apply-templates. При вычислении глобальных переменных и обработке блоков xsclass="underline" for-each текущее правило становится пустым, и, соответственно, вызов xsclass="underline" apply-imports вызовет ошибку.
Элемент xsclass="underline" apply-imports применяет шаблоны точно так же, как и элемент xsclass="underline" apply-templates, но при этом он имеет две особенности.
□ Шаблоны, определенные в основном преобразовании, применяться не будут, поскольку xsclass="underline" apply-imports применяет только импортированные правила.
□ Элемент xsclass="underline" apply-imports применяет только те правила, режим (mode) которых совпадает с режимом текущего шаблона.
В текущей версии XSLT xsclass="underline" apply-imports не может вызывать импортированные именованные шаблоны.
Для того чтобы лучше понять, зачем нужна такая сложная схема импорта, проведем аналогию с объектно-ориентированным программированием. Если рассматривать правила преобразований как методы классов, то импорт преобразований будет ни чем иным, как наследованием — все методы (шаблоны) класса-потомка (импортируемого преобразования) будут доступны в классе-наследнике (импортирующем преобразовании). При этом класс-наследник может переопределить методы класса потомка (шаблоны основного преобразования имеют порядок импорта старше, чем шаблоны импортированного преобразования). В этой схеме использование элемента xsclass="underline" apply-imports будет равносильно вызову метода родительского класса вместо переопределенного метода класса потомка.
Приведем пример Java-классов, которые будут аналогичны преобразованиям home.xsl и base.xsl.
public class home {
public String home() {
return "<a href=\"http://www.xsltdev.ru\">www.xsltdev.ru</a>";
}
}
public class base extends home {
public String home() {
return ("Visit " + super.home());
}
}
В этом примере вызов родительского метода super.home() соответствует применению элементом xsclass="underline" apply-imports импортированного шаблона.
Тело шаблона
Фактически, элемент xsclass="underline" template, определяющий шаблонное правило, задает не более чем условия, при которых это правило должно выполняться. Конкретные же действия и инструкции, которые должны быть исполнены, определяются содержимым элемента xsclass="underline" template и составляют тело шаблона.
Тело следующего шаблона (выделенное полужирным шрифтом):
<xsclass="underline" template match="page">
<body>
<xsclass="underline" value-of select="."/>
</body>
Комментарии
<xsclass="underline" copy-of select="comment()"/>
</xsclass="underline" template>
состоит из литерального элемента body, текстового узла и элемента xsclass="underline" copy-of. При выполнении этого шаблона элемент body будет выведен как есть (при этом содержимое его будет вычислено); текстовый узел будет скопирован в выходящее дерево; элемент xsclass="underline" copy-of будет заменен множеством дочерних комментариев текущего узла.
Следует заметить, что текстовый узел в данном случае состоит не только из строки "Комментарии". Он включает также все пробельные символы и символы переноса строки.
Тело шаблона может быть также и пустым. В этом случае результат обработки узлов, соответствующих этому шаблону будет пустым. Например, если в преобразовании содержится шаблон вида
<xsclass="underline" template match="comment()"/>
то каждый раз, встретив узел комментария и обрабатывая его этим правилом, процессор будет получать пустой результат. Таким образом, используя пустые шаблоны совместно с идентичным преобразованием можно добиться эффекта удаления определенных узлов из шаблона, как это было показано ранее в этой главе.
Тело шаблона может содержать любые текстовые узлы, комментарии, инструкции по обработке и литеральные элементы результата при условии, что не будет нарушен синтаксис XML-документа. Тело шаблона может также содержать следующие элементы XSLT, называемые также инструкциями (не путать с инструкциями по обработке):
□ xsclass="underline" apply-imports;
□ xsclass="underline" apply-templates;
□ xsclass="underline" attribute;
□ xsclass="underline" call-template;
□ xsclass="underline" choose;
□ xsclass="underline" comment;
□ xsclass="underline" copy;
□ xsclass="underline" copy-of;
□ xsclass="underline" element;
□ xsclass="underline" fallback;
□ xsclass="underline" for-each;
□ xsclass="underline" if;
□ xsclass="underline" message;
□ xsclass="underline" number;
□ xsclass="underline" param;
□ xsclass="underline" processing-instruction;
□ xsclass="underline" text;
□ xsclass="underline" value-of;
□ xsclass="underline" variable.
Элементы xsclass="underline" param и xsclass="underline" variable, которые входят в этот список в преобразовании, могут быть как элементами верхнего уровня, так и инструкциями. В первом случае они определяют глобальные параметры и переменные, во втором — локальные.
Если элементы xsclass="underline" param используются для определения локальных переменных, они должны быть первыми дочерними элементами xsclass="underline" template, то есть, строго говоря, определение
<xsclass="underline" template name="page">
<xsclass="underline" text>Text</xsclass="underline" text>
<xsclass="underline" param name="foo"/>
</xsclass="underline" template>
будет некорректным. На самом деле многие процессоры игнорируют эту ошибку, вполне разумно считая, что ничего смертельного в ней нет. Но, конечно, лучше использовать стандартный вариант: