Расширяя ответ Иамона ...
В случае XSLT 1.0 или 2.0 вы должны начать с помещения промежуточного (предварительно обработанного) результата в элемент , объявленный либо глобально (верхний уровень), либо локально (внутри шаблона). ).
<xsl:variable name="intermediate-result">
<!-- code to create pre-processed result, e.g.: -->
<xsl:apply-templates mode="pre-process"/>
</xsl:variable>
В XSLT 2.0 значение переменной $ промежуточный результат представляет собой последовательность узлов, состоящую из одного узла документа (в XSLT / XPath 1.0 называлась «корневым узлом»). Вы можете обращаться к нему и использовать его так же, как и к любой другой переменной, например, select = "$ промежуточный-результат / документ"
Но в XSLT 1.0 значение переменной $ промежуточный результат не является набором узлов первого класса. Вместо этого это называется фрагментом дерева результатов. Он ведет себя как набор узлов, содержащий один корневой узел, но вы ограничены в том, как вы можете его использовать. Вы можете скопировать его и получить его строковое значение, но вы не можете развернуть его с помощью XPath, как в select = "$ промежуточный-результат / документ". Чтобы сделать это, вы должны сначала преобразовать его в набор узлов первого класса, используя функцию расширения вашего процессора node-set (). В Saxon 6.5, libxslt и 4xslt вы можете использовать exsl: node-set () (как в ответе Eamon). В MSXML вам нужно использовать msxsl: node-set (), где xmlns: msxsl = "urn: schemas-microsoft-com: xslt", а в Xalan я считаю, что это называется xalan: nodeset () (без дефис, но вам придется Google для URI пространства имен). Например: select = "exsl: node-set ($ промежуточный-результат) / doc"
XSLT 2.0 просто упразднил фрагмент результирующего дерева, сделав ненужным node-set ().