Технически правильный ответ Дуга, и он поставил меня на правильный путь поиска функции расширения набора узлов (спасибо!). Разница лишь в том, что я использую процессор Xalan-java вместо Microsoft. Вот рабочий (чрезвычайно простой) пример того, чего я пытался достичь:
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xalan="http://xml.apache.org/xalan" exclude-result-prefixes="xalan">
<xsl:output method="html" encoding="UTF-8" omit-xml-declaration="yes"/>
<xsl:template match="label">
<b><xsl:value-of select="." /></b>
</xsl:template>
<xsl:template name="someTemplate">
<root>
<label>hey there</label>
</root>
</xsl:template>
<xsl:template match="/">
<xsl:variable name="gen">
<xsl:call-template name="someTemplate" />
</xsl:variable>
<xsl:apply-templates select="xalan:nodeset($gen)//label" />
</xsl:template>
</xsl:stylesheet>
Основная идея состоит в том, что вы создаете переменную (здесь называемую «gen»), которая вызывает шаблон («someTemplate»), который создает некоторый xml. Затем это xml-дерево обрабатывается функцией xalan: nodeset. Здесь я запускаю apply-templates и обрабатываю все поля меток, которые совпадают с моим шаблоном меток и создает метку, выделенную жирным шрифтом.
Причина, по которой я все это делаю, заключается в том, что я работаю над веб-приложением, в котором весь контент на каждой странице определяется в XML, а затем обрабатывается с использованием XSL. Это прекрасно работает, пока вы не захотите заполнить части страницы результатами вызова AJAX, потому что тогда вам нужно либо создать новый html внутри функции javascript из возвращенного XML (грязный и плохой), либо передать XML-ответ AJAX через XSL-преобразование на стороне сервера и просто вставьте результат xhtml на страницу.
В моей ситуации, поскольку я описываю каждую веб-страницу в XML, я создал простые, общие элементы, которые имеют «типы». Мои элементы - это «блок», то есть любой блок контента. Блок может иметь подузлы, такие как «кнопка» (которая является ссылкой или кнопкой), «список» (который состоит из нескольких блоков), «изображение» или «вход». Детали схемы не имеют значения; Я просто хотел показать, что моя XML-схема очень проста и универсальна.
С другой стороны, ответ AJAX XML, который я получаю для обновления / создания страницы, создается сторонней организацией, которая не использует мою схему. Напротив, каждый предоставляемый ими сервис возвращает очень специфический XML для каждого уникального запроса. По этой причине мне нужен способ преобразовать их очень специфический XML в мой очень общий XML, чтобы я мог преобразовать его, используя один набор шаблонов XSL.
Вот пример одного из шаблонов xsl, которые я сейчас использую, который преобразует ответ AJAX и преобразует их конкретный XML в мой общий XML.
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xalan="http://xml.apache.org/xalan" exclude-result-prefixes="xalan">
<xsl:output method="html" encoding="UTF-8" omit-xml-declaration="yes"/>
<!-- base.xsl includes a generic template that matches all blocks and routes
to the needed template based on the block type -->
<xsl:include href="base.xsl" />
<xsl:template name="templateForAJAXResponse">
<block>
<type>list</type>
<list>
<type>itemBrowser</type>
<xsl:for-each select="/response/items/item">
<block>
<type>button</type>
<button>
<type>imageButton</type>
<href>something.action</href>
<src><xsl:value-of select="src" /></src>
<title><xsl:value-of select="name" /></title>
</button>
</block>
</xsl:for-each>
</list>
</block>
</xsl:template>
<xsl:template match="/">
<xsl:variable name="gen">
<xsl:call-template name="templateForAJAXResponse" />
</xsl:variable>
<div>
<xsl:apply-templates select="xalan:nodeset($gen)/block" />
</div>
</xsl:template>
</xsl:stylesheet>